为什么 MyBatis 源码中,没有我那种 if···else

  • 类型:创建型模式

    • 工厂模式

    • 单例模式

    • 建造者模式

  • 类型:结构型模式

    • 适配器模式

    • 代理模式

    • 组合模式

    • 装饰器模式

  • 类型:行为型模式

    • 模板模式

    • 策略模式

    • 迭代器模式

  • 总结


在MyBatis的两万多行的框架源码中,使用了大量的设计模式对工程架构中的复杂场景进行解耦,这些设计模式的巧妙使用是整个框架的精华。

经过整理,大概有以下设计模式,如图1所示。

类型:创建型模式

工厂模式

SqlSessionFactory 的结构如图2所示。

工厂模式:简单工厂是一种创建型模式,在父类中提供一个创建对象的方法,允许子类决定实例对象的类型。

场景介绍:SqlSessionFactory 是获取会话的工厂,每次使用MyBatis 操作数据库时, 都会开启一个新的会话。在会话工厂的实现中,SqlSessionFactory 负责获取数据源环境配置信息、构建事务工厂和创建操作SQL 的执行器,最终返回会话实现类。

同类设计:SqlSessionFactory、ObjectFactory、MapperProxyFactory 和DataSourceFactory。

单例模式

Configuration 单例配置类的结构如图3所示。

单例模式:是一种创建型模式,能够保证一个类只有一个实例,并且提供一个访问该实例的全局节点。

场景介绍:Configuration 是一个大单例,贯穿整个会话周期,所有的配置对象(如映射、缓存、入参、出参、拦截器、注册机和对象工厂等)都在Configuration 配置项中初始化, 并且随着SqlSessionFactoryBuilder 构建阶段完成实例化操作。

同类场景:ErrorContext、LogFactory 和Configuration。

建造者模式

ResultMap 建造者模式的结构如图4所示。

建造者模式:使用多个简单的对象一步一步地构建成一个复杂的对象,提供了一种创建对象的最佳方式。

场景介绍:建造者模式在MyBatis 中使用了大量的XxxxBuilder,将XML 文件解析到各类对象的封装中,使用建造者及建造者助手完成对象的封装。它的核心目的是不希望把过多的关于对象的属性设置写到其他业务流程中,而是用建造者方式提供最佳的边界隔离。

同类场景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XML StatementBuilder 和CacheBuilder。

类型:结构型模式

适配器模式

日志实现类的结构如图5所示。

适配器模式:是一种结构型模式,能使接口不兼容的对象也可以相互合作。

场景介绍:正是因为有太多的日志框架,包括Log4j、Log4j2 和Slf4J 等,而这些日志框架的使用接口又各有差异,为了统一这些日志框架的接口,MyBatis 定义了一套统一的接口,为所有的其他日志框架的接口做相应的适配。

同类场景:主要集中在对Log 日志的适配上。

代理模式

代理模式的实现结构如图6所示。

代理模式:是一种结构型模式,能够提供对象的替代品或占位符。代理控制元对象的访问,并且允许在将请求提交给对象前进行一些处理。

场景介绍:没有代理模式就不存在各类框架。就像MyBatis 中的MapperProxy 实现类, 代理工厂实现的功能就是完成DAO 接口的具体实现类的方法,配置的任何一个DAO 接口调用的CRUD 方法,都会被MapperProxy 接管,调用到方法执行器等,并返回最终的数据库执行结果。

同类场景:DriverProxy、Plugin、Invoker 和MapperProxy。

组合模式

解析节点类的结构如图7所示。

组合模式:是一种结构型模式,可以将对象组合成树形结构以表示“部分—整体” 的层次结构。

场景介绍:在MyBatis XML 动态的SQL 配置中,共提供了9 种标签(trim、where、set、foreach、if、choose、when、otherwise 和bind),使用者可以组合出各类场景的SQL 语句。而SqlNode 接口的实现就是每个组合结构中的规则节点,通过规则节点的组装,完成规则树组合模式的使用。

同类场景:主要体现在对各类SQL 标签的解析上,以实现SqlNode 接口的各个子类为主。

装饰器模式

二级缓存装饰器的实现结构如图8所示。

装饰器模式:是一种结构型设计模式,允许将对象放入包含行为的特殊封装对象中, 为元对象绑定新的行为。

场景介绍:MyBatis 的所有SQL 操作都是经过SqlSession 调用SimpleExecutor 完成的, 而一级缓存的操作也是在简单执行器中处理的。这里的二级缓存因为是基于一级缓存刷新的,所以在实现上,通过创建一个缓存执行器,包装简单执行器的处理逻辑,实现二级缓存操作。这里用到的就是装饰器模式,也叫俄罗斯套娃模式。

类型:行为型模式

模板模式

SQL 执行模板模式如图9所示。

模板模式:是一种行为型模式,在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。场景介绍:存在一系列可被标准定义的流程,并且流程的步骤大部分采用通用逻辑,只有一小部分是需要子类实现的,通常采用模板模式来定义这个标准的流程。就像MyBatis 的BaseExecutor 就是一个用于定义模板模式的抽象类,在这个类中把查询、修改的操作都定义为一套标准的流程。

同类场景:BaseExecutor、SimpleExecutor 和BaseTypeHandler。

策略模式

多类型处理器策略模式的结构如图10所示。

策略模式:是一种行为型模式,能定义一系列算法,并将每种算法分别放入独立的类中,从而使算法的对象能够互相替换。

场景介绍:在MyBatis 处理JDBC 执行后返回的结果时,需要按照不同的类型获取对应的值,这样就可以避免大量的if 判断。所以,这里基于TypeHandler 接口对每个参数类型分别做了自己的策略实现。

同类场景:PooledDataSource、UnpooledDataSource、BatchExecutor、ResuseExecutor、SimpleExector、CachingExecutor、LongTypeHandler、StringTypeHandler 和DateTypeHandler。

迭代器模式

拆解字段解析实现的结构如图11所示。

迭代器模式:是一种行为型模式,能在不暴露集合底层表现形式的情况下遍历集合中的所有元素。

场景介绍:PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下,用来解析对象关系的迭代操作。这个类在MyBatis 中使用得非常频繁,包括解析数据源配置信息并填充到数据源类上,同时参数的解析、对象的设置都会使用这个类。

同类场景:PropertyTokenizer。

总结

通过梳理,MyBatis大约运用了10种左右设计模式。可以说,复杂且优秀的ORM 框架源码在设计和实现的过程中都会使用大量的设计模式。

在解决复杂场景的问题时,需要采用分治、抽象的方法,运用设计模式和设计原则等相关知识,把问题合理切割为若干子问题,以便加以理解和解决。

学习源码远不是只是为了应付面试,更重要的是学习优秀框架在复杂场景下的解决方案。通过学习这些优秀的方案技术,可以提高对技术设计和实现的理解,扩展编码思维,积累落地经验。只有经过这样长期的积累,我们才更有可能成为优秀的高级工程师和架构师。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1155672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

写论文软件哪个好?宏智树 AI 实测科普:不止是工具,更是学术思维脚手架

作为深耕论文写作科普的教育测评博主,粉丝最常问的问题就是 “写论文软件哪个好”。市面上的工具要么专攻单一功能,让你在查重、排版、文献工具间反复切换;要么只懂生成文本,却缺乏学术逻辑支撑,生成的内容看似完整实则…

什么是“确定性体验”

文章目录IP网络为什么需要“确定性体验”IP网络的“确定性体验”是如何实现的IP网络的“确定性体验”的典型应用场景有哪些确定性体验,是未来网络的发展趋势之一。IP网络的“确定性体验”通过优先级确定、资源确定、时间确定、路径确定、高可靠性等特征来提升用户的…

那些年入百万的阿里P8大佬是如何精通微服务架构原理的?

阿里P8级架构师对微服务架构的精通,源于其对分布式系统本质的深刻理解、复杂场景的实战积累及持续的技术深度挖掘。一、架构演进与核心原理二、分布式关键技术攻坚三、稳定性与高可用设计四、工程方法与团队协作五、学习路径与方法论总结:P8级架构师的核…

克鲁斯焊接机械臂节气设备

克鲁斯焊接机械臂在长时间连续作业中,保护气体的消耗量直接影响生产成本。传统供气方式在非焊接时段仍保持恒定流量,造成大量气体逸散。WGFACS节气设备的引入改变了这一模式,通过智能识别焊接状态实现气体供给的动态调节。设备运行时仅在电弧…

基于RAG的企业智能客服项目,已拿70万offer!

✨项目目标 基于 RAG 构建一套企业智能客服系统📖。 ⭕【RAG知识检索】 👉知识检索是问答机器人的核心模块,很大程度决定了问答机器人的效果。基于Embedding的召回是知识检索的常用方法 ⭕【RAG知识检索】 👉知识检索是问答机器…

9 款 AI 写论文哪个好?实测终极答案:宏智树 AI 凭 “真实硬核” 领跑!

作为专注论文写作科普的测评博主,后台每天被 “AI 写论文工具怎么选” 的问题淹没。市面上各类 AI 工具宣传得天花乱坠,但大多只停留在 “文本生成” 层面,真正能解决毕业论文 “真实文献、合规数据、专业图表” 核心需求的少之又少。为了帮大…

环境检测实验室管理系统 环境监测管理系统 LIMS

在当前环境检测行业面临数据量激增、监管要求趋严、流程复杂度提升的当下,环境检测管理系统就成为实现数字化转型的核心支撑工具。作为实验室的“智慧大脑”,LIMS环境检测实验室管理系统实现对检测全流程的精细化管控,可以做到数据精准性、流…

2026 等保新规落地,传统终端防护还够用吗? EDR 给出答案

EDR(终端检测与响应)与传统终端安全防护的核心区别在于:前者是“主动防御全生命周期响应”体系,侧重未知高级威胁的检测、处置与溯源;后者是“被动防御单点处置”模式,仅能应对已知基础威胁,两者…

[大模型架构] LangGraph AI 工作流编排(13)

一、AI 原生能力终极升级:从辅助工具到自主运营中枢本集将 AI 能力从 “工作流驱动” 升级为 “平台生态自主运营”,通过大模型与 LangGraph 的深度耦合、Agent 能力进化,实现平台从 “被动响应需求” 到 “主动创造价值” 的转变&#xff1a…

游戏盾如何应对大规模DDoS攻击

应对大规模DDoS攻击 面对日益复杂的DDoS攻击手段,游戏盾部署了多层防护体系。通过分布式节点网络,攻击流量被分散到全球清洗中心进行处理。防护系统支持TB级攻击流量清洗,有效抵御SYN Flood、UDP Flood等各类攻击类型。游戏盾还具备智能学习能…

深度学习毕设选题推荐:基于python-CNN深度学习卷神经网络识别混凝土是否有裂缝基于python-CNN深度学习识别混凝土是否有裂缝

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

论文写作神器排行榜:8款AI工具对比测试,智能降重与高效创作兼具

AI论文生成工具排行榜:8个网站对比,论文降重写作功能全 工具对比总结 以下是8个AI论文工具的简要排名,基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈,数据源于引用内容案例: 工具名称 主要功能 优…

游戏盾可以自动防御各种攻击吗

一、游戏盾的核心防御能力 游戏盾区别于传统高防IP、高防CDN等通用防护方案,其核心优势在于深度适配游戏业务的低延迟、高并发、私有协议等特性,形成了从网络层到应用层的专项防护能力,主要覆盖以下三类核心攻击场景。 (一&…

论文写作效率工具盘点:8款AI应用深度评测,智能降重与内容创作并重

AI论文生成工具排行榜:8个网站对比,论文降重写作功能全 工具对比总结 以下是8个AI论文工具的简要排名,基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈,数据源于引用内容案例: 工具名称 主要功能 优…

自学linuxday46

一、GPIO(通用输入输出)定义:单片机与外界交互的基础接口,引脚可独立配置为输入或输出模式。输出模式:开漏输出:需外接上拉电阻输出高电平。推挽输出:直接输出高/低电平,驱动能力强。…

【课程设计/毕业设计】基于python深度学习识别混凝土是否有裂缝基于python-CNN深度学习识别混凝土是否有裂缝

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

高效学术写作工具推荐:8个AI网站功能PK,专注论文降重与内容优化

AI论文生成工具排行榜:8个网站对比,论文降重写作功能全 工具对比总结 以下是8个AI论文工具的简要排名,基于核心功能、处理速度和适用性对比。排名侧重实用性与用户反馈,数据源于引用内容案例: 工具名称 主要功能 优…

HBase在电信领域的应用:CDR记录存储

HBase在电信领域的应用:CDR记录存储 引言 背景介绍 在当今数字化的时代,电信行业产生的数据量呈爆炸式增长。其中,通话详单记录(Call Detail Record,CDR)是电信运营中极为重要的数据类型,它详细…

深度学习毕设项目推荐-基于python-CNN深度学习识别混凝土是否有裂缝

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

VisionPro二开之九点标定案例

VisionPro二开之九点标定案例 一 制作九点标定Toolblock二 使用