MyBatis源码分析 -- mapper的解析流程

0.准备一个核心配置文件 和 一个mapper文件

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

1.准备好mybatis的基本环境之后,运行下面的单元测试

MyBatis源码分析 -- mapper的解析流程

2.进入SqlSessionFactoryBuilder().build方法

MyBatis源码分析 -- mapper的解析流程

3.创建 XMLConfigBuilder ,用于解析mabatis的核心配置文件,进入parse(),然后parseConfiguration(),里面为解析xml对应的信息

MyBatis源码分析 -- mapper的解析流程

4. 我们重点来看看mapper节点的解析,这里循环一个个解析mapper文件

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

5.进入parse()方法,开始解析mapper文件。先判断是否已经解析过

MyBatis源码分析 -- mapper的解析流程

6.进入configurationElement(),看如何解析mapper文件的。

MyBatis源码分析 -- mapper的解析流程

7.重点来看看如何解析sql的。创建 XMLStatementBuilder 对象,用于接续sql语句

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

8.获取节点上的信息

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

9.进入 langDriver.createSqlSource ,看如何解析sql的。把sql语句交给 XMLScriptBuilder对象,进入builder.parseScriptNode() ,

MyBatis源码分析 -- mapper的解析流程

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

这时,看见两个熟悉的符号,“#{”和“}”

MyBatis源码分析 -- mapper的解析流程

10.进入 parser.parse(originalSql) 开始解析,传入原始sql

MyBatis源码分析 -- mapper的解析流程

解析{}里面的内容,hander对象是上一步new的对象,

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程MyBatis源码分析 -- mapper的解析流程

11.SqlSourceBuilder解析{}里面的内容

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

解析出来了之后放ParameterExpression ,他继承了hashmap

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

11.最后得到结果,完了返回一个“?”

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

sql解析完了。参数拿到了,sql的参数被替换成了?

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

12.解析完了之后,拿到namespace + 标签id 作为key,放入 configuration 里面的 mappedStatements 容器中。

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

13. 至此,一个mapper文件里面的节点就解析完毕了。循环里面将继续解析其他的mapper文件

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

14. mapper文件里面的东西解析完了之后开始注册mapper接口

MyBatis源码分析 -- mapper的解析流程
MyBatis源码分析 -- mapper的解析流程

15 调用 configuration.addMapper(boundType) ,然后 mapperRegistry.addMapper(type) ,将mapper接口的工厂类添加到mapper注册中心。注:是工厂,不是实现类。实现类是调用的反射的。

MyBatis源码分析 -- mapper的解析流程

16.处理失败的节点

MyBatis源码分析 -- mapper的解析流程

17.至此,一个mapper文件就全部解析完毕,循环继续解析其他的mapper文件

MyBatis源码分析 -- mapper的解析流程

18.mapper解析完了之后,SqlSessionFactory 也得到了

MyBatis源码分析 -- mapper的解析流程

19.回到梦开始的地方了。

20.下回继续分解。