MyBatis执行流程
启动流程
构建全局的 org.apache.ibatis.session.SqlSessionFactory 对象
该对象在全局应只有一个(一个数据源一个SqlSessionFactory)
SqlSessionFactory 的构建过程
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/> <!--将下划线转换为驼峰-->
</settings>
<environments default="development">
<environment id="development">
<!--事务类型-->
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.10.20:3306/jsh_erp2"/>
<property name="username" value="root"/>
<property name="password" value="Aa.123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/dreams/test/mapper/UserMapper.xml"/>
</mappers>
</configuration>
InputStream input = Resources.getResourceAsStream("MybatisConfiguration.xml"); //1
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //2
SqlSessionFactory factory = builder.build(input); //根据配置文件构建SqlSessionFactory对象
- 解析Configuration.xml 文件, 生成
org.apache.ibatis.session.Configuration对象- 加载 Configuration.xml , 根据xml文件创建解析器实例
XMLConfigBuilder,并创建对应的Configuration对象 - 调用 XMLConfigBuilder.parse()方法 解析xml文件
- 调用
propertiesElement()方法,解析\<properties\>标签下的所有数据,并设置到Configuration 实例的variables【Properties】参数中 - 解析 settings 标签下的配置信息, 并根据该配置信息加载对应的对象, 例如:VFS, Logger
- 解析 typeAliases 标签, 注册别名 (注册在Configration中的 TypeAliasRegistry 中)
- 解析 pluginElement 标签, 注册插件
- 解析 environments 标签, 构建Environment 实例
- 根据配置的 transacetionManager 构建事务管理对象:
JDBC,MANAGED - 根据配置的 datasource 信息,获取对应的 DataSourceFactory 创建DataSource实例, 并设置数据库连接参数(driver,user,pass,url)
- PooledDataSource
- UnpoolDataSource
- 将调用的DataSource对象传入Environment对象中
- 将Environment对象设置到Configuration
- 根据配置的 transacetionManager 构建事务管理对象:
- 解析 typeHandlers 配置的类型处理器
- 解析 mappers
- 通过 package 参数自动扫描注册
- 通过 resource 或 url 解析 mapper.xml 注册
- 调用
- 加载 Configuration.xml , 根据xml文件创建解析器实例
flowchart
a(读取配置文件) --> b(构建SqlSessionFactoryBuilder)
SqlSessionFactoryBuilder.build(InputStream);
// 创建对象
// 1. Configuration 配置参数
// 1.1 创建Configuration 时,会自动注册内置类型 如 JDBC, MANAGED, POOLED 等
// 2. TypeAliasRegistry 类型别名注册
// 3. TypeHandleRegistry 类型转换注册
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());

parse() 方法中调用 parseConfiguration()方法, 在 parseConfiguration 中,针对于配置文件中的每一项配置进行解析, 其中主要有 environments和mappers的解析
environments中配置了数据源
mappers中配置了 sql 映射文件

environmentsElement()
xml 中的 POOLED 时创建Configuration 对象时注册的一个别名: typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
dataSourceElement(XNode) 方法会根据 <datasource> 中的type属性,创建一个DatasourceFactory对象


浙公网安备 33010602011771号