在上一章节讲述了Mybatis的解析和运行原理中构建SqlSessionFactory过程,本章节就主要讲述构建SqlSession的过程
(二)、构建SqlSession过程
SqlSession sqlSession = sessionFactory.openSession();
sessionFactory.openSession()主要调用默认实现类DefaultSqlSessionFactory的openSession()方法,返回SqlSession的默认实现类DefaultSqlSession
@Override
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
// 获取Configration全局配置中的environment的配置
final Environment environment = configuration.getEnvironment();
// 通过environment配置构建transactionFactory对象
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
// 从工厂中获取一个事务实例
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
// 构建执行器
final Executor executor = configuration.newExecutor(tx, execType);
// 返回SqlSession的默认实现类DefaultSqlSession
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
其中不了解Configuration类的可以查看上一章节构建SqlSessionFactory过程进行了解:Configuration封装了全局配置信息
SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)中传入的参数解析:
1、ExecutorType :执行器类型,它是一个枚举类型
public enum ExecutorType {
SIMPLE, REUSE, BATCH
}
知道了执行器类型,那我们就来了解一下执行器Executor:
它是SqlSession中真正来执行java与数据库交互的对象,提供了查询(query)、更新(update)等方法,主要有三种类型:
1、SIMPLE:简易执行器,如果不配置类型,就是默认执行器
2、REUSE:能过执行重用预处理语句的执行器
3、BATCH:执行器重用语句和批量更新,批量专用的执行
通过代码解析Mybatis中如创建执行器Executor:
Executor executor = configuration.newExecutor(tx, execType);
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
executorType = executorType == null ? defaultExecutorType : executorType;
executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
Executor executor;
// 判断执行器类型
if (ExecutorType.BATCH == executorType) {
executor = new BatchExecutor(this, transaction);
} else if (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
// 如果没有配置,默认就为SimpleExecutor
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
executor = (Executor) interceptorChain.pluginAll(executor);
return executor;
}
其中要注意这一条代码:
executor = (Executor) interceptorChain.pluginAll(executor);
注意:这个就是Mybatis中的插件,它将构建一层层的代理对象,我们可以在执行真正的Executor的方法前,执行配置插件的方法,这就是插件的原理
2、TransactionIsolationLevel :事务隔离级别类,它是一个枚举类型
public enum TransactionIsolationLevel {
NONE(Connection.TRANSACTION_NONE),
READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);
private final int level;
private TransactionIsolationLevel(int level) {
this.level = level;
}
public int getLevel() {
return level;
}
}
默认五种隔离级别:
- NONE(Connection.TRANSACTION_NONE):无隔离级别
- READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED):读取提交内容
- READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED):读取未提交内容
- REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ):可重复读
- SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE):可串行化
3、 boolean autoCommit:是否自动提交事物
恩,这个就不详细说了。。。。。