1.SqlSessionFactory 创建
接上文在解析完配置标签后,开始创建核心对象SqlSessionFactory
public SqlSessionFactory build(Configuration config) {
//创建默认的DefaultSqlSessionFactory
return new DefaultSqlSessionFactory(config);
}
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}
new 默认的工厂DefaultSqlSessionFactory,并赋值解析完成的configuration对象
2.SqlSession
SqlSession对应数据操作的一次会话,接下来分析SqlSession的创建
通过DefaultSqlSessionFactory 的openSession()创建
@Override
public SqlSession openSession(TransactionIsolationLevel level) {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), level, false);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level,
boolean autoCommit) {
//包装数据库连接。处理连接生命周期,包括:其创建、准备、commitrollback 和 close。
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);
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();
}
}
- Transaction 包含数据的操作 获取连接,提交,回滚,关闭连接
- 执行器创建
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
executorType = executorType == null ? defaultExecutorType : executorType;
Executor executor;
if (ExecutorType.BATCH == executorType) {
executor = new BatchExecutor(this, transaction);
} else if (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
//默认的SIMPLE 执行器
executor = new SimpleExecutor(this, transaction);
}
//二级缓存 开关 <setting name="cacheEnabled" value="true"/> value false 关闭二级缓存
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
//将插件逻辑植入执行器中
return (Executor) interceptorChain.pluginAll(executor);
}
Transaction tx = null;
3.总结
最终创建一个DefaultSqlSession,里面设置Configuration对象,执行器Executor