草庐IT

【MyBatis】Spring整合MyBatis教程

NormalConfidence_Man 2023-04-20 原文

一、什么是MyBatis

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

原本的JDBC代码实在太复杂了,MyBatis可以简化、自动化连接数据库的流程,优点是:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的ORM字段关系映射。
  • 提供对象关系映射标签,支持对象关系组建维护。
  • 提供xml标签,支持编写动态sql。

二、如何获取MyBatis

1.新建一个maven项目,并且在其配置文件pom.xml中声明以下依赖:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

2.直接到mvnrepository中搜索mybatis,并且将包导入项目中

三、什么是持久层

持久层的对象是为数据进行持久化的层级。数据持久化就是将数据存储到数据库中,存入到数据库的数据称之为持久化数据,与之相对的瞬时数据则是存在内存中的数据,在内存中的数据只要断电就会消失。因此持久层的类和对象需要和数据库中的表和实体对应起来。而MyBatis则是用于完成持久化工作的持久层框架,Dao层则是用于完成持久化工作的层级。

四、第一个MyBatis

4.1 创建数据库

首先在MySQL数据库中创建一个User表:

CREATE TABLE `User`  (
  `id` varchar(30) NOT NULL,
  `name` varchar(30) NOT NULL,
  `psw` varchar(50) NULL,
  PRIMARY KEY (`id`)
);

4.2 创建Maven项目并且引入依赖

新建一个Maven项目,然后在pom.xml中引入依赖,其依赖配置如下:

    <dependencies>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

4.3 编写mybatis配置文件

接下来编写MyBatis核心配置文件,在src->main->resource中新建配置文件,一般命名为mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration核心配置文件 -->
<configuration>

    <environments default="development">
        <environment id="development">
            <!-- 使用何种方式连接 -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用什么驱动 -->
                <property name="driver" value="com.mysql.jdbc.Driver"/>a
                <!-- useSSL:使用安全链接 useUnicode:使用Unicode编码避免中文乱码
                   characterEncoding:指定使用UTF-8字符集 -->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?
                    useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

</configuration>

并且在idea中右侧边栏的database中添加mysql数据库,输入正确的端口号、账号密码后完成连接。然后选择scheme,并且勾选mybatis

4.4 MyBatis运行原理

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。Sql SessionFactory实例是生产SqlSession的工厂,使用的是工厂模式,而SqlSessionFactoryBuilder则是使用了建造者模式,这两种模式详见《设计模式》的内容。我们可以简单理解为:SqlSessionFactoryBuilder 会根据XML的配置建造一个SqlSessionFactory,然后SqlSessionFactory中负责建造各种SqlSession,SqlSession会和指定的pojo层的类联系起来,完成将pojo类和数据库表联系起来的任务。

那么如何创建SqlSessionFactory呢?

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// new一个SqlSessionFactory实例,并且调用其build方法,build方法的参数是一个InputStream
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

使用该方法后,获取到的sqlSessionFactory对象是根据xml或者Configuration配置类配置好的对象,该工厂类中已经包含需要连接到数据库的各种信息。

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。获取SqlSession的语句如下

SqlSession = sqlSessionFactory.openSession();

4.5 创建工具类

我们为了方便测试,可以编写一个工具类用于存放获取sqlSession的操作,命名为mybatisUitl

package com.hch.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtils {
    static SqlSessionFactory sqlSessionFactory;

    static{
        try{
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // new一个SqlSessionFactory实例,并且调用其build方法,build方法的参数是一个InputStream
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch(IOException e){
            e.printStackTrace();
        }
    }
	
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

4.6 代码分析

接着编写MyBatis所需的类,首先是pojo类

package com.hch.pojo;

public class User {
    private String id;
    private String name;
    private String psw;
    
    public User(){}

    public User(String id, String name, String psw) {
        this.id = id;
        this.name = name;
        this.psw = psw;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return psw;
    }

    public void setPassword(String password) {
        this.psw = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", password='" + psw + '\'' +
                '}';
    }
}

接下来是编写dao层
首先编写dao接口,下面为UserDao接口和他的实现类UserDaoImpl

package com.hch.dao;

import com.hch.pojo.User;

import java.util.List;

public interface UserDao {
    List<User> getAllUser();
}
package com.hch.dao;

import com.hch.pojo.User;

import java.util.List;

public class UserDaoImpl implements UserDao{

    @Override
    public List<User> getAllUser() {
        return null;
    }
}

现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作,这里给出一个基于 XML 映射语句的示例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace用于将mapper和某个Dao结合起来 -->
<mapper namespace="com.hch.dao.UserDao">
    <!--select表示这是一个查询语句-->
    <select id="getAllUser" resultType="com.hch.pojo.User">
        select * from mybatis.user;
    </select>
</mapper>

我们还需要更改config中的配置,在mybatis-config.xml中追加以下内容:

 <!-- 一个mapper.xml都需要在Mybatis核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/hch/dao/UserMapper.xml"/>
    </mappers>

MyBatis会根据InputStream读取指定url的配置文件,但是它并不知道各个mapper.xml的位置,因此需要在配置文件中的mapper注册中心里,对每一个需要用到的mapper进行注册,否则会报错

我们分析一下上面的代码,首先,userMapper.xml中的SQL语句规定了返回的对象为User类,此时Mybatis会将User类中的属性和数据库User表中的属性进行一一对应,在执行了对User表的查询后,将查询表中的数据组装成User对象。在userMapper中也用namespace规定了该mapper是和UserDao映射起来的,执行UserDao中对数据的操作函数,就可以执行userMapper中的SQL语句

4.8 测试

接下来我们可以进行一些测试了,在Test文件夹下新建测试用例UserDaoTest,

package com.hch.dao;

import com.hch.pojo.User;
import com.hch.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

public class UserDaoTest {
    @Test
    public void test(){
    	// 获取SqlSession
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        // 通过sqlSession获取指定dao类的实现
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 通过dao类中的方法完成对数据库的操作 
        List<User> userList = userDao.getAllUser();

        for (User user:userList) {
            System.out.println(user);
        }

        sqlSession.close();
    }
}

另外,旧版的第二种方法如下:

List<User> userList = sqlSession.selectList("com.hch.dao.UserDao.getAllUser");

可以直接传入方法名完成调用,但是并不推荐使用该方法,因为第一种方法使用和指定语句的参数和返回值相匹配的接口(比如 UserDao.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。

另外maven的资源过滤器可能会导致报错:找不到mybatis-config.xml,如何操作详见:
https://blog.csdn.net/weixin_45434953/article/details/130026538

点击并且执行UserDaoTest,执行成功

有关【MyBatis】Spring整合MyBatis教程的更多相关文章

  1. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  2. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  5. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  6. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  7. ruby-on-rails - Spring 不起作用。 [未初始化常量 Spring::SID::DL] - 2

    我无法运行Spring。这是错误日志。myid-no-MacBook-Pro:myid$spring/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/lib/spring/sid.rb:17:in`fiddle_func':uninitializedconstantSpring::SID::DL(NameError)from/Users/myid/.rbenv/versions/1.9.3-p484/lib/ruby/gems/1.9.1/gems/spring-0.0.10/li

  8. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  9. 【云原生】SpringCloud-Spring Boot Starter使用测试 - 2

    目录SpringBootStarter是什么?以前传统的做法使用SpringBootStarter之后starter的理念:starter的实现: 创建SpringBootStarter步骤在idea新建一个starter项目、直接执行下一步即可生成项目。 在xml中加入如下配置文件:创建proterties类来保存配置信息创建业务类:创建AutoConfiguration测试如下:SpringBootStarter是什么? SpringBootStarter是在SpringBoot组件中被提出来的一种概念、简化了很多烦琐的配置、通过引入各种SpringBootStarter包可以快速搭建出一

  10. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

随机推荐