首先我们需要了解mybatis初始化大致做了什么
1. 创建SqlSessionFactory
2. 通过SqlSessionFactory来创建sqlSession
那么初始化中创建SqlSessionFactory需要什么,配置文件和mapper文件如何加载,如何调用sql等到底是如何实现的呢,接下来就进入源码解读
为了创建SqlSessionFactory,mybatis需要读取配置文件并且注入大量属性值
因为使用的spring配置的Mybatis,所以使用SqlSessionFactoryBean的buildSqlSessionFactory方法
其中创建了Configuration和XmlConfigBuilder,在初始化过程中起着重要作用
buildSqlSessionFactory方法前部都在将spring中的配置信息设置到Configuration对象中。
例如下图:向Configuration注入了spring的事务管理
接下来重点来了,当检测到mapperLocations时,即mapper文件的所在路径时,开始解析配置文件
重点介绍这个方法xmlMapperBuilder.parse()
parse()方法中有两个重要方法
- configurationElement
- bindMapperForNamespace
(1)configurationElement方法主要做了:
1. 组装builderAssistant,用于存储组装时需要的参数
2. 继续给Configuration添加属性,如缓存、命名空间
3. buildStatementFromContext负责解析sql
buildStatementFromContext方法,该方法的入参是标签为“select|insert|update|delete”的节点,分别对应一个XNode,随后遍历获取节点的属性,传入builderAssistant.addMappedStatement()方法。这个方法返回MappedStatement,保存着mapper每个标签下的所有信息。每个MappedStatement组装完成后都会保存到Configuration中去
(2)bindMapperForNamespace方法主要用于:
将MappedStatement与Namespace绑定在一起,并在MapperRegistry中的knownMappers(一个保存着mapper代理类的map)添加一个代理类
最后,parse结束返回configuration,根据configuration创建SqlSessionFactory
到这里SqlSessionFactory创建完毕,创建过程中的所有属性配置全部由一个configuration带入。