Mybatis源码第一篇:sqlSessionFactory创建流程

 最近因为使用spring-boot整合mybatis出现了一系列的小问题,而且看到网上有很多解析Mybatis的源码文章。网络上也有两本书:《深入浅出Mybatis技术原理与实战》,《Mybatis从入门到精通》

网络博客地址:Mybatis源码分析 、Mybatis系列


纸上得来终觉浅,绝知此事要躬行

于是开启了我的Mybatis源码分析和笔记之路,以目前最新的Mybats3.4.6源码。于是根据源代码追踪,得出以下时序图(画的肯定不怎么好,因为不专业)

mybatis加载xml时序图

我看着这种图,感觉都懵了。还是得用文字解释下。Mybatis解析xml生成SqlSessionFactory解析说明

当单独引入mybatis的jar包时,采用读取mybatis-config.xml配置文件,创建SqlSessionFactory 

创建sqlSessionFactory入口

1:SqlSessionFactoryBuilder.build() 方法详解

创建sqlSessionFactory详解

这个build是个多态方法,有两种方式读取xml解析,java.io下面两个抽象类,InputStream(字节流)和Reader(字符流),使用Reader读取出来的是char数组或者String,使用InputStream读取出来的是byte数组。

创建sqlSessionFactory详解2

2:XMLConfigBuilder类解析

从build方法中看到XMLConfigBuilder类,从类名得知是mybatis的config建造类。继承了抽象类:BaseBuilder

这个类的public方法是7个,其中有6个构造方法,1个parse解析方法

XMLConfigBuilder解析

具体看下构造方法和解析。1.设置XPathparser解析,2.使用构造方法使用了super关键字,采用的是基类BaseBuilder的构造方法,初始化Configuration类。3.解析xml的configuration节点。

XMLConfigBuilder核心方法

通过上述代码,得知mybatis解析xml采用的是xpath方式,使用了基类BaseBuilder共享Configuration类信息。最后解析xml的configuration配置返回最终的Configuration对象,给SqlSessionFactoryBuilder类,进行创建SqlSessionFactory。new DefaultSqlSessionFactory(config);形成了一个闭环。因此重点在于XMLConfigBuilder的解析方法。

后面开启Session,执行的入口就是从DefaultSqlSessionFactory开始,下一篇着重分析。

3:BaseBuilder基类解析

为啥要分析这个类,因为这个类是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、XMLScriptBuilder等所有类的基类。因此非常重要!!!

BaseBuilder基类和所有父类概况

比较简单,公开的就两个方法,一个构造方法,一个是获取Configuration。三个重要属性:

Configuration :mybatis核心配置类

TypeAliasRegistry:mybatis的别名依赖注册类

TypeHandlerRegistry:mybatis类型处理注册类

其他方法:创建对象实例,返回依赖的类,类型处理器


BaseBuilder的其他方法

4:XMLConfigBuilder核心方法parseConfiguration

继续回来XMLConfigBuilder类,核心方法:parseConfiguration(parser.evalNode("/configuration"));这个函数作用非常重要,先解析xml的configure配置,分别是:读取properties数据库配置、解析settings节点,加载VFS实现,类别名加载,插件加载,设置databaseId(多数据库支持),类型映射处理器。

XMLConfigBuilder核心方法parseConfiguration

1.Environment 数据库环境,采用建造者模式构建。里面有数据库配置信息

Environment 对象创建

2.Interceptor:拦截器插件,实现分页拦截

拦截器

3.DatabaseIdProvider:数据库供应商id解析,mysql,oracle动态个性化语句

datasourceId

4.核心解析:XMLMapperBuilder解析mapper节点信息。

XMLMapperBuilder解析

5:XMLMapperBuilder类

这个类的使用有点类似XMLConfigBuilder的构造,解析过程。

XMLMapperBuilder构造方法和parse

MapperBuilderAssistant类和核心方法configurationElement(XNode context)

configurationElement

涉及到解析resultMap节点,sql节点,select|insert|update|delete节点。

parameterMap
resultMap
sql片段

核心是:buildStatementFromContext,引出了XMLStatementBuilder类

XMLStatementBuilder

5:XMLStatementBuilder类

也是BaseBuilder的子类,同样的构造方式,同样的解析语句节点。

1
2

核心方法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语句

XMLScriptBuilder

核心方法:MixedSqlNode parseDynamicTags(XNode node)

动态标签

7.SqlNode接口解析

动态标签:if、where、foreach等动态标签解析

SqlNode接口实现
SqlNote


8:DynamicContext类

采用ognl表达式

dynamicContext

9:GenericTokenParser和TokenHandler

通用标记解析器和标记处理器,通用标记解析器处理的是SQL脚本中#{parameter}、${parameter}参数,根据给定TokenHandler(标记处理器)来进行处理,TokenHandler是标记真正的处理器

标记处理器

最终得到Configuration类,生成:DefaultSqlSessionFactory类

第二篇重点分析,创建session查询数据库获取数据

你可能感兴趣的:(Mybatis源码第一篇:sqlSessionFactory创建流程)