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的对应关系建立。