ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从零实现一个 MyBatis 式 ORM 框架:中间件设计思路与映射器代理源码拆解

从零实现一个 MyBatis 式 ORM 框架:中间件设计思路与映射器代理源码拆解 文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载本篇技术指南围绕 CodeGuide 仓库中《SpringBoot 中间件设计和开发》小册「第 7 章 ORM 框架实现」展开以中间件“为上层应用屏蔽底层异构”的设计哲学为出发点剖析 ORM对象关系映射框架的核心职责并结合仓库内《Mybatis 手撸专栏》的源码级文档拆解一个类似 MyBatis 的 ORM 框架应如何设计与实现。读完本文你将掌握中间件屏蔽底层差异的通用思路、ORM 框架“接口 ↔ SQL ↔ 数据库”三者如何通过代理与执行器串联起来以及该框架后续如何与 Spring、SpringBoot 结合演进为 Starter 组件的完整脉络。一、中间件的本质为上层应用屏蔽底层异构中间件可以为上层应用屏蔽底层异构操作。这句话是理解整个 ORM 框架实现章节的钥匙。中间件本质上是一种“一站式服务”把大量繁琐、异构的底层细节统一封装起来让上层使用者获得简单、单一、容易的使用方式。生活中的例子比比皆是装修公司解决设计、人工、材料、品牌、搭配的一揽子问题婚庆公司解决酒店、婚车、行程、司仪、布景的统筹安排旅游公司解决路线、行程、吃住、门票、照片的全流程服务。这些服务共同的特征就是屏蔽底层异构让用户用一个简单统一的入口完成原本分散复杂的事情。映射到软件开发中中间件的功能同样是在解决底层差异、提供统一服务——数据库访问正是这类场景最典型的代表不同数据库、不同驱动、不同方言如果全部暴露给业务方代码将被无数连接细节和异常分支淹没。这就是为什么我们要动手实现一个 ORM 框架。二、需求背景从 JDBC 到 ORM 的演进在初学 Java 时我们大都直接使用过 JDBC 方式做数据库连接操作手动建立数据库连接手工编码 SQL 语句执行数据库操作后自行遍历ResultSet封装返回结果最后还要手动释放连接、处理各类受检异常。这套流程每一步都由开发者亲自完成重复且易错。随着学习深入我们陆续接触到了 iBatis、MyBatis、Hibernate 等产品——它们都是ORMObject Relational Mapping对象关系映射组件的具体实现。ORM 是一种程序设计技术用于实现面向对象编程语言里不同类型系统之间的数据转换让对象模型与关系模型可以互相映射也让我们可以更方便地使用数据库开发者面向接口和对象编程SQL 执行、结果映射、连接管理等底层操作全部由框架代劳。那么类似于 MyBatis 这样的 ORM 框架究竟是如何实现的呢这正是「第 7 章」要解决的核心问题——以实现一个 ORM 框架为目标梳理它该如何设计和实现。同时需要强调的是这里的 ORM 框架实现只是模拟开发一个类似MyBatis SpringBoot Starter的第一步后续章节会逐步完善其余功能详见后文第五部分的演进脉络。三、核心设计问题接口、SQL 与数据库三者如何建立联系设计一个 ORM 框架首先要回答的问题是用户定义的 DAO 接口、XML 配置的 SQL 语句、数据库三者如何串联起来从仓库《Mybatis 手撸专栏》的源码文档看最合适的答案是使用代理模式代理可以封装一个复杂的流程把它包装成接口对象的“实现类”。从源码结构看这一设计主要体现在 第2章创建简单的映射器代理工厂 中的两个核心类上1. 映射器代理类 MapperProxyMapperProxy是映射器的代理实现类它实现 JDK 动态代理的InvocationHandler接口在其invoke方法中包装对数据库的操作逻辑。由于所有对 DAO 接口的调用最终都会进入invoke框架可以在这一层统一完成解析方法对应的 SQL、执行数据库操作、封装返回结果。这样一个“没有实现类的接口”就能正常执行增删改查了。2. 映射器代理工厂 MapperProxyFactoryMapperProxyFactory是对MapperProxy的包装对外提供实例化操作为每个 DAO 接口生成代理对象。这块用到的其实就是一个简单工厂模式。当后续需要把每个操作数据库的接口映射器注册到注册中心时就会使用到这个工厂类。3. 设计模式小结从这两个类可以看出 ORM 框架底层的第一组核心设计模式模式落地位置作用代理模式ProxyMapperProxy实现InvocationHandler把 SQL 执行、结果映射等复杂流程封装为接口的“实现”业务方只面向接口编程简单工厂模式Simple FactoryMapperProxyFactory#newInstance为每个 DAO 接口统一生成代理对象屏蔽代理创建细节这正印证了中间件的思想把固定流程提炼、封装让使用者只关心业务接口不关心底层实现。四、渐进式实现从映射器代理到 SQL 执行器的解耦演进一个成熟的 ORM 框架绝不是一次写成的而是渐进式完善的。仓库《Mybatis 手撸专栏》以mybatis-step-0X递增的工程结构完整记录了这一过程。除了上一节提到的映射器代理步骤 01~03 的binding包后续关键演进还包括1. 数据源的解析与池化框架需要从配置如mybatis-config-datasource.xml中解析数据源并实现有/无连接池两种形态对应 第5章数据源的解析、创建和使用 与 第6章数据源池化技术实现。这一步解决的是 JDBC 中最让人头疼的连接管理问题正是中间件“屏蔽底层异构”的又一体现。2. SQL 执行器 Executor解耦数据源调用在具备数据源之后一个必须解决的问题是如果数据源调用、SQL 执行、结果封装都硬编码在DefaultSqlSession的selectOne等方法里那么每新增一个 SqlSession 方法就要改一遍主流程显然不利于扩展。从 第7章SQL执行器的定义和实现 的源码结构看解耦方案是Executor 接口定义执行方法、事务获取以及提交、回滚、关闭等统一操作BaseExecutor 抽象类由于执行器是一种标准执行过程可以用抽象类对过程做模板模式包装把公共流程固化、细节留给子类SimpleExecutor具体执行器实现StatementHandler 语句处理器把 JDBC 执行 SQL 的步骤——准备语句、参数化传递、执行查询、结果封装返回——结构化为独立类过程BaseStatementHandler/PreparedStatementHandler/SimpleStatementHandler便于功能拓展。这一层解耦的意义在于只有提供单独的执行方法入口才能从容应对各类入参、结果封装、执行器类型、批处理等需求变化——这些需求最终都会映射到 Mapper.xml 中的具体配置上。3. 参数与结果集处理后续章节第10章使用策略模式调用参数处理器、第11章流程解耦封装结果集处理器进一步把参数绑定与结果集封装抽离为独立处理器直至 第12章完善ORM框架增删改查操作 形成完整的 CRUD 能力。可以推断整个框架在分层上遵循“配置解析builder→ 代理绑定binding→ 会话session→ 执行器executor→ 数据源datasource”的自顶向下调用链每一层各司其职、相互解耦。五、演进脉络从 ORM 框架到 SpringBoot Starter第 7 章明确指出ORM 框架的实现只是第一步。从《SpringBoot 中间件设计和开发》小册的章节编排看完整的演进路径分为三步第 7 章 · ORM 框架实现搭建框架主体解决映射器代理与数据库操作的核心问题即本篇主题第 8 章 · ORM 框架与 Spring 集合把自己实现的 ORM 框架交给 Spring 管理目标是让 ORM 组件参与 Spring 事务管理、将 SqlSession 注入 Bean并让应用代码不依赖具体的 MyBatis 或 Spring 实现——这正是 MyBatis-Spring 的核心价值详见 第 8 章 ORM 框架与 Spring 集合第 9 章 · 结合 SpringBoot 开发 ORM Starter在前两步基础上把“自研 MyBatis 自研 MyBatis-Spring”与 SpringBoot 结合开发出类似mybatis-spring-boot-starter的 ORM 组件最终成为一个开箱即用的中间件详见 第 9 章 结合 SpringBoot 开发 ORM Starter。这条路径本身就是“技术迁移”的最佳实践把框架源码中的技术设计、思想模式迁移到自己的业务中间件开发体系中。例如Spring 中 Bean 的注入与管理思想完全可以迁移到中间件开发中——把抽离于业务形态的逻辑对象注入 Spring再供给业务系统注入使用。六、源码阅读指引如果你想沿着本文的脉络继续深入建议按以下顺序阅读仓库文档第 7 章 ORM 框架实现 —— 本章主题理解需求背景与设计动机第 2章创建简单的映射器代理工厂 —— 查看MapperProxy/MapperProxyFactory的具体代码实现第 7章SQL执行器的定义和实现 —— 查看 Executor 与 StatementHandler 的解耦设计第 12章完善ORM框架增删改查操作 —— 查看完整 CRUD 能力第 20章整合Spring —— 对应第 8 章主题看框架如何与 Spring 结合。通过“中间件思想 → 代理模式 → 执行器解耦 → Spring/SpringBoot 整合”这条主线你不仅能看懂 MyBatis 这类 ORM 框架的骨架是如何搭起来的更能把“屏蔽底层异构、统一服务入口”的中间件设计方法迁移到自己后续的组件开发实践中。赞分享文档教程后端【免费下载链接】CodeGuide:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总旨在为大家提供一个清晰详细的学习教程侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助请给予支持(关注、点赞、分享)项目地址https://gitcode.com/gh_mirrors/code/CodeGuide点击查看免费下载相关推荐手写MyBatis基于CodeGuide仓库的渐进式源码实践路线从代理工厂到一二级缓存完整拆解ORM框架手写MyBatis基于CodeGuide仓库的渐进式源码实践路线从代理工厂到一二级缓存完整拆解ORM框架 本文以 CodeGuide 仓库中小傅哥的《手写M文档教程后端CodeGuide 手写 ORM 框架实现从 JDBC 到 MyBatis 风格中间件第 7 章实战CodeGuide 手写 ORM 框架实现从 JDBC 到 MyBatis 风格中间件第 7 章实战 本篇技术指南以《SpringBoot 中间件设计和开文档教程后端FreeSql源码解析深入理解国产ORM框架的设计思想FreeSql源码解析深入理解国产ORM框架的设计思想 FreeSql作为国内首款支持AOT编译的ORM框架在.NET生态中占据着重要地位。本文将通过源码分后端ORM数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表