不清楚的同学 参考mybatis(第四天)研究mybatis源码第二天
方法里调用 DefaultSqlSessionFactory的openSession() 来创建SqlSession 对象
openSession()方法调用了 openSessionFromDataSource()方法,即
public SqlSession openSession() {
return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
}
传入参数为configuration.getDefaultExecutorType() ,ExecutorType 这样三个类型 即 SIMPLE, REUSE, BATCH ,后面创建哪个类型的执行器就是根据这个参数,然后创建了 SimpleExecutor 简单执行器 ,即
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 {
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
executor = (Executor) interceptorChain.pluginAll(executor);
return executor;
}
然后把这几个参数传递过来,创建了SqlSession
执行器只有三种 即 SimpleExecutor 简单执行器 ,ReuseExecutor重复使用执行器 , BatchExecutor批量执行器
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
ReuseExecutor:每执行一次update或select,就开启一个Statement对象,用完不关闭放进map内 供下次使用
BatchExecutor:没有select 只有 update ,等待数据都添加到批处理中,一起处理,它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理
Executor的这些特点,都严格限制在SqlSession生命周期范围内。