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智能分析算法功能有哪些呢? 经过与矿方的现场交流沟通,收集第一现场人员对安…...
若依框架菜单管理实战:手把手教你为列表页添加详情页(Vue+Element UI)
若依框架菜单管理实战:手把手教你为列表页添加详情页(VueElement UI) 在后台管理系统开发中,列表页与详情页的联动是基础但关键的功能需求。许多开发者在使用若依框架的代码生成器快速搭建项目后,常常面临一个典型问题…...
射频非线性建模:从S参数到X参数与NVNA的工程实践
1. 非线性星期三:一场射频工程师的“大信号”狂欢如果你是一名射频或微波电路设计工程师,对S参数、负载牵引、谐波失真这些词感到既熟悉又头疼,那么十多年前在巴尔的摩举行的国际微波研讨会(IMS 2011)上,有…...
活动策划27年:一场手印启动,让我读懂“谨慎”二字
活动策划27年:一场手印启动,让我读懂“谨慎”二字做活动策划27年,千余场活动下来,我常跟团队说:“做活动,不怕累,就怕措手不及的意外。”每一场活动前,我都要反复推演流程࿰…...
如何快速掌握LyricsX:macOS终极歌词同步工具完整指南
如何快速掌握LyricsX:macOS终极歌词同步工具完整指南 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的终极歌词应用,能够自动同步音乐…...
汽车软件化演进:从原生应用到手机集成的技术路径与实战解析
1. 从机械到智能:汽车软件化的十字路口十年前,当福特和通用汽车开始在硅谷和南加州大肆招聘软件工程师时,很多人可能还没意识到,这不仅仅是一次普通的“招兵买马”,而是一场深刻改变汽车工业基因的序曲。2014年那会儿&…...
AI智能体技能库架构设计与实现:从标准化到工程化实践
1. 项目概述:从零构建一个AI智能体技能库最近在GitHub上看到一个挺有意思的项目,叫leon2k2k2k/agent-skills。光看名字,你可能觉得这又是一个关于AI智能体(Agent)的普通代码仓库。但作为一个在AI应用开发领域摸爬滚打了…...
Shoelace自动加载器:终极懒加载Web组件完整指南 [特殊字符]
Shoelace自动加载器:终极懒加载Web组件完整指南 🚀 【免费下载链接】shoelace Shoelace is now Web Awesome. Come see what’s new! 项目地址: https://gitcode.com/gh_mirrors/sh/shoelace Shoelace自动加载器是Shoelace Web组件库中一个革命性…...
Crystal语言Web框架实战:构建高性能API服务的轻量级方案
1. 项目概述:一个轻量级、高性能的Crystal语言Web框架最近在探索一些新兴的编程语言生态时,我注意到了Crystal语言,以及一个名为jvpflum/Crystal的GitHub仓库。乍一看这个标题,可能会让人有些困惑:这究竟是Crystal语言…...
AI时代工程师的超能力进化
好的,这是一篇关于AI时代工程师能力进化的技术文章大纲: 标题: AI时代工程师的“超能力”进化论:从工具使用者到智能架构师 导言: 简述AI技术的迅猛发展及其对各行业的深刻影响。提出问题:在AI成为强大“…...
5个维度深度解析:如何实现高性能黑苹果系统的架构设计与优化策略
5个维度深度解析:如何实现高性能黑苹果系统的架构设计与优化策略 【免费下载链接】Hackintosh 国光的黑苹果安装教程:手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 在传统PC硬件与macOS系统兼容性的技术挑战…...
