0
点赞
收藏
分享

微信扫一扫

Mybatis源码解析:配置解析流程


Mybatis源码解析:配置解析流程_sql

解析配置

在我看mybatis源码的时候,大部分代码还是很简单的,DefaultResultSetHandler这个类是最难的,没有之一,debug了很多遍,还是没太搞懂,基于ResultSetHandler也并不是很重要,所以本系列我就不会写ResultSetHandler的内容了

mybatis解析配置阶段的代码还是比较简单的,基本上就是对配置文件中的各种属性进行解析,然后将值保存到Configuration对象中,因此直接画个流程图就略过了。比较重要的过程,比如sql的解析过程我会单开一节来分析

解析的过程用了建造者模式,将对象与对象的创建过程进行了解耦。建造者模式UML图如下

Mybatis源码解析:配置解析流程_xml_02


主要有如下4个角色:

  1. 建造者(Builder)接口:定义对象各部分的行为
  2. 具体建造者(ConcreteBuilder):一般来说有2种类型的方法,1.建造方法,如buildPart1(),2.获取构建好的产品对象的方法,如getProduct()方法
  3. 导演(Director):通过调用具体建造者,创建需要的产品
  4. 产品(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);

Mybatis源码解析:配置解析流程_java_03


我把解析每个sql语句中比较重要的代码截出来了

org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

Mybatis源码解析:配置解析流程_开发语言_04


最后把解析完成的sql封装成MappedStatement,并存到Configuration中,后续根据id就可以直接取到MappedStatement,然后执行sql

Mybatis源码解析:配置解析流程_sql_05


MappedStatement中有一个很重要的属性SqlSource,这是解析完sql后封装的一个对象,下节我们详细分析一下

Mybatis源码解析:配置解析流程_intellij-idea_06

参考博客

[0]https://www.jianshu.com/p/7bc6d3b7fb45
适配器模式
[2]https://github.com/tuguangquan/mybatis
优秀博文
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


举报

相关推荐

0 条评论