MyBatis源码解读

2023年 9月 2日 28.3k 0

一、MyBatis回顾

我们先做一个MyBatis的简单回顾。

1.1、MyBatis是做什么

MyBatis是一个ORM框架,解决的的是数据库访问和操作的问题,是对现有的JDBC的封装。

1.2、搭建MyBatis环境

首先我们需要准备一下MyBatis所需要的依赖jar包。


    
        org.mybatis
        mybatis
        3.4.5
    
​
    
    
        mysql
        mysql-connector-java
        5.1.38
    

准备好依赖后我们就要去准备一下配置文件。MyBatis主要是有两类配置文件:

  • 基本配置文件:mybatis-config.xml
  • 写sql的文件:mapper.xml
  • 1.2.1、mybatis-confi.xml

    我们先来写一套mybatis-config的模板,然后根据每一个不同的板块详解。

    
    
    
        
            
            
            
            
        
    ​
        
            
        
    ​
        
            
                
                
                    
                    
                    
                    
                
            
        
    ​
        
            
        
    
    

    我们首先来看environments这个标签。

        
            
                
                
                    
                    
                    
                    
                
            
        
    

    environments标签意味着我们可以配置多个,我们只需要在environments标签里面多加几个environment即可,但是要确保id不同即可。

    
            
                
                
                    
                    
                    
                    
                
            
           
                
                
                    
                    
                    
                    
                
            
        
    

    在设置完多个数据源以后,我们还需要一个默认开启的数据源,此时我们就可以在environments标签的default属性中写上我们需要默认开启的数据源即可。一旦涉及到了多数据源的话,就会出现一个特别恶心的事情,那即是我们的事务不好控制。

    1.2.2、测试MyBatis

    首先我们需要引入必须的依赖。

    
    
        4.0.0
    ​
        cn.linstudy
        MyBatisSource
        1.0-SNAPSHOT
    ​
        
            8
            8
            UTF-8
        
    ​
        
            
            
                org.mybatis
                mybatis
                3.5.13
            
    ​
            
            
                mysql
                mysql-connector-java
                5.1.47
            
    ​
            
                org.projectlombok
                lombok
                1.18.26
            
    ​
            
                org.springframework
                spring-test
                6.0.7
            
            
                junit
                junit
                4.13.1
                test
            
    ​
            
                org.mybatis
                mybatis
                3.5.13
            
        
    ​
    
    

    然后简单的创建一张表dept。

    CREATE TABLE `dept` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
    

    然后创建实体类。

    package cn.linstudy.pojo;
    ​
    import lombok.Data;
    ​
    /**
     * @Description
     * @Date 2023/6/18
     * @Author XiaoLin
     */
    @Data
    public class Dept {
    ​
        private Integer id;
        private String name;
    }
    ​
    

    接着开始写mapper接口和mapper.xml

    package cn.linstudy.mapper;
    ​
    import cn.linstudy.pojo.Dept;
    import org.apache.ibatis.annotations.Mapper;
    ​
    import java.util.List;
    ​
    /**
     * @Description
     * @Date 2023/6/18
     * @Author XiaoLin
     */
    @Mapper
    public interface DeptMapper {
    ​
        List listAllDept();
    }
    ​
    
    
    
    
    ​
        
            select id , name from dept;
        
    
    ​
    

    最后就可以开始测试了。

    package cn.linstudy;
    ​
    import cn.linstudy.mapper.DeptMapper;
    import cn.linstudy.pojo.Dept;
    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 org.junit.Test;
    ​
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    ​
    /**
     * @Description
     * @Date 2023/6/18
     * @Author XiaoLin
     */
    public class TestMyBatis {
    ​
        @Test
        public void test1() throws IOException {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
            List depts = deptMapper.listAllDept();
            for (Dept dept : depts) {
                System.out.println(dept);
            }
    ​
        }
    ​
    }
    

    运行测试类,出现了我们表中的数据即表示我们的环境搭建是成功的。

    MyBatis源码解读-1

    这段代码中比较重要的一句话就是通过IO获取输入流。

     InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    

    通过IO方式打开输入流,获取mybatis-config.xml以及xxxMapper.xml,因为在mybatis-config.xml中已经配置好了mapper文件的路径,所以在以一次的IO中把两者的信息都读到了。

    如果有知道ibatis(mybatis的前身)的话,还有另外一种比较古老的写法。他的区别是在于不再通过sqlSession.getMapper()方法去获取mapper,而是通过sqlSession.selectList(),里面传入对应的mapper的全路径以及对应的方法名来获取到对应的数组对象。

        @Test
        public void test2() throws IOException {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            List depts = sqlSession.selectList("cn.linstudy.mapper.DeptMapper.listAllDept");
            for (Dept dept : depts) {
                System.out.println(dept);
            }
        }
    

    这两种方法的实现效果是一样的,但是哪一种比较好呢?当然是第一种比较好,因为我们平时写的就是第一种。答案是因为第一种表达的概念更加清晰,就更加直观,deptMapper.listAllDept()很明显就是deptMapper的listAllDept方法,而且是对部门进行操作的,这种方式更符合面向对象的概念。

    那么第一种是如何实现的呢?其实很简单,其实第一种本质上是对第二种的进一步封装,封装的实现方法是使用了代理设计模式。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论