写于:2020-01-23 08:52:37

基础支持层” 提供的基础数据和基础功能模块,为 “核心处理层” 完成 SQL 语句的执行 提供了基础。

“核心处理层” 执行 SQL 语句的过程大体可以分为几个部分,这几个部分分别对应了几个 Mybatis 定义的组件类:

  • Executor 其本身并不进行 SQL 语句的操作执行,只负责维护一级缓存和二级缓存,并提供事务管理的相关操作。
  • StatementHandler StatementHandler 负责管理 SQL 拼接、执行和 结果集映射。
    • ParameterHandler:进行 SQL 参数拼接,组装完整的 SQL 语句。
    • java.sql.Statement: 原生 JDBC 进行 SQL 执行。
    • ResultSetHandler:进行JDBC 结果集 到 JAVA 对象的 映射。

各个组件的组成的 SQL 执行流程大致如下图:

SQL执行流程图

根据图示,从核心层最上层 Executor ,从上至下进行分析。

# 核心层-Executor

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

Executor类图

所有的 执行器 都实现了 Executor 接口

# Executor 简介

Mybatis 中 Executor 的实现

# BaseExecutor

BaseExecutor 是一个实现了 Executor 接口的抽象类,实现了 Executor 大部分的方法。并提供了一级缓存功能。 对于其子类来说 BaseExecutor 使用模板方法模式 定义了大部分公共的方法。

# SimpleExecutor

SimpleExecutor 继承了抽象父类 BaseExecutor ,它是 Executor 最简单的实现类。Executor 基础的实现和一级缓存的实现使用模板方法模式固定在了 BaseExecutor。

SimpleExecutor 在 Executor 无法命中缓存时,构建 StatementHandler ,将SQL的执行操作委派给 StatementHandler 实现完成。

# ReuseExecutor

ReuseExecutor 继承了抽象父类 BaseExecutor,基本实现和 SimpleExecutor 基本一致,不同点在于 ReuseExecutor 维护了 Statement 的缓存,通过 重用 Statement 对象减少 SQL 预编译的开销以及创建和销毁的开销,从而提高性能,起到优化的效果。

# BatchExecutor

通常执行 SQL 都是执行一条与SQL语句就向数据库发送一次请求,很多时间都浪费在网络通信上。通过批量发送 SQL ,可以减少网络开销,提供性能。 (不过SQL条数有上限,超过上限会抛出异常,SQL语句上限可以通过:max_allowed_packet 参数进行配置。)

# CachingExecutor

CachingExecutor 是 Cache 接口的一个装饰器,它为 Executor 对象增加了二级缓存的功能。

精彩内容推送,请关注公众号!
最近更新时间: 3/24/2020, 9:44:42 PM