MyBatis和其他组件一样,也需要通过初始化来准备运行时环境。在初始化阶段输入的是XML和字节码,输出结果是configuration对象。
一、关键类
XMLConfigBuilder和XMLMapperBuilder这两个构建器是MyBatis构建阶段的核心。
MyBatis构建阶段主要的产出结果和参与构建的构建器如下,它们互相协作,实现了整个MyBatis执行前的准备工作。
(1)SqlSessionFactory:管理数据库会话、整合configuration对象,是构建阶段的重要输出结果。
(2)SqlSessionFactoryBuilder:SqlSessionFactory的构造器,可以自己解析配置、也可以直接传入提前构建好的配置对象构建SqlSessionFactory。
(3)Configuration:存储所有MyBatis运行时的配置。
(4)BaseBuilder:构造器基类,处理configuration、typeAlias及typeHandler对象。
(5)XMLConfigBuilder:解析XML定义的configuration对象。
(6)XMLMapperBuilder:解析XML定义的SQL映射配置对象集合。
(7)MapperRegistry:configuration对象中的SQL映射配置对象的注册机。
(8)MapperAnnotationBuilder:解析注解定义的SQLMapper对象集合。
二、关键时序
MyBatis构建阶段的调用入口类是SqlSessionFactoryBuilder,它会调用XMLConfigBuilder构建配置。XMLConfigBuilder会调用XMLMapperBuilder(以XML定义SQLMapper时)构建SQL Mapper映射。SqlSessionFactoryBuilder在得到初始化的configuration对象后用其构建SqlSessionFactory。
SqlSessionFactory是生产SqlSession对象的工厂,SqlSession则是MyBatis执行阶段的关键入口类。
三、构建的入口:SqlSessionFactoryBuilder和SqlSessionFactory
在SqlSessionFactoryBuilder中有很多重载的builder()方法,但核心方法有以下三种。
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//初始化解析器
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
inputStream是配置文件的文件流,environment和properties是可选的参数。build()方法首先生成XMLConfigBuilder 对象,然后调用parse()方法将配置文件的文件流解析成configuration对象。
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
在configuration对象解析完成后使用configuration对象构建DefaultSqlSessionFactory对象。
四、conf.xml配置
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://127.0.0.1:3306/first?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
environments元素用于配置多数据源信息,并指定默认使用哪个数据源。
SqlSessionFactoryBuilder.builder()方法中的第二个参数environment,它就是environment元素id属性的值,如果配置为空,则系统会使用默认的环境配置值"default"。
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="DB2" value="db2"/>
<property name="Oracle" value="oracle"/>
</databaseIdProvider>
databaseIdProvider 元素定义数据库厂商的id,在构建SQL Mapping时可以根据此配置区分数据库厂商。
<mappers>
<!-- 注册bookMapper.xml文件-->
<mapper resource="mapping/bookMapper.xml" />
</mappers>
mapperElement()方法构建SQL Mapper。从这个方法开始,构建过程进入第二阶段:SQL Mapper初始化阶段。
如果本文对您有很大的帮助,还请点赞关注一下。