上篇文章介绍了mybatis中的关键对象SqlSessionFactory的创建过程,本篇文章继续介绍下执行器executor。每个SqlSession都会拥有一个Executor对象,这个对象负责增删改查操作,我们可以简单的将它理解为JDBC中Statement的封装版
executor继承结构
image- Executor接口:有两个实现类BaseExecutor、CachingExecutor
- BaseExecutor:是一个抽象类,抽象类实现接口是”适配器模式“的体现,为了方便下一级实现类对接口中方法的实现;BaseExecutor有三个子类分别是simpleExecutor、ResuseExecutor、BatchExecutor
- SimpleExecutor:是MyBatis中默认使用的执行器. 每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。(可以是Statement或PrepareStatement对象)
- ReuseExecutor:可重用执行器,这里的重用指的是重复使用Statement. 它会在内部利用一个Map把创建的Statement都缓存起来,每次在执行一条SQL语句时,它都会去判断之前是否存在基于该SQL缓存的Statement对象,存在而且之前缓存的Statement对象对应的Connection还没有关闭的时候就继续用之前的Statement对象,否则将创建一个新的Statement对象,并将其缓存起来。因为每一个新的SqlSession都有一个新的Executor对象,所以我们缓存在ReuseExecutor上的Statement的作用域是同一个SqlSession
- BatchExecutor:批处理执行器,.用于将多个sql语句一次性输送到数据库执行.
- CachingExecutor:缓存执行器, 先从缓存中获取查询结果,存在就返回,不存在,再委托给Executor delegate去数据库取,delegate可以是上面任一的SimpleExecutor、ReuseExecutor、BatchExecutor
Executor的创建
在SqlSessionFactory创建完成后,调用openSession方法:
public SqlSession openSession() {
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}
在SqlSessionFactory的默认实现类DefaultSqlSessionFactory可以看到openSession中调用了openSessionFromDataSource,在这个方法中会创建一个执行器,代码如下
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
DefaultSqlSession var8;
try {
Environment environment = this.configuration.getEnvironment();
TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
Executor executor = this.configuration.newExecutor(tx, execType);
var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
} catch (Exception var12) {
this.closeTransaction(tx);
throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12);
} finally {
ErrorContext.instance().reset();
}
return var8;
}
执行器对象是由Coniguration对象负责创建的.Configuration对象会根据得到ExecutorType创建对应的Excecutor对象,并把这个Excecutor对象传给SqlSession对象
ExcecutorType的选择
ExecutorType来决定Configuration对象创建何种类型的执行器.它的赋值可以通过两个地方进行赋值.
首先.可以通过<settings>标签来设置当前工程中所有SqlSession对象使用的默认Executour
image也可以通过SqlSessoinFactory中openSession方法来指定具体的SqlSession使用的执行器
image原文地址
网友评论