为什么我又写了一个 ORM 框架(MyBatisGX)

发布时间:2026/7/21 22:49:23

为什么我又写了一个 ORM 框架(MyBatisGX)
为什么我又写了一个 ORM 框架MyBatisGXORM 的铁三角诅咒写了十年 Java持久层框架一直没找到理想的选择。选 MyBatis灵活归灵活但增删改查、分页、批量操作全得手写 XML。每个表都要写一遍机械重复的工作量很大。选 MyBatis Plus开始用的时候确实爽慢慢就发现不对劲在 Service 层拼LambdaQueryWrapper业务代码里到处都是数据库字段名后来我在 Dao 写 default 方法封装 Wrapper。service 是干净了但 dao 里全是样板代码问题只是挪了个地方简单的 1:1 关联查询也得手写 SQL 或者查两次批量插入/更新又要继承接口又要继承类用起来很麻烦选 JPA写代码的时候确实省心出问题就头疼了。不知道哪里又偷偷执行了一条 SQLSpecification 写动态查询像在用 Java 翻译 SQL 语句。N1 查询、分页数据爆炸这些坑踩过几次就不想再碰了。复杂点的报表查询还是老老实实写原生 SQL。这三个框架分别代表了持久层的三个方向要灵活 → 写得累要省事 → 架构糊要自动 → 黑盒坑MyBatisGX 的做法定义查询不实现查询MyBatisGX 的核心思路查询是稳定的业务能力不是临时拼出来的实现细节。Service 层只写业务流程查询逻辑全部收敛到 Dao 层用方法定义清楚地表达出来。方法名查询java代码解读复制代码// 简单查询 ListUser findByNameLike(String name); // 复杂条件 ListUser findByNameLikeAndAgeBetweenOrStatusEq( String name, Integer minAge, Integer maxAge, Integer status ); // 支持任意分组用括号 Statement(value findByNameLikeAnd(AgeOrSex), language StatementLanguage.METHOD) ListUser findByNameLikeAndAgeOrSex(String name, Integer age, Integer sex);方法名就是查询语义不用 WrapperService 里也不用拼条件。查询实体条件太多的时候方法名会很长这时候用 QueryEntityjava代码解读复制代码QueryEntity public class UserQuery extends User { private String nameLike; // 自动解析成模糊查询 private ListLong idIn; // 自动解析成 IN 查询 private ListLong ageBetween; // 自动解析成 BETWEEN } // Dao 层 ListUser findList(UserQuery query);查询条件作为结构化对象传递类型安全IDE 有提示。Service 层不用关心字段名和查询逻辑。动态查询加个Dynamic注解自动生成动态 SQLjava代码解读复制代码Dynamic ListUser findByNameLikeAndId(String name, Long id);参数为 null 的时候条件自动不加入 SQL。关联查询java代码解读复制代码Entity public class User { OneToOne(mappedBy user, fetch FetchType.EAGER) Fetch(FetchMode.BATCH) // 批量抓取解决 N1 private UserDetail userDetail; ManyToMany(mappedBy userList, fetch FetchType.LAZY) Fetch(FetchMode.JOIN) // JOIN 抓取分页不爆炸 private ListRole roleList; }不用写 ResultMap不用手写 JOIN SQL。支持 4 种抓取策略SIMPLE/BATCH/JOIN/NONE按场景选。批量操作业务开发里批量插入/更新/删除太常见了。导入功能、数据同步、批量审核到处都要用。MyBatisGX 直接内置了批量方法java代码解读复制代码// 继承 SimpleDao 就有不用继承额外的接口或类 int insertBatch(ListUser users); // 批量插入 int updateBatchById(ListUser users); // 批量更新 int deleteBatchById(ListLong ids); // 批量删除框架提供的不够用BatchOperation自己定义java代码解读复制代码BatchOperation int insertBatchCustom(BatchData ListUser users, BatchSize int batchSize);不用为了批量功能改架构直接在 Dao 层调用。是 JPA 的换皮吗不是。MyBatisGX 确实用了 JPA 的注解Entity、OneToMany等但只用来描述结构不参与行为控制。JPA 有的东西MyBatisGX 都没有EntityManager、Session 生命周期持久化上下文Persistence Context隐式 SQL 执行、脏检查、自动 FlushMyBatisGX 的执行模型是 MyBatisSQL 预生成启动时扫描 Dao生成 MappedStatementSQL 可被 mapper.xml 完全接管SQL 最终形态对开发者可见、可干预厌恶 JPA 的黑盒运行时但认可它对象建模的成熟设计MyBatisGX 就是这个定位。XML 兜底框架生成的 SQL 有问题需要写复杂的报表查询直接按 MyBatis 原始方式写 XML框架立即失效。xml代码解读复制代码select idfindByNameLike resultTypeUser SELECT * FROM user WHERE name LIKE #{name} /select只要 mapper.xml 里有同名方法MyBatisGX 就不再自动生成。优先级mapper.xml MyBatisGX 自动生成。这是个渐进式框架简单场景零 XML复杂场景随时接管无缝兼容现有 MyBatis 项目还有几个真香的点无缝升级现有 MyBatis 项目原来的 mapper.xml 完全不用动换个依赖、继承个SimpleDao接口就能开始用。逻辑删除、乐观锁、审计字段加个注解就行java代码解读复制代码LogicDelete private Integer deleted; Version private Integer version; GeneratedValue(InputTimeValueProcessor.class) private LocalDateTime createTime;复合主键、字段加密、投影 DTO都支持不需要复杂配置。总结MyBatisGX 不是要替代谁它回答的是这个问题在意代码边界、架构演进和长期维护成本的时候有没有更好的选择只追求写得快现在的 ORM 够用。但如果已经被重复代码、架构腐烂、SQL 黑盒、Specification 折磨过可能不是缺框架是缺一套正确的抽象。作者落木萧萧825链接https://juejin.cn/post/7628156003448995874来源稀土掘金著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。

相关新闻

ComfyUI Manager完整指南:高效管理自定义节点的专业解决方案

ComfyUI Manager完整指南:高效管理自定义节点的专业解决方案

2026/7/20 14:16:08

ComfyUI Manager完整指南:高效管理自定义节点的专业解决方案 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various…

万字长文:深入理解 Loop Engineering(循环工程)

万字长文:深入理解 Loop Engineering(循环工程)

2026/7/20 14:16:08

一、引言:为什么需要 Loop Engineering? 在软件工程、系统设计、数据处理和人工智能等众多领域,循环(Loop)是最基础也是最强大的控制结构之一。从简单的 for 循环遍历数组,到复杂的强化学习训练循环&#…

如何用Wealthfolio实现本地化投资组合管理:免费开源财务追踪指南

如何用Wealthfolio实现本地化投资组合管理:免费开源财务追踪指南

2026/7/20 14:16:08

如何用Wealthfolio实现本地化投资组合管理:免费开源财务追踪指南 【免费下载链接】wealthfolio A beautiful, private, local-first personal finance tracker. Investments, net worth, spending, and simulations. 项目地址: https://gitcode.com/GitHub_Trendi…

UE5新手避坑指南:Enhanced Input系统实现角色移动与视角控制

UE5新手避坑指南:Enhanced Input系统实现角色移动与视角控制

2026/7/21 22:48:05

1. 项目概述:为什么新手需要这份“避坑指南”?刚接触虚幻引擎5(UE5)的新手,尤其是从Unity或其他引擎转过来的朋友,常常会卡在人物移动和视角控制这个看似基础,实则暗藏玄关的环节上。你可能会发…

记录我的C语言编程笔记(1~15)

记录我的C语言编程笔记(1~15)

2026/7/21 22:48:05

Hello World预处理#include<stdio.h> //stantardInputandOutput标准的输入和输出业务代码&#xff0c;你要让计算机做的事情int main(){ //程序的主入口&#xff0c;“int”表示结果为整数printf("Hello World…

2026云手机排名实测!四款热门云手机哪家好用?

2026云手机排名实测!四款热门云手机哪家好用?

2026/7/21 22:48:05

很多人挑云手机完全靠瞎选&#xff0c;要么挂机老掉线&#xff0c;要么功能太少不好用&#xff0c;要么暗藏收费坑。今天不搞复杂专业测评&#xff0c;用最直白的真实体验&#xff0c;横向对比多多云、红手指、繁星云、桃心云四款目前最火的云手机&#xff0c;从大家最关心的稳…

高考成绩分段统计表解读与志愿填报技巧

高考成绩分段统计表解读与志愿填报技巧

2026/7/21 22:48:05

1. 高考成绩分段统计表的重要性与解读方法每年高考成绩公布后&#xff0c;各省教育考试院都会发布成绩分段统计表&#xff08;俗称"一分一段表"&#xff09;&#xff0c;这份表格对考生志愿填报具有决定性指导作用。以四川省2026年历史类成绩分段表为例&#xff0c;我…

智慧校园系统多少钱一套?一文读懂定价逻辑与选型指南

智慧校园系统多少钱一套?一文读懂定价逻辑与选型指南

2026/7/21 22:48:05

✅作者简介&#xff1a;合肥自友科技 &#x1f4cc;核心产品&#xff1a;智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

Moltbook:面向AI智能体的去中心化知识协作网络

Moltbook:面向AI智能体的去中心化知识协作网络

2026/7/21 22:38:02

1. 项目概述&#xff1a;当社交网络不再需要人类登录 你有没有想过&#xff0c;一个社交平台上线后&#xff0c;它的首批用户里没有一个人类&#xff1f;不是测试账号&#xff0c;不是运营小号&#xff0c;而是从第一天起&#xff0c;所有注册、发帖、评论、点赞、拉群、吵架、…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵&#xff08;连锁便利店/商超标准配置&#xff09; 自助收银Kiosk一体机&#xff1a;顾客结算、自助核销优惠券、商品素材预览&#xff1b;运营折叠平板&#xff1a;店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似&#xff0c;可以采用类似判断方法------------其实他比小红书好判断&#xff0c;因为他没有图片&#xff0c;控件位置几乎是固定的&#xff0c;都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的&#xff0c;所以我就…

GraphRAG Local + Ollama:微软知识图谱本地化

GraphRAG Local + Ollama:微软知识图谱本地化

2026/7/21 0:06:35

普通 RAG 有个老毛病&#xff1a;你问它「这堆文档整体在讲什么」&#xff0c;它答不上来。因为它只会把问题切成向量&#xff0c;去几十个文本块里捞最相似的几段拼给模型看。可「整体讲什么」这种问题&#xff0c;答案根本不在任何单独一段里——它散在全篇的联系里。 微软的…

AI 数据产品化思考:让分析能力变成可售卖的数据服务

AI 数据产品化思考:让分析能力变成可售卖的数据服务

2026/7/21 0:06:35

AI 数据产品化思考&#xff1a;让分析能力变成可售卖的数据服务 大家好&#xff0c;我是朱大喜。这周一直在复盘具体的项目和技术&#xff0c;最后一篇聊点不一样的东西——数据产品化。做了这么多年数据分析&#xff0c;我发现一个规律&#xff1a;能卖出去的从来不是"分…

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

基于人机协作的 AI 研发新体系架构:从 Harness 工程到 Loop 工程实践

2026/7/21 0:06:35

本文完整呈现了企业级 AI Coding 落地的核心方法论&#xff1a;从 Harness 工程的微观/宏观定义&#xff0c;到 Loop 工程的六大构建模块&#xff0c;再到基于 SDD&#xff08;规范驱动开发&#xff09;的工程化落地路径。干货较多&#xff0c;建议收藏细读。 我从 22 年开始就…