这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
Mybatis基于XML配置初始化源码解析
Mybatis初始化源码解析
Mybatis通过Resource.getResourceAsStream()方法加载MybatisXML配置文件转换为字节输入流,然后通过SqlSessionFactoryBuilder()
方法中的build()
方法进行解析配置文件。
Mybatis初始化的时候会将Mybatis的配置信息全部加载到内存中,使用org.apache.ibatis.session.configuation
实例来进行维护
- 首先对Configuation对象进行解答
Configuration对象的结构和xml配置⽂件的对象⼏乎相同。 回顾⼀下xml中的配置标签有哪些:
- properties (属性)
- settings (设置)
- typeAliases (类型别名)
- typeHandlers (类型处理器)
- objectFactory (对象⼯⼚)
- mappers (映射器)
复制代码
Configuration也有对应的对象属性来封装它们也就是说,初始化配置⽂件信息的本质就是创建Configuration对象,将解析的xml数据封装到Configuration内部属性中。
通过上图的ParseConfiguration方法传入Mybatis配置文件的顶层标签,进行解析
方法 | 作用 |
---|---|
propertiesElement(root.evalNode("properties")) | 解析<properties/> 标签 |
Propertiessettings=settingsAsProperties(root.evalNode("settings")); | 解析〈settings/> 标签 |
loadCustomVfs(settings) | 加载⾃定义的VFS实现类 |
typeAliasesElement(root.evalNode("typeAliases")); | 解析<plugins /> 标签 |
objectFactoryElement(root.evalNode("objectFactory")) | 解析<objectFactory /> 标签 |
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")) | 解析<objectWrapperFactory /> 标签 |
reflectorFactoryElement(root.evalNode("reflectorFactory")) | 解析<reflectorFactory /> 标签 |
settingsElement(settings) | 赋值<settings /> ⾄Configuration属性 |
environmentsElement(root.evalNode("environments")) | 解析〈environments /> 标签 |
databaseldProviderElement(root.evalNode("databaseldProvider")) | 解析<databaseIdProvider /> 标签 |
typeHandlerElement(root.evalNode("typeHandlers")) | 解析<typeHandlers /> 标签 |
mapperElement(root.evalNode("mappers")) | 解析<mappers /> 标签 |
通过ParseConfiguration方法对XML配置文件解析拿到所有的解析后的信息。
- MappedStatemen
MappedStatement与Mapper配置⽂件中的⼀个select/update/insert/delete节点相对应。mapper中配置的标签都被封装到了此对象中,主要⽤途是描述⼀条SQL语句。
初始化过程
回顾刚开始介绍的加载配置⽂件的过程中,会对mybatis-config.xm l中的各个标签都进⾏解析,其中有mappers标签⽤来引⼊mapper.xml⽂件或者配置mapper接⼝的⽬录。
<selectid="getUser"resultType="user">
select * from user where id=#{id}</select>
复制代码
这样的⼀个select标签会在初始化配置⽂件时被解析封装成⼀个MappedStatement对象,然后存储在Configuration对象的mappedStatements属性中,mappedStatements是⼀个HashMap,存储时key=全限定类名+⽅法名,value =对应的MappedStatement对象。
在configuration中对应的属性为
Map<String, MappedStatement> mappedStatements =new StrictMap<MappedStatement>("Mapped Statements collection")
复制代码
- 在XMLConfigBuilder中的处理
private void parseConfiguration(XNode root) { try {
//省略其他标签的处理
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration.
Cause:" + e, e);
}
}
复制代码
到此对xml配置⽂件的解析就结束了,回到步骤2.中调⽤的重载build⽅法
// 5.调⽤的重载⽅法
public SqlSessionFactory build(Configuration config) {
//创建了 DefaultSqlSessionFactory 对象,传⼊ Configuration 对象。
return new DefaultSqlSessionFactory(config);
}
复制代码
到此Mybatis基于XMl配置的初始化源码就分析完成,Mybatis初始化就是把XMl文件解析成一块一块的元素。然后把特定的元素传给build方法中,进行SQL语句的执行。