【MyBatis】Spring整合MyBatis教程

一、什么是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.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.4.5version>
        dependency>

2.直接到mvnrepository中搜索mybatis,并且将包导入项目中
【MyBatis】Spring整合MyBatis教程_第1张图片

三、什么是持久层

持久层的对象是为数据进行持久化的层级。数据持久化就是将数据存储到数据库中,存入到数据库的数据称之为持久化数据,与之相对的瞬时数据则是存在内存中的数据,在内存中的数据只要断电就会消失。因此持久层的类和对象需要和数据库中的表和实体对应起来。而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>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.28version>
        dependency>

        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.4.5version>
        dependency>

        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
        dependency>
    dependencies>

4.3 编写mybatis配置文件

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


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <environments default="development">
        <environment id="development">
            
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver"/>a
                
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?
                    useSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>

configuration>

并且在idea中右侧边栏的database中添加mysql数据库,输入正确的端口号、账号密码后完成连接。然后选择scheme,并且勾选mybatis
【MyBatis】Spring整合MyBatis教程_第2张图片

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 映射语句的示例


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.hch.dao.UserDao">
    
    <select id="getAllUser" resultType="com.hch.pojo.User">
        select * from mybatis.user;
    select>
mapper>

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

 
    <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教程_第3张图片

你可能感兴趣的:(MyBatis,mybatis,spring,java)