Mybatis框架之建造者模式 (Builder Pattern)
MyBatis 框架中大量使用了 建造者模式 (Builder Pattern) 来构建复杂的对象,尤其是在 SQL 语句的解析、配置对象的创建以及动态 SQL 的生成 等方面。建造者模式使得 MyBatis 能够更灵活、清晰地构建对象,尤其是那些需要多步创建和配置的复杂对象。
1. 什么是建造者模式 (Builder Pattern)?
建造者模式 是一种创建型设计模式,用于将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
特点:
- 分步构建:将对象的构建过程分为多个步骤,每一步负责配置对象的某一部分。
- 解耦构建和表示:建造者模式将对象的构建过程与对象的表示分离,使得我们可以通过不同的建造者创建不同的对象表示。
- 易于扩展:通过定义新的建造者类,可以轻松扩展对象的创建方式。
2. MyBatis 中建造者模式的应用场景
在 MyBatis 中,建造者模式被广泛应用于以下几个场景:
SqlSessionFactoryBuilder:用于创建SqlSessionFactory对象。XMLConfigBuilder和XMLMapperBuilder:用于解析 XML 配置文件和映射文件。- 动态 SQL 语句构建:通过
SQL类来动态生成 SQL 语句。
3. MyBatis 建造者模式的实现
3.1 SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 是 MyBatis 中最典型的建造者模式的实现,它用于构建 SqlSessionFactory 对象。SqlSessionFactory 是 MyBatis 的核心接口,用于创建 SqlSession,而 SqlSession 则是用于执行 SQL 语句、获取 Mapper 实例的接口。
构建流程:
- 加载 MyBatis 配置文件。
- 解析配置文件,构建
Configuration对象。 - 使用
Configuration对象创建SqlSessionFactory实例。
代码示例:
Step 1: 使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Step 2: 解析配置文件 (SqlSessionFactoryBuilder 源码示例)
public class SqlSessionFactoryBuilder {public SqlSessionFactory build(InputStream inputStream) {// 1. 创建 XML 配置解析器XMLConfigBuilder parser = new XMLConfigBuilder(inputStream);// 2. 解析配置文件并构建 Configuration 对象Configuration configuration = parser.parse();// 3. 使用 Configuration 对象创建 SqlSessionFactoryreturn new DefaultSqlSessionFactory(configuration);}
}
Step 3: 解析 XML 配置文件 (XMLConfigBuilder 源码示例)
public class XMLConfigBuilder {private Configuration configuration;public XMLConfigBuilder(InputStream inputStream) {this.configuration = new Configuration();this.parser = new XPathParser(inputStream);}public Configuration parse() {// 解析 <environments>、<mappers> 等标签parseConfiguration(parser.evalNode("/configuration"));return configuration;}private void parseConfiguration(XNode root) {// 解析不同的配置节点environmentsElement(root.evalNode("environments"));mappersElement(root.evalNode("mappers"));}
}
4. MyBatis 中的动态 SQL 构建
MyBatis 还使用建造者模式来构建动态 SQL 语句。通过 SQL 类 提供一种灵活的方式来动态构建复杂的 SQL 语句。
示例代码:
import org.apache.ibatis.jdbc.SQL;public String buildSelectUserSql() {return new SQL().SELECT("id, name, email").FROM("users").WHERE("status = 'active'").ORDER_BY("created_at DESC").toString();
}
生成的 SQL 语句为:
SELECT id, name, email FROM users WHERE status = 'active' ORDER BY created_at DESC;
解析:
SQL类是 MyBatis 提供的一个内置的建造者工具,用于动态拼接 SQL 语句。- 每个方法(如
SELECT()、FROM()、WHERE()等)都会返回当前对象 (this),从而支持链式调用。
5. MyBatis 中 MapperBuilderAssistant
MyBatis 还使用了 MapperBuilderAssistant 类来帮助构建 Mapper 的映射配置。
代码片段示例:
public class XMLMapperBuilder {private final MapperBuilderAssistant builderAssistant;public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource) {this.builderAssistant = new MapperBuilderAssistant(configuration, resource);}public void parse() {// 解析 SQL 语句builderAssistant.addMappedStatement(id, sqlSource, ...);}
}
6. MyBatis 建造者模式的优势
- 降低复杂度:将复杂对象的构建逻辑封装在建造者类中,简化了调用者的使用。
- 提高可维护性:建造者模式使得 MyBatis 的配置和对象创建更具结构化,便于后续的维护和扩展。
- 灵活性:支持通过多步骤构建对象,并允许在构建过程中动态调整配置。
- 链式调用:动态 SQL 生成器支持链式调用,代码更简洁直观。
7. 建造者模式的不足
- 增加类的数量:使用建造者模式会增加类的数量,尤其在大规模项目中,可能导致类层次复杂化。
- 学习成本:对于不熟悉设计模式的开发者,理解 MyBatis 的建造者模式可能会有一定的学习曲线。
8. 总结
MyBatis 通过建造者模式,在多个核心组件的创建过程中有效地降低了复杂度。无论是 SqlSessionFactory 的构建、Mapper 配置的解析,还是动态 SQL 语句的生成,建造者模式都扮演了重要角色。它不仅提高了代码的复用性和灵活性,还使得整个框架的设计更加模块化和可维护。因此,MyBatis 的建造者模式是其高效、简洁的核心之一。
相关文章:
Mybatis框架之建造者模式 (Builder Pattern)
MyBatis 框架中大量使用了 建造者模式 (Builder Pattern) 来构建复杂的对象,尤其是在 SQL 语句的解析、配置对象的创建以及动态 SQL 的生成 等方面。建造者模式使得 MyBatis 能够更灵活、清晰地构建对象,尤其是那些需要多步创建和配置的复杂对象。 1. 什…...
Java从入门到精通笔记篇(十三)
与流处理 ambda表达式 定义 lambda表达式不能被独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。 可将其语法用下列的方式理解 误区警示 “->”符号是由英文状态下的“-”和“>”组成的,符号之间没有空格。 lambd…...
嵌入式:STM32的启动(Startup)文件解析
相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 启动文件(Startup File)是嵌入式系统开发中的核心组件之一,它用于初始化系统并为主程序的运行做好准备。在大多数情况下,启动文件是用汇编语言编…...
ElasticSearch学习笔记四:基础操作(二)
一、前言 上一篇文章中我们学习了ES中的基础操作,包括索引和映射,同时也学习了ES中的基础数据类型,今天我们继续学习其他的数据类型。 二、复杂数据类型 1、数组(Array) 在ES中没有特别指定数据类型,换…...
ODA-em-application.log太大处理
检查oda时发现u01使用率很高,层层排查到是em-application.log文件太大 orcl2:/u01/app/oracle/product/11.2.0.4/dbhome_1/oc4j/j2ee/OC4J_DBConsole_oda1_orcl/logoda1>du -sh * 57G em-application.log 2.2M global-application.log 92M …...
基于现金红包营销活动的开源 AI 智能名片与 S2B2C 商城小程序融合发展研究
摘要:本文深入剖析现金红包这一平台补贴的营销利器在消费场景中的多元应用,并将其与开源 AI 智能名片、S2B2C 商城小程序相融合,探讨其中蕴含的创新模式与商业价值。通过详尽解析各类现金红包的使用条件,阐述如何巧妙运用这些营销…...
远程管理不再难!树莓派5安装Raspberry Pi OS并实现使用VNC异地连接
前言:大家好!今天我要教你们如何在树莓派5上安装Raspberry Pi OS,并配置SSH和VNC权限。通过这些步骤,你将能够在Windows电脑上使用VNC Viewer,结合Cpolar内网穿透工具,实现长期的公网远程访问管理本地树莓派…...
React中 setState 是同步的还是异步的?调和阶段 setState 干了什么?
React中 setState 是同步的还是异步的 1. React 的 setState 是异步的2. 为什么 setState 在合成事件和生命周期函数中是异步的3. 为什么 setState 在原生事件和定时器中是同步的4. 为什么要这样设计?调和阶段是什么setState在调和阶段干了什么?总结&…...
【D3.js in Action 3 精译_040】4.4 D3 弧形图的绘制方法
当前内容所在位置: 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建(上篇) 4.1.1 D3 中的边距约定(中篇)4.1.2 坐标轴的生成(中篇) 4.1.2.1 比例尺的声明(中篇)4.1…...
C++设计模式:抽象工厂模式(风格切换案例)
抽象工厂模式(Abstract Factory)是一种创建型设计模式,其核心思想是:为一组相关或相互依赖的对象提供一个创建接口,而无需指定它们具体的类。简单来说,就是一个工厂可以生产一系列相关的对象。 我们接下来…...
搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉
Xsens随时随地捕捉,在任何环境下实时录制或捕捉 搜维尔科技:Xsens随时随地捕捉,在任何环境下实时录制或捕捉...
爬虫基础总结 —— 附带爬取案例
Crawler —— Learning experience 数据的传输: 在OSI七层模型中,传输层为源主机和目标主机之间提供可靠的数据传输和通信服务,在该层中,有两个重要的协议—— TCP与 UDP协议。 TCP协议(传输控制协议) …...
图像处理学习笔记-20241118
文章目录 霍夫变换基本原理霍夫变换的步骤使用 OpenCV 实现直线检测示例:标准霍夫变换 示例:概率霍夫变换参数解释霍夫变换检测圆 基于GAN的样本生成GAN的基本原理基于GAN的数据增广流程实现代码示例 同态滤波(Homomorphic Filtering…...
不能打开网页,但能打开QQ、微信(三种方式)
1.VPN错误 下面三个开关全关闭 2.DNS问题 WINR 输入CMD打开命令行 命令行输入 ipconfig/flushdns 重启电脑 3.直接火绒(一键修复)...
使用 start-local 脚本在本地运行 Elasticsearch
警告:请勿将这些说明用于生产部署 本页上的说明仅适用于本地开发。请勿将此配置用于生产部署,因为它不安全。请参阅部署选项以获取生产部署选项列表。 使用 start-local 脚本在 Docker 中快速设置 Elasticsearch 和 Kibana 以进行本地开发或测试。 此设…...
计算机网络:概述知识点及习题练习
网课资源: 湖科大教书匠 1、因特网 网络之间需要路由器进行互联,互联网是网络的网络,因特网是最大的互联网,连接到网络的设备称为主机,一般不叫路由器为主机。 因特网发展:ARPNET->三级结构因特网&am…...
python蓝桥杯刷题2
1.最短路 题解:这个采用暴力枚举,自己数一下就好了 2.门牌制作 题解:门牌号从1到2020,使用for循环遍历一遍,因为range函数无法调用最后一个数字,所以设置成1到2021即可,然后每一次for循环&…...
在openi平台 基于华为顶级深度计算平台 openmind 动手实践
大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…...
KF UKF
我需要Kalman 现在,主要是用来处理检测问题情况里的漏检,因为模拟了一段2D, (x,y)的数据,为了看效果,画的线尽量简单一点: import numpy as np import matplotlib.pyplo…...
中伟视界:AI智能分析算法如何针对非煤矿山的特定需求,提供定制化的安全生产解决方案
非煤矿山智能化改造,除了政策文件,上级监管单位需要安装的AI智能分析算法功能之外的,矿方真正关心的,能解决矿方安全生产隐患的AI智能分析算法功能有哪些呢? 经过与矿方的现场交流沟通,收集第一现场人员对安…...
AXI非对齐访问实战指南:从WSTRB信号到DMA数据搬运的避坑细节
AXI非对齐访问实战指南:从WSTRB信号到DMA数据搬运的避坑细节 在FPGA与ASIC设计中,AXI总线作为AMBA协议族的核心成员,其非对齐访问特性常被开发者视为"双刃剑"。当处理摄像头YUV数据、音频采样流或网络封包等非规整数据时࿰…...
d2s-editor终极指南:5分钟学会暗黑破坏神2存档可视化编辑
d2s-editor终极指南:5分钟学会暗黑破坏神2存档可视化编辑 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2存档修改而头疼吗?复杂的十六进制编辑、看不懂的二进制数据、一不小心就损坏的…...
嵌入式无锁环形缓冲区:SPSC零依赖实现
1. 项目概述nl_ring_buffer是一个极简、零依赖、可移植的环形缓冲区(Circular Buffer)实现,专为嵌入式系统底层开发设计。其核心目标并非提供功能堆砌,而是以最小代码体积、确定性执行时间、无动态内存分配、无锁(lock…...
保姆级教程:在Windows上用CMake+QT给CloudCompare 2.13.x添加一个Standard插件(附OpenCV配置)
从零构建CloudCompare插件:Windows平台CMakeQT全流程实战指南 在三维点云处理领域,CloudCompare凭借其开源特性和丰富的插件生态,已成为研究人员和工程师的首选工具之一。但对于刚接触插件开发的初学者而言,从环境配置到成功编译第…...
ZeroOmega终极指南:3分钟掌握智能代理规则配置
ZeroOmega终极指南:3分钟掌握智能代理规则配置 【免费下载链接】ZeroOmega Manage and switch between multiple proxies quickly & easily. 项目地址: https://gitcode.com/gh_mirrors/ze/ZeroOmega 还在为网络代理切换而烦恼吗?每次访问不同…...
vLLM-v0.17.1GPU算力适配:华为昇腾CANN 7.0与vLLM对接可行性验证
vLLM-v0.17.1 GPU算力适配:华为昇腾CANN 7.0与vLLM对接可行性验证 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,由加州大学伯克利分校的天空计算实验室(Sky Computing Lab)最初开发,现已发展成为学术界和工业…...
为什么头部金融科技公司已在2026 Q1全面切换Python AOT?——基于百万行代码仓库的构建耗时、镜像体积、安全扫描通过率真实数据复盘
第一章:Python 原生 AOT 编译方案 2026 对比评测报告Python 社区在 2025 年底迎来关键演进:CPython 官方正式将原生 AOT(Ahead-of-Time)编译能力纳入 3.14 开发主线,并以“Project Graviton”为代号推动落地。2026 年初…...
MogFace人脸检测惊艳效果:CVPR22模型在极端光照(强逆光/频闪光)下的人脸召回提升实测
MogFace人脸检测惊艳效果:CVPR22模型在极端光照(强逆光/频闪光)下的人脸召回提升实测 你有没有遇到过这样的场景?在逆光下拍的照片,人脸黑成一团,或者是在闪烁的灯光下,人脸忽明忽暗࿰…...
StructBERT模型本地部署详解:从GitHub克隆到服务启动
StructBERT模型本地部署详解:从GitHub克隆到服务启动 你是不是也遇到过这样的场景?手头有一堆文本,需要快速判断它们之间的相似度,比如检查文章是否重复、匹配用户查询、或者做智能问答。如果每次都调用云端API,不仅费…...
AIGlasses OS Pro 模型优化实战:针对STM32F103C8T6的轻量化模型部署
AIGlasses OS Pro 模型优化实战:针对STM32F103C8T6的轻量化模型部署 最近有不少朋友在问,像AIGlasses OS Pro里那些能看懂世界的视觉模型,能不能塞进一个成本几十块钱、资源极其有限的单片机里跑起来?比如大家手头都有的那块“蓝…...
