openSession
SqlSession 用于与数据库进行一次会话, 需要从 SqlSessionFactory 中获取, 查看其 openSession 方法
// 一路调用来到这个方法
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
// 事务管理
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
// 创建执行器, 共有三种类型可选
final Executor executor = configuration.newExecutor(tx, execType);
// 封装到 SqlSession 对象中
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();
}
}
Executor
执行器, 四大对象之一, 有三种可选
public enum ExecutorType {
// 分别对应三种模式 : 普通, 复用, 批量
SIMPLE, REUSE, BATCH
}
在 Configuration 创建执行器的时候, 会被拦截器拦截, 所以可以实现 Interceptor 接口拓展 mybatis
public Executor