解析配置
在我看mybatis源码的时候,大部分代码还是很简单的,DefaultResultSetHandler这个类是最难的,没有之一,debug了很多遍,还是没太搞懂,基于ResultSetHandler也并不是很重要,所以本系列我就不会写ResultSetHandler的内容了
mybatis解析配置阶段的代码还是比较简单的,基本上就是对配置文件中的各种属性进行解析,然后将值保存到Configuration对象中,因此直接画个流程图就略过了。比较重要的过程,比如sql的解析过程我会单开一节来分析
解析的过程用了建造者模式,将对象与对象的创建过程进行了解耦。建造者模式UML图如下
主要有如下4个角色:
- 建造者(Builder)接口:定义对象各部分的行为
- 具体建造者(ConcreteBuilder):一般来说有2种类型的方法,1.建造方法,如buildPart1(),2.获取构建好的产品对象的方法,如getProduct()方法
- 导演(Director):通过调用具体建造者,创建需要的产品
- 产品(Product):用户需要使用的复杂对象
mybatis中配置文件分为两部分,mybatis配置文件和mapper映射文件,用了不同的类来进行解析
类 | 文件 |
---|---|
XMLConfigBuilder | 主要负责解析mybatis-config.xml |
XMLMapperBuilder | 主要负责解析mapper.xml中的cache-ref,cache,parameterMap,resultMap,sql节点 |
XMLStatementBuilder | 主要负责解析mapper.xml中的select,insert,update,delete这四类节点 |
当执行完如下2行代码,整个解析过程就完毕了,最后返回的SqlSessionFactory为DefaultSqlSessionFactory
Reader reader = Resources.getResourceAsReader("org/apache/ibatis/mytest/mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
我把解析每个sql语句中比较重要的代码截出来了
org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode
最后把解析完成的sql封装成MappedStatement,并存到Configuration中,后续根据id就可以直接取到MappedStatement,然后执行sql
MappedStatement中有一个很重要的属性SqlSource,这是解析完sql后封装的一个对象,下节我们详细分析一下
参考博客
[0]https://www.jianshu.com/p/7bc6d3b7fb45
适配器模式
[1]http://www.cnblogs.com/liuling/archive/2013/04/12/adapter.html
源码中文注释
[2]https://github.com/tuguangquan/mybatis
优秀博文
[3]https://blog.csdn.net/nmgrd/article/details/54608702
MyBatis源码解析(一)——MyBatis初始化过程解析(好文)
[4]https://www.jianshu.com/p/7bc6d3b7fb45
MyBatis源码解析(二)——动态代理实现函数调用(好文)
[5]https://www.jianshu.com/p/46c6e56d9774
MyBatis 源码解析:通过源码深入理解 SQL 的执行过程
[6]https://gitbook.cn/books/5a37b6b66eec7c4f044a75d0/index.html#undefined
Mybatis源码分析(一)–Mapper的动态代理
[7]https://zhuanlan.zhihu.com/p/31228047
建造者模式
[8]http://www.hollischuang.com/archives/1477
Mybatis缓存详解
[9]http://blog.51cto.com/zero01/2103911