在MyBatis中,执行器(Executor)有着非常重要的作用,它是一个真正执行Java和数据库交互的东西。 在MyBatis配置文件中,可以通过如下方式设置默认执行器
1 |
|
defaultExecutorType有3个取值范围,SIMPLE、REUSE、BATCH。
SIMPLE,简易执行器,是默认的执行器。
REUSE,重复使用预处理语句。
BATCH,可以重复执行语句和批量更新,是针对批量专用的执行器。
MyBatis中3种执行器之间的类图关系如下:
下面来看看Executor接口, 它主要提供了update、query方法及事物相关的方法接口,源码如下:
1 |
|
几种执行器中都提供了query和update的方法,以及Transaction相关的方法。下面我们来看一下MyBatis是如何创建Executor的,主要代码如下:
1 |
|
MyBatis会根据配置的Executor类型来确定要创建三种执行器中的哪一种,在创建对象后,调用interceptorChain.pluginAll方法生成代理对象。
CachingExecutor
缓存执行器,query前先查找缓存,有的话直接从缓存取出数据,没有的话就使用delegate调用BaseExecutor的query从数据库取数据,并将查询结果存入缓存中。
1 |
|
BaseExecutor
BaseExecutor是一个抽象类,其实现了接口Executor的部分方法。BaseExecutor使用了模板模式,定义了doUpdate、doFlushStatements和doQuery抽象方法,然后在其子类SimpleExecutor、ReuseExecutor和BatchExecutor中来实现这三个方法。
1 |
|
SimpleExecutor
SimpleExecutor是一个简单的执行类,通过StatementHandler来执行sql,执行完毕后调用closeStatement方法关闭Statement,源码及分析如下:
1 |
|
ReuseExecutor
ReuseExecutor可重用执行器,其定义了一个Map<String, Statement>,将执行的sql作为key,将Statement作为value保存,这样执行相同的sql时就可以使用已经存在的Statement,就不需要新创建了。与SimpleExecutor相比,每次调用doUpdate、doQuery方法后不再使用closeStatement方法关闭Statement。源码如下:
1 |
|
BatchExecutor
BatchExecutor可以重复执行语句和批量更新,通过批量操作来提高性能。
1 |
|