一文带你分析基于XMl配置Mybatis初始化源码解析

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

Mybatis基于XML配置初始化源码解析

Mybatis初始化源码解析

image.png

Mybatis通过Resource.getResourceAsStream()方法加载MybatisXML配置文件转换为字节输入流,然后通过SqlSessionFactoryBuilder()方法中的build()方法进行解析配置文件。

image.png

image.png

Mybatis初始化的时候会将Mybatis的配置信息全部加载到内存中,使用org.apache.ibatis.session.configuation实例来进行维护

  • 首先对Configuation对象进行解答

Configuration对象的结构和xml配置⽂件的对象⼏乎相同。 回顾⼀下xml中的配置标签有哪些:

- properties (属性)
- settings (设置)
- typeAliases (类型别名)
- typeHandlers (类型处理器)
- objectFactory (对象⼯⼚)
- mappers (映射器)
复制代码

Configuration也有对应的对象属性来封装它们也就是说,初始化配置⽂件信息的本质就是创建Configuration对象,将解析的xml数据封装到Configuration内部属性中。

image.png

image.png

通过上图的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语句的执行。

猜你喜欢

转载自juejin.im/post/7033350693859950628