一、引入
在上篇文章中, 我们分析了Executor执行器的源码, Executor利用MappedStatement和参数通过一定的调度, 完成了sql参数的映射、sql的执行、结果集的处理, 即Executor就是将相关组件进行了调度而已
在执行sql之前, 我们分析得到, Executor会利用Transaction对象来获取连接, 然后利用这个连接去执行sql, 本篇文章我们就来分析下Transaction的功能以及SqlSession这个组件
二、事务相关组件分析
2.1、Environment的初始化
在第一篇文章中, 我们对Mybatis的初始化进行了简单的分析, 其中会对Mybatis的配置文件进行分析, 将里面的一个个标签映射成Java对象, 我们再来看看对<environments>标签的解析源码, 先贴上之前的配置文件:
<configuration>
<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://dev1-linux.pospal.cn:3306/pospal?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=true&allowMultiQueries=true"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
可以看到, 我们配置了一个development环境, 在环境中配置了一个datasource数据源, 与此同时, 配置了一个事务管理器transactionManager, 那么这个是怎么映射到java对象的呢?
private void environmentsElement(XNode context) {
if (context != null) {
if (environment == null) {
environment = context.getStringAttribute("default");
}
for (XNode child : context.getChildren()) {
String id = child.getStringAttribute("id");
if (isSpecifiedEnvironment(id)) {
TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
DataSourceFactory ds