咳咳~睡醒脑子一热就想看看mybatis的源码,乱点一通于是发现了之前从未注意到的点 ~
总所周知,sqlsession是通过sqlSessionFactory.openSession()获取的
🐕一起来看看openSession()它到底肿么了?
点进去,发现有两个实现方法
先进去SqlSessionManager看看🐕
好家伙,走的还是SqlSessionFactory类
看来是应该走 DefaultSqlSessionFactory 这个类了
冒昧的进来看看~
@Override
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
先了解一下参数是啥意思,懵懵的!
看看执行器类型是什么鬼!
点进去
看到他返回的是默认的执行器类型
终于,原来它的默认执行器类型是simple啊,意思就是 类型为 简单
类型
那再看看它有多少种类型叭?
那好,参数了解完,进入 openSessionFromDataSource 方法看看
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);
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();
}
}
发现它最终返回的是一个 DefaultSqlSession
而 DefaultSqlSession 里面又包含了 执行数据库操作的相关CRUD方法
验证了我们的注释