最近因为使用spring-boot整合mybatis出现了一系列的小问题,而且看到网上有很多解析Mybatis的源码文章。网络上也有两本书:《深入浅出Mybatis技术原理与实战》,《Mybatis从入门到精通》
网络博客地址:Mybatis源码分析 、Mybatis系列
纸上得来终觉浅,绝知此事要躬行
于是开启了我的Mybatis源码分析和笔记之路,以目前最新的Mybats3.4.6源码。于是根据源代码追踪,得出以下时序图(画的肯定不怎么好,因为不专业)
我看着这种图,感觉都懵了。还是得用文字解释下。Mybatis解析xml生成SqlSessionFactory解析说明
当单独引入mybatis的jar包时,采用读取mybatis-config.xml配置文件,创建SqlSessionFactory
1:SqlSessionFactoryBuilder.build() 方法详解
这个build是个多态方法,有两种方式读取xml解析,java.io下面两个抽象类,InputStream(字节流)和Reader(字符流),使用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。
2:XMLConfigBuilder类解析
从build方法中看到XMLConfigBuilder类,从类名得知是mybatis的config建造类。继承了抽象类:BaseBuilder
这个类的public方法是7个,其中有6个构造方法,1个parse解析方法
具体看下构造方法和解析。1.设置XPathparser解析,2.使用构造方法使用了super关键字,采用的是基类BaseBuilder的构造方法,初始化Configuration类。3.解析xml的configuration节点。
通过上述代码,得知mybatis解析xml采用的是xpath方式,使用了基类BaseBuilder共享Configuration类信息。最后解析xml的configuration配置返回最终的Configuration对象,给SqlSessionFactoryBuilder类,进行创建SqlSessionFactory。new DefaultSqlSessionFactory(config);形成了一个闭环。因此重点在于XMLConfigBuilder的解析方法。
后面开启Session,执行的入口就是从DefaultSqlSessionFactory开始,下一篇着重分析。
3:BaseBuilder基类解析
为啥要分析这个类,因为这个类是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、XMLScriptBuilder等所有类的基类。因此非常重要!!!
比较简单,公开的就两个方法,一个构造方法,一个是获取Configuration。三个重要属性:
Configuration :mybatis核心配置类
TypeAliasRegistry:mybatis的别名依赖注册类
TypeHandlerRegistry:mybatis类型处理注册类
其他方法:创建对象实例,返回依赖的类,类型处理器
4:XMLConfigBuilder核心方法parseConfiguration
继续回来XMLConfigBuilder类,核心方法:parseConfiguration(parser.evalNode("/configuration"));这个函数作用非常重要,先解析xml的configure配置,分别是:读取properties数据库配置、解析settings节点,加载VFS实现,类别名加载,插件加载,设置databaseId(多数据库支持),类型映射处理器。
1.Environment 数据库环境,采用建造者模式构建。里面有数据库配置信息
2.Interceptor:拦截器插件,实现分页拦截
3.DatabaseIdProvider:数据库供应商id解析,mysql,oracle动态个性化语句
4.核心解析:XMLMapperBuilder解析mapper节点信息。
5:XMLMapperBuilder类
这个类的使用有点类似XMLConfigBuilder的构造,解析过程。
MapperBuilderAssistant类和核心方法configurationElement(XNode context)
涉及到解析resultMap节点,sql节点,select|insert|update|delete节点。
核心是:buildStatementFromContext,引出了XMLStatementBuilder类
5:XMLStatementBuilder类
也是BaseBuilder的子类,同样的构造方式,同样的解析语句节点。
核心方法langDriver.createSqlSource,引出来:XMLLanguageDriver来生成SqlSource
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Class parameterType) {
XMLScriptBuilder builder =new XMLScriptBuilder(configuration, script, parameterType);
return builder.parseScriptNode();
}
得出sql语句的解析流程
6:XMLScriptBuilder解析sql语句
核心方法:MixedSqlNode parseDynamicTags(XNode node)
7.SqlNode接口解析
动态标签:if、where、foreach等动态标签解析
8:DynamicContext类
采用ognl表达式
9:GenericTokenParser和TokenHandler
通用标记解析器和标记处理器,通用标记解析器处理的是SQL脚本中#{parameter}、${parameter}参数,根据给定TokenHandler(标记处理器)来进行处理,TokenHandler是标记真正的处理器
最终得到Configuration类,生成:DefaultSqlSessionFactory类
第二篇重点分析,创建session查询数据库获取数据