当前位置: 首页 > news >正文

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

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 接口
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 抽象类(模板方法模式的核心)
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 子类(实现具体查询操作)
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 能够有效地复用代码,并通过子类灵活地实现特定操作。这种设计不仅提高了代码的可维护性和可读性,还增强了系统的扩展性。

相关文章:

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

MyBatis 中也使用到了 模板方法模式 (Template Method Pattern)&#xff0c;主要体现在 执行 SQL 语句的流程控制 上。模板方法模式允许 MyBatis 定义数据库操作的标准流程&#xff0c;并允许子类或特定实现类去实现某些步骤。这种模式使得 MyBatis 能够在处理不同类型的 SQL 操…...

【进阶系列】python简单爬虫实例

python有一个很强大的功能就是爬取网页的信息&#xff0c;这里是CNBlogs 网站&#xff0c;我们将以此网站为实例&#xff0c;爬取指定个页面的大标题内容。代码如下&#xff1a; 首先是导入库&#xff1a; # 导入所需的库 import requests # 用于发送HTTP请求 from bs4 impor…...

️虚拟机配置NAT和Bridge模式

虚拟机的网络配置 桥接 通过使用物理机网卡 具有单独ip NAT 把物理机为路由器进行上网 NAT模式&#xff1a; 所谓nat模式&#xff0c;就是虚拟系统会通过宿主机的网络来访问外网&#xff0c;而这里的宿主机相当于有两个网卡&#xff0c;一个是真实网卡&#xff0c;一个是虚拟…...

解决Spring Boot整合Redis时的连接问题

前言 在使用Spring Boot整合Redis的过程中&#xff0c;经常会遇到连接问题&#xff0c;尤其是当Redis服务部署在远程服务器上时。 问题描述 当你尝试连接到Redis服务器时&#xff0c;可能会遇到以下错误&#xff1a; org.springframework.data.redis.connection.PoolExcept…...

109. UE5 GAS RPG 实现检查点的存档功能

在这一篇文章里&#xff0c;我们接着实现存档的功能&#xff0c;保存当前玩家的生成位置&#xff0c;游戏里有很多中方式去实现玩家的位置存储&#xff0c;这里我们采用检查点的方式&#xff0c;当玩家接触到当前检查点后&#xff0c;我们可以通过检查点进行保存玩家的状态&…...

springboot005基于springboot学生心理咨询评估系统得设计与实现。

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

ESC算法/逃生:一种基于人群疏散行为的优化方法

文章介绍了一种有用的算法&#xff0c;称为逃生或逃生算法&#xff08;ESC&#xff09;&#xff0c;受人群疏散行为的启发&#xff0c;用于解决现实世界的案例和基准问题。ESC算法模拟了疏散过程中人群的行为&#xff0c;其中人群在探索阶段被分为平静、羊群和恐慌组&#xff0…...

构建安全的数据库环境:群晖NAS安装MySQL和phpMyAdmin详细步骤

文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 本文将详细讲解如何在群晖NAS上安装MySQL及其数据库管理…...

【人工智能】深入理解图神经网络(GNN):用Python实现社交网络节点分类与分子结构分析

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 图神经网络(Graph Neural Network, GNN)是近年来在深度学习领域迅速发展的新兴方向,主要用于处理图结构数据。GNN在社交网络分析、化学分…...

Qt 日志文件的滚动写入

Qt 日志文件的滚动写入 flyfish 日志文件的滚动写入功能。在日志文件达到10MB时创建新的日志文件&#xff0c;并且在总日志文件大小达到10GB时开始覆盖最早的日志文件 以监控一个文件夹的写日志为例 日志文件创建与管理 初始化日志文件&#xff1a;在FileMonitor类的构造函…...

【c语言】数据包捕获和分析工具

请解释一下数据包捕获和分析工具&#xff08;如Wireshark&#xff09;的工作原理和用途。 数据包捕获和分析工具&#xff0c;如Wireshark&#xff08;前身为Ethereal&#xff09;&#xff0c;是一种网络协议分析软件&#xff0c;它允许用户实时监控、抓取并分析计算机网络中的网…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(2)(模拟实现)

1.概念介绍 1.1开散列 开散列&#xff08;Open Hashing&#xff09;&#xff0c;也叫链地址法&#xff0c;是一种解决哈希冲突的方法。每个哈希表槽位保存一个链表&#xff0c;所有散列到同一位置的元素都存储在该链表中。当插入元素发生冲突时&#xff0c;将新元素添加到相应…...

请描述一下JVM(Java虚拟机)的生命周期及其对应用程序性能的影响

1、请描述一下JVM&#xff08;Java虚拟机&#xff09;的生命周期及其对应用程序性能的影响。 JVM&#xff08;Java虚拟机&#xff09;的生命周期主要涉及以下几个阶段&#xff1a;加载、验证、准备、解析、执行、卸载。每个阶段都有其特定的作用和影响。 加载&#xff1a;JVM…...

展会邀约|加速科技与您相约IC China 2024!

第二十一届中国国际半导体博览会&#xff08; IC China 2024&#xff09;将于 2024 年11月18日—11月20日在北京国家会议中心举行。加速科技将携高性能测试机ST2500EX、ST2500E、eATE及全系测试解决方案亮相E2馆B150展位。博览会期间&#xff0c;将同期举办"半导体产业前沿…...

鸿蒙中服务卡片数据的获取和渲染

1. 2.在卡片中使用LocalStorageProp接受传递的数据 LocalStorageProp("configNewsHead") configNewsHeadLocal: ConfigNewsHeadInfoItem[] [] 注意&#xff1a;LocalStorageProp括号中的为第一步图片2中的键 3.第一次在服务卡片的第一个卡片中可能会获取不到数据…...

运维篇-修复centos7无法下载docker问题

修复centos7无法下载docker问题 1、安装docker时报错2、docker无法下载镜像 1、安装docker时报错 linux的centos系统&#xff0c;安装docker时会报错 –> Finished Dependency Resolution Error: Package: glibc-2.17-307.el7.1.i686 (base) Requires: glibc-common 2.17…...

【论文阅读】WaDec: Decompiling WebAssembly Using Large Language Model

论文阅读笔记:WaDec: Decompiling WebAssembly Using Large Language Model 1. 来源出处 论文标题: WaDec: Decompiling WebAssembly Using Large Language Model作者: Xinyu She, Yanjie Zhao, Haoyu Wang会议: 39th IEEE/ACM International Conference on Automated Softwar…...

redis类型介绍

1. 字符串&#xff08;String&#xff09;&#xff1a; • 简介&#xff1a;最基础的数据类型&#xff0c;可以存储任何形式的字符串&#xff0c;包括文本数据和数字数据。 • 常用操作&#xff1a;SET、GET、INCR、DECR等。 2. 列表&#xff08;List&#xff09;&#xff1a; …...

kubernetes如何配置默认存储

如果不想每次都创建PV&#xff0c;希望k8s集群中能够配置号默认存储&#xff0c;然后根据你的PVC自动创建PV&#xff0c;就需要安装一个默认存储&#xff0c;也就是storageclass 什么是storageclass Kubernetes提供了一套可以自动创建PV的机制&#xff0c;即&#xff1a;Dyna…...

【微服务】Spring AI 使用详解

目录 一、前言 二、Spring AI 概述 2.1 什么是Spring AI 2.2 Spring AI 特点 2.3 Spring AI 带来的便利 2.4 Spring AI 应用领域 2.4.1 聊天模型 2.4.2 文本到图像模型 2.4.3 音频转文本 2.4.4 嵌入大模型使用 2.4.5 矢量数据库支持 2.4.6 数据工程ETL框架 三、Sp…...

告别Makefile!用Zig 0.10.0自带的构建系统搞定ARM裸机开发(附完整项目配置)

用Zig构建系统重塑ARM裸机开发&#xff1a;告别Makefile的终极指南 当你在凌晨三点盯着第47个Makefile规则调试链接器错误时&#xff0c;是否想过——嵌入式开发必须这么痛苦吗&#xff1f;Zig 0.10.0带来的不仅是一门新语言&#xff0c;更是一套彻底革新裸机开发工作流的构建系…...

VSCode远程连接报错?手把手教你修复settings.json文件(附常见错误排查)

VSCode远程连接报错终极排查指南&#xff1a;从settings.json修复到SSH配置优化 当你正准备通过VSCode远程连接服务器投入工作时&#xff0c;突然弹出的Failed to write remote.SSH.remotePlatform报错就像一盆冷水浇下来。更令人抓狂的是&#xff0c;明明命令行SSH连接一切正常…...

【linux】Xorg与X Window System的交互机制解析

1. X Window System与Xorg的关系 当你打开Linux电脑看到图形界面时&#xff0c;背后默默工作的就是X Window System。这个诞生于1984年的图形系统至今仍是Linux桌面环境的基石&#xff0c;而Xorg则是它的现代实现版本。简单来说&#xff0c;X Window System定义了图形显示的标准…...

IT 流程越来越完整,但管理反而变得更难了

在很多企业的 IT 管理过程中&#xff0c;一个非常明显的趋势是&#xff1a;流程在不断增加。 从最初的简单问题处理&#xff0c;到后来的事件管理、问题管理、变更管理&#xff0c;再到审批流程、发布流程&#xff0c;各类流程逐渐被建立起来。从管理角度看&#xff0c;这是一种…...

体验开发新范式:如何用快马平台的AI大模型将想法直接变成代码

最近尝试用AI辅助开发工具来快速实现一个任务管理应用&#xff0c;整个过程让我对现代开发方式有了全新认识。和大家分享一下这个有趣的实践经历&#xff1a; 需求分析阶段 传统开发需要先梳理功能清单&#xff0c;但这次我直接把自然语言描述输入到InsCode(快马)平台的AI对话框…...

音频可视化工具:Lano Visualizer打造沉浸式桌面音乐体验

音频可视化工具&#xff1a;Lano Visualizer打造沉浸式桌面音乐体验 【免费下载链接】Lano-Visualizer A simple but highly configurable visualizer with rounded bars. 项目地址: https://gitcode.com/gh_mirrors/la/Lano-Visualizer 在数字生活中&#xff0c;音乐不…...

用Arduino UNO R3和面包板,从零组装你的第一台meArm机械臂(附电源模块避坑指南)

用Arduino UNO R3和面包板&#xff0c;从零组装你的第一台meArm机械臂&#xff08;附电源模块避坑指南&#xff09; 当你第一次看到meArm机械臂灵活抓取物体的视频时&#xff0c;是否也想过自己动手组装一台&#xff1f;作为开源硬件领域的经典项目&#xff0c;meArm以其精巧的…...

MMC级联H桥仿真图解析:电压电流双闭环控制策略研究

MMC&#xff0c;级联H桥仿真图&#xff0c;电压电流双闭环。最近在搞MMC&#xff08;模块化多电平换流器&#xff09;的仿真&#xff0c;发现这玩意儿真是电力电子界的乐高——全靠子模块堆叠。特别是级联H桥的结构&#xff0c;玩电压合成比搭积木刺激多了。今天咱们就着电压电…...

瑞萨RA6E2评估板Keil MDK5开发全攻略:从RA Smart Configurator到烧录调试

瑞萨RA6E2评估板Keil MDK5开发全流程实战指南 对于嵌入式开发者而言&#xff0c;瑞萨RA6E2系列MCU凭借其高性能和丰富外设正成为工业控制、物联网终端设备的优选方案。而Keil MDK5作为Arm生态中最成熟的开发环境之一&#xff0c;与瑞萨官方工具链的深度整合为开发者提供了高效…...

脑皮层房地产:公司在我的神经突触建数据中心

在数字时代的浪潮中&#xff0c;一个颠覆性的概念正在兴起&#xff1a;企业将数据中心直接构建于人类神经突触之上&#xff0c;仿佛一场“脑皮层房地产”的革命。这并非科幻小说的臆想&#xff0c;而是对现代分布式系统和人工智能架构的深刻隐喻。对于软件测试从业者而言&#…...