Mybatis 源码梳理

#近来在研究Mybatis的源码,怕忘记,冒个泡。

Mybatis 是一个半自动的持久层框架,说白了还是JDBC封装后的一个框架,方便老铁们使用。

两种开发方式:传统的sqlsession开发,和mapper代理。都是一个样,最后都是sqlsession去操作。学完一个东西以后,一定能自己问自己几个问题,那就是学到了点东西,就是进步:

1、${}、#{}是如何解析的?

2、参数时如何设置的?

3、mybatis应用了哪些设计模式?具体说说源码

4、mybatis的四大组建?

Mybatis 的使用,主要有两个流程:

1、解析流程

String  location="sqlmapConfig.xml";

InputStream is=Resource.getResourceAsStream(location);

SqlsessionFactory  sqlsessionFactory=new SqlSessionFactoryBuilder().build(is);

额....似乎就完成了解析的全过程。好吧,进去看看具体的解析流程。

SqlSessionFactoryBuilder().build(inputstream) 源码截图  

XMLConfigBuilder : 解析全局配置文件

XMLConfigBuilder 的parse()方法

Configuration:全局配置对象

而在初始化XMLConfigBuilder,会实例化Configuration对象,做一些初始化的操作。并且全局配置文件、映射文件都会被解析到Configuration对象中。

Configuration初始化

XMLMapperBuilder: 解析映射文件

在XmlConfiguBuilder在解析配置文件的时候,调用mapperElement(root.evalNode("mappers"));对配置文件的mappers节点进行了解析。

mapperElement 创建 XmlmapperBuilder  解析映射文件

parse()代码如下

XMLMapperBuilder.parse() 解析映射文件

   解析mapper标签下的子标签,一 一 对应:

xml映射文件中 mapper 标签的子标签

我们看看buildStatementFromContext 解析 crudl 语句。 

XMLMapperBuilder创建XMLStatementBuilder   解析CRUD标签

XMLStatementBuilder :  解析crud标签

XMLStatementBuilder 用于解析crud 标签,并将每一个crud标签封装到一个mappedStatement对象中,然后使用Configuration.addMappedStatement (statment) (中间跳过了MapperBuilderAssistant对象)  ;这些操作都是在 parseStatementNode()方法中完成的。

parseStatementNode():负责即解析sql节点

方法中:this.builderAssistant.addMappedStatement(...)内部将mappedstatement 添加到Configuration。

这里有个疑问,就是sql文本信息是如何解析的呢?带着这个疑问我看了源码,发现

SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClass);

langDriver是个接口它只有一个实现类:XMLLanguageDriver,

langDriver的实现类XMLLanguageDriver

我们来看看这个类的createSqlSource做了什么。

XMLLanguageDriver  实现langDriver  接口的 createSqlSource 方法

它创建了XMLScriptBuilder对象,并返回parseScriptNode()的执行结果,也就是SqlSource 。

XMLScriptBuilder:负责解析mapper文件中的每个