上节分析我们已经拿到了sqlsessionFactory工厂
具体怎么执行sql呢 开始分析
通过测试案例 我们看到了 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);
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();
}
}
看到这就一个小面试题
sql 执行器有几种 ?
分别是什么?
都是什么用途 ?
直接看源码找到答案
public enum ExecutorType {
//默认执行器 简单执行器 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
SIMPLE,
//执行器会重用预处理语句
REUSE,
//批量执行器 执行器不仅重用语句还会执行批量更新
BATCH
}
看到这 sqlsession就拿到了
拿到sqlsession就开始执行getMapper分析
抽丝剥茧最后会找到MapperRegistry.class
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
//knownMappers 中获取我们制定的类 knownMappers是时候初始化的呢
//其实是在我们创建sqlSessionFactory的时候做的
final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
if