1.SqlSessionFactory如何创建SqlSession
2.源码解析
SqlSession session = sqlSessionFactory.openSession();
SqlSessionFactory是个接口,它有两个实现类:
- DefaultSqlSessionFactory
- SqlSessionManager
在我的这篇博客 mybatis源码阅读之SqlSessionFactory创建有讲解最后是使用的DefaultSqlSessionFactory这个实现类。
下面我们一步一步来探究openSession()这个方法是如何创建出SqlSession的。
openSession这个方法调用了openSessionFromDataSource方法,先来看看传递的参数内容是什么。
需要传递的参数内容有三个:
- ExecutorType 执行类型
- TransactionIsolationLevel 事务隔离级别
- boolean 是否主动提交事务
下面我们来看看这三个参数都有什么具体内容:
ExecutorType有三种取值:分别是SIMPLE,REUSE,BATCH
在Configuation类中设置了ExcutorType的默认值为SIMPLE:
如果想要修改ExecutorType的默认值,在mybatis-config.xml中可以这样配置:
<setting name="defaultExecutorType" value="SIMPLE"/>
在Mybatis官方中文文档中有对这三种类型做出解释:
再来看看事务隔离级别TransactionIsolationLevel的种类
从上图可以看出Mybatis的事务隔离级别是来自于java.sql.Connection的事务隔离级别:
事务隔离级别 | 说明 |
---|---|
TRANSACTION_NONE | 表示不支持事务 |
TRANSACTION_READ_COMMITTED | 可以防止脏读,不可重复读和虚读会发生。 |
TRANSACTION_READ_UNCOMMITTED | 脏读,不可重复读和虚读都会发生。 |
TRANSACTION_REPEATABLE_READ | 可以防止脏读和不可重复读,虚读会发生。 |
TRANSACTION_SERIALIZABLE | 可以防止脏读,不可重复读和虚读。 |
第三个参数,是否自动提交事务,可以是true或false。
介绍完openSessionFromDataSource方法的三个参数,我们再来看看这个方法内部都做了哪些操作:
Environment是如何创建,又是在什么时候创建的呢?
在我的博客 mybatis源码阅读之SqlSessionFactory创建 中最后提到Mybatis会去解析xml中的配置:
XMLConfigBuilder类解析mybatis-config.xml中的environments标签的方法:
遍历解析environment元素的子元素,根据xml中设置的transactionManager和dataSource的类型type获得TransactionFactory和DataSourceFactory:
获取transactionManager元素的属性type
Mybatis是如何根据xml配置的type的值就得到TransactionFactory的呢?
BaseBuilder类的resolveClass方法调用了resolveAlias方法
BaseBuilder类的resolveAlias方法是调用了类TypeAliasRegistry的resolveAlias方法。
类BaseBuilder的属性typeAliasRegistry的值是来自Configuration。
类Configuration实例化了一个TypeAliasRegistry,通过构造函数,调用TypeAliasRegistry的registryAlias方法向TYPE_ALIASES中添加键值对。
TYPE_ALIASES是一个Map,在TypeAliasRegistry的构造函数中,向TYPE_ALIASES添加了一些基本数据类型的键值对。
最后,是将type值转成小写,在TYPE_ALIASES中根据键值“jdbc”拿到对应的value,这里是JdbcTransactionFactory.class。如果type是“POOLED”,获得的value就是PooledDataSourceFactory.class。
根据PooledDataSourceFactory获取的DataSource:
而PooledDataSource类里有一些数据库基本的配置:
如果xml中没有配置transactionManager元素,Mybatis会设置一个默认的值ManagedTransactionFactory。
调用JdbcTransactionFactory的newTransaction方法获得JdbcTransaction。
调用Configuration获得执行器,当cacheEnabled为true时,调用的是CachingExecutor。cacheEnabled的默认值为true。可以在xml中对cacheEnabled的值进行修改。
最后的最后,实例化一个DefaultSqlSession(是SqlSession的子类),就可以对数据库进行操作了。