Mybatis源码解析之Mapper与xml的加载和关联

Mybatis源码解析之Mapper与xml的加载和关联

什么是 MyBatis?

我们去Mybatis的官方文档看一下Mybatis的介绍

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

我们进入实战查看Mybatis到底是如何做到的

前期准备

编写一段Mybatis的简单调用代码

public static void main(String[] args) {
        DataSource dataSource = getDataSource();
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(UsersMapper.class);//重点代码
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //System.out.println(sqlSession.selectOne("com.lq.dao.UsersMapper.selectByPrimaryKey",1));
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        System.out.println(mapper.selectByPrimaryKey(1));
        System.out.println(mapper.selectByPrimaryKey(1));
    }

调试代码

我们进入configuration.addMapper();这个方法
在这里插入图片描述
发现进入了MapperRegisrty类中
在这里插入图片描述
此类拥有configuration,本地保存已添加Mapper的缓存——knownMappers
重点代码
在这里插入图片描述
MapperRegisrty先进行了判断是否为接口,然后使用parse.parse进行实际加载解析xml,我一直搞不明白为什么先把Mapper放入knownMapper缓存内。想了半天没想明白,不研究了。
在这里插入图片描述
parse.parse 进入loadXmlResource()方法中
在这里插入图片描述
先判断configuration是否加载了namespace:类路径 例如:com.lq.UsersMapper
没有的话查找xml文件,进入解析xml
在这里插入图片描述
解析xml
在这里插入图片描述
将xml解析出来的语句封装成MapperedStatement放入Configuration中
在这里插入图片描述
MapperedStatement的ID为com.lq.dao.UsersMapper.selectByPrimaryKey namespace+xml方法名
通过此ID来跟接口方法进行一一对应!
在这里插入图片描述
在这里插入图片描述
之后又将xml的路径放入解析资源缓存中,一个Mapper加载结束有接口和xml两条数据。
在这里插入图片描述
至此,Mapper解析完成,xml解析完成。Mapper与xml的对应关系建立。


版权声明:本文为weixin_43465227原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。