核心步骤
- 构建阶段(本文)
- 执行阶段(juejin.cn/post/684490…)
从构建阶段的入口类 SqlSessionFactoryBuilder开始
- 首先,
Xml**Builder类是构建器,用来构建一个对象 XMLConfigBuilder的产物用来加载MyBatis的配置文件XMLMapperBuilder的产物用来解析MyBatis中的映射文件XMLStatementBuilder的产物用来解析映射文件中的SQL语句
// 几个Builder的创建顺序
SqlSessionFactoryBuilder#build() // sql会话工厂构建器
new XMLConfigBuilder // 配置构建器
new XMLMapperBuilder // Mapper构建器
new XMLStatementBuilder // sql语句构建器
new DefaultSqlSessionFactory(config) // 得到configuration对象后构建出工厂类
- 这些
XML建造者都有一个共同的父类BaseBuilder。 - 这个
BaseBuilder父类维护了一个全局的Configuration对象, - MyBatis的配置文件解析后就以
Configuration对象的形式存储。 - 当创建
XMLConfigBuilder对象时,就会初始化Configuration对象, - 并且在初始化
Configuration对象时,一些别名会注册到Configuration的typeAliasRegistry容器中。
XmlConfigBuilder初始化构建Configuration的过程
XmlConfigBuilder加载配置文件到Configuration的细节
mybatis-config.dtd规定了Configuration配置的内容
Configuration 对象是XmlConfigBuilder构建产物,但是他的运行环境Environment和SQL映射依赖了其他的builder
SqlSessionFactoryBuilder初始化后调用
XmlConfigBuilder.parse()方法将配置文件初始化到configuration中
XmlConfigBuilder多次用XPathParser.evalNode()方法来获取xml document对象的DOM节点
XMLMapperBuilder配置的初始化
mybatis-3-mapper.dtd定义了SQL Mapper配置文件的内容,都是与增删改查相关的 SQL Mapper配置内容也是被保存在Confiuration对象中
解析SQL Mapper有三个方式,
如果是resource方式或者url方式,会直接调用XMLMapperBuilder.parse()进行构建
如果是扫描包或者指定类的方式,则会使用MapperAnnoationBuilder反射解析Mapper类中的注解,进行构建
XMLMapperBuilder加载sql mapper配置文件的细节
XMLMapperBuilder.parse()将Mapper注册到configuration对象中
MapperAnnoationBuilder加载Mapper接口上的注解
MapperAnnoationBuilder跟XMLMapperBuilder有些类似,不过构建的内容略少,且需要使用反射来构建SQL Mapper
MapperAnnoationBuilder只处理cache、cacheRef和statement配置
总结
Configuration对象的先对mybatis的配置初始化,然后会进行Sql Mapper映射文件的初始化。
Sql语句的构建中实现了语句、参数、主键、返回结果集和缓存的加载,加载完的语句变量都会保存在configuration中。
下篇文章中,我们来对myabtis运行阶段进行分析。