[Mybatis]-[核心处理层]-Executor执行器

该系列文章针对 Mybatis 3.5.1 版本

Executor 的实现涉及到了两种设计模式:模板方法模式,装饰者模式

核心处理层完成的工作就是 SQL 的执行,整个操作流程由几个组件类组成,这几个组建类的组合执行逻辑图如下:

图片来自《Mybatis 技术内幕》

[Mybatis]-[核心处理层]-Executor执行器

如图所示,Executor是整个SQL 执行的入口。

一、Executor 实现类简介

Mybatis 针对执行器进行了统一的接口定义,
定义接口类为 org.apache.ibatis.executor.Executor,
相关实现类类图如下:

[Mybatis]-[核心处理层]-Executor执行器

如上图,Executor 实现类有五个,从功能上划分, Executor 实现类只有三个,
分别为:ReuseExecutor 、SimpleExecutorBatchExecutor 。
BaseExecutor和 CachingExecutor 不包括在内。

对于抽象类 BaseExecutor 来说,它是一个抽象模板,定义了 Executor 执行的基础流程,并实现了部分通用的代码,从功能上来说,并不是完整的 Executor 实现。

对装饰类 CachingExecutor ,其本身不具备 Executor 执行器功能,CachingExecutor是一个装饰类,用来给其他三个执行器的执行(ReuseExecutorSimpleExecutorBatchExecutor) 进行二级缓存功能增强用的,所以从功能上来说也不是一个具有执行器功能的 Executor

下面分别对上述这 五个接口实现类进行简单剖析。

1.1、BaseExecutor

BaseExecutor 实现了 Executor 接口。

BaseExecutor 是一个抽象模板类,类中定义了 Executor 执行器功能操作的执行流程,
并对通过的流程代码进行了实现。

BaseExecutor 模板规范了 Executor 流程,比如:针对查询流程,BaseExecutor 定义了一级缓存实现,并对相关操作进行了通用实现,如:针对查询的执行流程模板如下:

  • 查询一级缓存
  • 缓存命中,返回,否则进入下一步
  • 查询数据库(该操作尤其子类实现)
  • 返回数据库结果,同时缓存数据库操作

相关关键代码实现如下:(BaseExecutor#query

[Mybatis]-[核心处理层]-Executor执行器

BaseExecutor 执行模板流程大致是这样,这里不讨论具体细节。

模板模式:固化操作流程模板,针对特定步骤由其子类定制化实现。

一级缓存介绍

1.2、SimpleExecutor

SimpleExecutor 继承了抽象父类 BaseExecutor

SimpleExecutor 是 Executor 功能实现中,最简单的实现类。

SimpleExecutor 进行 SQL 查询的相关操作流程如下(update类似):

[Mybatis]-[核心处理层]-Executor执行器

如上图,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执行器

通过代码对比,能够知道两者进行 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 、ParameterHandlerResultSetHandler 完成 SQL 拼接、SQL 执行 和 结果集映射。

来源:花好夜猿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/89795

发表评论

登录后才能评论
侵权联系
返回顶部