该系列文章针对 Mybatis 3.5.1 版本
Executor
的实现涉及到了两种设计模式:模板方法模式,装饰者模式
核心处理层完成的工作就是 SQL 的执行,整个操作流程由几个组件类组成,这几个组建类的组合执行逻辑图如下:
图片来自《Mybatis 技术内幕》
![[Mybatis]-[核心处理层]-Executor执行器](https://www.zyxiao.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
如图所示,Executor
是整个SQL 执行的入口。
一、Executor 实现类简介
Mybatis 针对执行器进行了统一的接口定义,
定义接口类为 org.apache.ibatis.executor.Executor
,
相关实现类类图如下:
![[Mybatis]-[核心处理层]-Executor执行器](https://www.zyxiao.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
如上图,Executor
实现类有五个,从功能上划分, Executor
实现类只有三个,
分别为:ReuseExecutor
、SimpleExecutor
、BatchExecutor
。BaseExecutor
和 CachingExecutor
不包括在内。
对于抽象类 BaseExecutor
来说,它是一个抽象模板,定义了 Executor
执行的基础流程,并实现了部分通用的代码,从功能上来说,并不是完整的 Executor
实现。
对装饰类 CachingExecutor
,其本身不具备 Executor
执行器功能,CachingExecutor
是一个装饰类,用来给其他三个执行器的执行(ReuseExecutor
、SimpleExecutor
、BatchExecutor
) 进行二级缓存功能增强用的,所以从功能上来说也不是一个具有执行器功能的 Executor
下面分别对上述这 五个接口实现类进行简单剖析。
1.1、BaseExecutor
BaseExecutor
实现了 Executor
接口。
BaseExecutor
是一个抽象模板类,类中定义了 Executor
执行器功能操作的执行流程,
并对通过的流程代码进行了实现。
BaseExecutor
模板规范了 Executor
流程,比如:针对查询流程,BaseExecutor
定义了一级缓存实现,并对相关操作进行了通用实现,如:针对查询的执行流程模板如下:
- 查询一级缓存
- 缓存命中,返回,否则进入下一步
- 查询数据库(该操作尤其子类实现)
- 返回数据库结果,同时缓存数据库操作
相关关键代码实现如下:(BaseExecutor#query
)
![[Mybatis]-[核心处理层]-Executor执行器](https://www.zyxiao.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
BaseExecutor
执行模板流程大致是这样,这里不讨论具体细节。模板模式:固化操作流程模板,针对特定步骤由其子类定制化实现。
1.2、SimpleExecutor
SimpleExecutor
继承了抽象父类 BaseExecutor
。
SimpleExecutor
是 Executor
功能实现中,最简单的实现类。
SimpleExecutor
进行 SQL 查询的相关操作流程如下(update类似
):
![[Mybatis]-[核心处理层]-Executor执行器](https://www.zyxiao.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
如上图,SimpleExecutor
在 BaseExecutor
无法命中缓存时,构建 StatementHandler
,将SQL的执行操作委派给 StatementHandler
完成,。
StatementHandler
的具体操作是通过组合:
ParameterHandler
:用于拼接 SQL 参数,拼接完整的SQL语句- JDBC 原生
Statement
:用于执行SQL ResultSetHandler
:用于将SQL查询结果集,映射成 Java 对象
来完成 SQL 语句的执行操作。
1.3、ReuseExecutor
ReuseExecutor
继承了抽象父类 BaseExecutor
。
ReuseExecutor
实现和 SimpleExecutor
的操作实现基本相同,ReuseExecutor
不同于 SimpleExecutor
的地方在于 ReuseExecutor
维护了 Statement
缓存。
下面来对比一下 ReuseExecutor
和 SimpleExecutor
获取 Statement
代码的差异:
![[Mybatis]-[核心处理层]-Executor执行器](https://www.zyxiao.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
通过代码对比,能够知道两者进行 Statement 对象预处理的操作流程是一样的,不同点在于 ReuseExecutor
进行了缓存处理。
ReuseExecutor
通过复用 Statement
,减少 SQL 预编译的开销,以及创建和销毁的开销,以此达到提高性能的效果。
1.4、BatchExecutor
BatchExecutor
顾名思义,具有批量操作功能。BatchExecutor
支持除 select
查询语句外,增删改的批量操作。通过批量发送 SQL ,减少网络开销,以此达到提高性能的效果。
SQL条数存在上限,超过上限会抛出异常,SQL语句上限可以通过:max_allowed_packet 参数进行配置。
1.5、CachingExecutor
CachingExecutor
不具备 Executor
执行器功能,CachingExecutor
是一个装饰器, Mybatis 采用装饰者模式对 Executor
执行器提供了功能增强。
CachingExecutor
装饰器能够使得被装饰的 Executor
具备二级缓存功能。二级缓存介绍
二、`Executor` 功能
Executor
是 Mybatis 核心处理层 SQL执行的执行入口。
Executor 管理了一级缓存、二级缓存,通过组合 StatementHandler
、ParameterHandler
、ResultSetHandler
完成 SQL 拼接、SQL 执行 和 结果集映射。
来源:花好夜猿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/89795