Mybatis框架之模板方法模式 (Template Method Pattern)

embedded/2024/11/19 17:02:41/

MyBatis 中也使用到了 模板方法模式 (Template Method Pattern),主要体现在 执行 SQL 语句的流程控制 上。模板方法模式允许 MyBatis 定义数据库操作的标准流程,并允许子类或特定实现类去实现某些步骤。这种模式使得 MyBatis 能够在处理不同类型的 SQL 操作(如查询、插入、更新、删除)时保持整体流程的一致性,同时具备灵活性去处理每种操作的具体细节。

1. 什么是模板方法模式 (Template Method Pattern)?

模板方法模式 是一种行为设计模式,它定义了一个操作中的算法骨架,而将某些步骤的实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的前提下重新定义算法中的某些步骤。

模板方法模式的特点

  • 算法骨架:定义操作的基本步骤,且步骤的执行顺序是固定的。
  • 延迟实现:某些具体步骤的实现被延迟到子类中,允许子类提供自己的实现。
  • 代码复用:通过抽象类实现通用的逻辑,从而减少重复代码。

2. MyBatis 中模板方法模式的应用

在 MyBatis 中,模板方法模式的主要应用场景是 执行 SQL 语句的核心流程。MyBatis 使用模板方法模式来定义执行 SQL 的标准流程(如查询、插入、更新、删除),并允许不同的 Mapper 操作去实现各自的 SQL 逻辑。

MyBatis 的 Executor 类及其子类是模板方法模式的典型实现。Executor 是 MyBatis 中执行 SQL 语句的核心组件,通过模板方法模式来管理数据库操作的整个流程。

3. MyBatis 模板方法模式的实现流程

3.1 Executor 接口和 BaseExecutor
  • Executor 接口:定义了 MyBatis 中执行操作的通用方法,如 queryupdate 等。
  • BaseExecutor:实现了 Executor 接口中的模板方法,同时定义了操作的标准流程。
    • 例如:查询时,BaseExecutor 定义了一个通用的查询模板方法,包含缓存检查、执行查询、缓存结果等步骤。
3.2 MyBatis 中模板方法的核心逻辑

查询操作 为例,MyBatis 中的查询操作遵循以下模板方法流程:

  1. 检查是否启用 一级缓存
  2. 如果缓存命中,则直接返回缓存结果。
  3. 否则,调用子类的方法执行数据库查询。
  4. 将查询结果存入一级缓存。
  5. 返回查询结果。

4. 实际代码示例

为了更好地理解 MyBatis 中的模板方法模式,下面以 MyBatis 的 Executor 机制为例进行讲解。

4.1 Executor 接口
java">public interface Executor {// 查询方法<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler);// 更新方法(包括插入、更新、删除)int update(MappedStatement ms, Object parameter);// 关闭 Executorvoid close();
}
4.2 BaseExecutor 抽象类(模板方法模式的核心)
java">public abstract class BaseExecutor implements Executor {private Cache localCache = new Cache();@Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) {// Step 1: 先从一级缓存中查找List<E> list = localCache.getObject(ms.getId());if (list != null) {return list; // 如果缓存命中,则直接返回}// Step 2: 缓存未命中,执行数据库查询list = doQuery(ms, parameter, rowBounds, resultHandler);// Step 3: 将结果存入一级缓存localCache.putObject(ms.getId(), list);return list; // 返回查询结果}// 定义了一个抽象方法,由子类实现具体的查询逻辑protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler);
}
4.3 SimpleExecutor 子类(实现具体查询操作)
java">public class SimpleExecutor extends BaseExecutor {@Overrideprotected <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) {// 这里是执行具体的 SQL 查询逻辑StatementHandler handler = new StatementHandler();return handler.query(ms, parameter, rowBounds, resultHandler);}
}

5. 模板方法模式在 MyBatis 中的执行流程

  1. 用户通过 MyBatis SqlSession 调用 Mapper 接口的查询方法。
  2. SqlSession 调用 Executor.query() 方法。
  3. Executor.query() 方法在 BaseExecutor 中被定义,它遵循以下流程:
    • 检查一级缓存是否命中。
    • 如果缓存未命中,则调用 doQuery() 方法。
    • doQuery() 方法在 SimpleExecutor 中实现,负责执行真正的 SQL 查询。
    • 将查询结果存入缓存,并返回给用户。

6. 模板方法模式的优势

  • 代码复用模板方法模式BaseExecutor 中封装了通用的查询流程,使得不同的 Executor 子类可以复用这些逻辑。
  • 解耦和扩展性:通过定义抽象方法(如 doQuery()),模板方法模式允许子类实现自己的具体逻辑,而不必改变整体流程。
  • 一致性:模板方法确保了所有的查询操作都遵循相同的流程,提高了一致性。

7. 模板方法模式的不足

  • 继承的局限:由于模板方法模式依赖于继承,所有的子类都必须是抽象类的子类,这限制了类的灵活性。
  • 增加复杂度模板方法模式可能会增加类的层次和复杂度,尤其是在流程较为复杂的情况下。

8. 总结

MyBatis 中的模板方法模式主要体现在 Executor 的设计上,通过定义标准化的数据库操作流程(如查询和更新),确保不同的执行器遵循一致的操作步骤。模板方法模式使 MyBatis 能够有效地复用代码,并通过子类灵活地实现特定操作。这种设计不仅提高了代码的可维护性和可读性,还增强了系统的扩展性。


http://www.ppmy.cn/embedded/138820.html

相关文章

数据结构——排序(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

【C++】哈希表实现

人这辈子最可悲的是道理明白却执迷不悟。最可恨的是爱来爱去但真正在乎的其实是自己。最后悔的是为了世俗错过了本该美好的时光。最遗憾的是很简单的东西却给不了彼此。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;哈希基本…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…

Spring Data Redis常见操作总结

我列出来的都是最常用的&#xff0c;其他的你要自己去搜搜 1. 列表类型数据 Autowired private RedisTemplate<String ,Object> redisTemplate;public void f1() {String k "key";ListOperations<String, Object> list redisTemplate.opsForList();r…

为什么TikTok视频上传速度慢?专线网络与VPN的影响分析

TikTok已成为全球最受欢迎的短视频平台&#xff0c;用户不仅在上面观看内容&#xff0c;也经常进行视频创作与分享。然而&#xff0c;许多用户在上传视频时遇到上传速度缓慢、卡顿、超时等问题&#xff0c;这让上传自己精心制作的视频变得不那么顺利。除去视频文件大小、设备性…

使用 GoZero 实现读取绩效表格 Excel 并打分

以下是一个使用GoZero框架读取Excel并进行打分的简化示例。假设我们有一个Excel文件&#xff0c;其中第一列包含绩效数据&#xff0c;我们将根据这些数据给出打分。 首先&#xff0c;需要安装GoZero依赖&#xff1a; go get -u github.com/tal-tech/go-zero/tools/goctl 然后…

基于YOLOv8深度学习的智慧城市管理井盖状态检测系统(PyQt5界面+数据集+训练代码)

本研究设计并实现了一种基于YOLOv8深度学习的智慧城市管理井盖状态检测系统&#xff0c;旨在提高城市井盖管理的效率与安全性&#xff0c;减少因井盖缺失或损坏而可能带来的安全隐患。井盖作为城市基础设施的重要组成部分&#xff0c;其状态直接关系到行人和车辆的安全。传统的…

【分布式技术】分布式缓存技术-旁路缓存模式(Cache Aside Pattern)

旁路缓存模式介绍 概述1. 读取操作&#xff08;Read&#xff09;2. 写入操作&#xff08;Write&#xff09;3. 一致性问题4. 解决方案 适用于哪些场景&#xff1f;如何保证数据一致性&#xff1f;1. 延时双删策略具体是怎么工作的&#xff1f;写操作&#xff08;更新或删除数据…