网易首页 > 网易号 > 正文 申请入驻

MyBatis 史诗级裹脚布可以烧了

0
分享至

作为一名 Java 开发者,你一定经历过被 MyBatis XML 支配的恐惧。

当你打开一个 UserMapper.xml,迎面而来的是几百行甚至上千行的 , , , 标签。原本清爽的 SQL 语句被这些 XML 标签切割得支离破碎,仿佛老太太的裹脚布——又臭又长

如果你也受够了在 XML 标签里写逻辑,受够了为了一个简单的非空判断就要写三行 XML,那么请继续往下看。dbVisitor 的动态 SQL 规则机制,也许就是你一直在寻找的 "剪刀"。

MyBatis 的 XML 地狱

让我们先回顾一下,一个标准的、带有几个查询条件的 MyBatis SQL 是什么样子的:

这段代码的问题在哪里,已经不用多言!这种 一坨一坨 的开发体验看到就难受至极,更别提还要去维护它。

革命性的解法

dbVisitor 作为一个新一代的数据库访问工具,最核心的设计理念之一就是:让 SQL 回归 SQL

利用 dbVisitor 独创的 规则机制,上面的 XML 代码可以精简为:

   @{and, create_time >= :createTime}

假设只传入参数 name="Tom",生成的 SQL 如下:

SELECT * FROM tb_user WHERE name = ?

是不是瞬间清爽了?没有了尖括号的视觉干扰,没有了冗余的 XML 闭合标签,只有纯粹的 SQL 逻辑。

你可能会问:@{and, ...} 到底做了什么?它是简单的字符串拼接吗?

当然不是!dbVisitor 的规则是非常智能的,以 @{and, name = :name} 为例,它内置了以下逻辑:

智能判空

引擎会自动检查 key = :key 表达式中的参数。如果参数 :key 为 null,整个 @{and} 规则块会被自动忽略,不会生成任何 SQL。

(注意:空字符串""被视为有效值,不会忽略)

WHERE 处理

如果内容不为空 @{and} 会识别它是否是 WHERE 子句的开头。如果是开头(例如前面没有1=1),它会自动抹去 AND,直接生成 WHERE name = ?

(这一点类似 MyBatis 的标签,但更加隐形)

这一切都是自动发生的,你只需要声明规则,剩下的交给 dbVisitor。

条件判断本该如此性感

MyBatis 中 90% 的 标签都是为了做两件事:

  • 参数不为空时,追加查询条件。

  • 开关开启时,追加查询条件。

dbVisitor 将这两类高频场景直接内化为最基础的规则,无需任何复杂的标签嵌套。

智能补全

自动检查条件状态选择是否需要自动补全 WHERE/AND/OR 关键字。

    @{and, name = :name} -- 生成 and name = ?

2. 智能判空

@{and} 和 @{or} 这是最常用的判空规则,它们会自动检查参数是否为 null。

  @{or,  age > :age}   -- 仅当 age 不为空时生成  or  age > ?

3. 开关控制

@{ifand} 和 @{ifor} 当你需要用布尔值来控制 SQL 时就会使用他们。

SELECT * FROM tb_user @{ifand, !showAll, is_delete = 0}

对比 MyBatis 的臃肿写法以及像老鼠屎一样无处不在的 1=1

仅仅是一个简单的条件,dbVisitor 让你少写了 3 行代码,减少无用的条件判断,这就是效率。

一行代码的 IN 查询

MyBatis 的 标签简直是反人类设计:collection, item, open, close... 配置项多达七八个,而且为了防止集合为空导致 SQL 语法错误,通常还得在外面套一层,简直令人窒息:

if>

而在 dbVisitor 中,利用 @{ifand} 和 @{in} 两个规则的 嵌套使用,你只需要一行:

  @{ifand, !idList.isEmpty, id IN @{in, :idList}}

对比一下,这代码量节省的可不是一点点,而是 降维打击

忘掉 , 忘掉逗号

在写 Update 语句时,处理末尾的逗号是最烦人的。dbVisitor 的 @{set}规则完美解决,引擎会自动处理字段间的逗号:

WHERE id = #{id}

MyBatis 用了一大堆标签来解决这个问题:

WHERE id = #{id}

⚠️ 虽然 @{set} 规则很强大,但规则的判断是依赖已经生成的 SQL 进行推断。

当规则没有匹配时,一些意外情况:

WHERE id = :id

分支判断的救星

MyBatis 的 - - 结构冗长得令人发指,写起来仿佛在填表。最大的麻烦在于即便是使用 @Select 注解仍然逃脱不了 XML 的魔咒。

                      @Param("content") String content);

dbVisitor 让你用 SQL 的思维写 SQL,更符合编程直觉。同样的场景,dbVisitor 只需要这样:

CASE 规则 IF-ELSE 模式

}

CASE 规则 Switch 模式 换一个例子:根据 encryptMode 的值选择加密方式。

}

像乐高积木一样组合

规则引擎最强大的地方在于其 可组合性。规则可以像乐高积木一样嵌套使用。这意味着你可以用 @{case} 的结果去驱动 @{and} 或者在 @{else} 里写一组 @{if}

比如一个常见的权限控制场景:

  • 如果是管理员 (ADMIN),查询所有数据;

  • 如果是部门经理 (MGR),查询本部门数据;

  • 如果是普通员工,只能查自己的数据。


}

注意看,外层的 @{and} 会自动处理连接词:

  • 当 role 是 'ADMIN' 时,@{case} 输出空,整个 @{and} 消失。

  • 当 role 是 'MGR' 时,内部输出 dept_id = ?,外层自动加上 AND。

这种自然的嵌套组合,让你能用 SQL 结构直接表达复杂的业务逻辑,而不是在 Java 代码和 XML 之间反复横跳。

这就结束了?

规则的强大之处在于无处不在。你不需要为了使用动态 SQL 而强迫自己切换开发模式。无论你身处哪个层级,dbVisitor 的动态规则都能无缝集成。

1. 在 编程式 API (JdbcTemplate) 中使用

不需要 StringBuilder,不需要拼接字符串。

    "SELECT * FROM users @{and, name = :name}", args);

2. 在 声明式 API (注解) 中使用

彻底摆脱 @Script 或者

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
王曼昱对张本美和十连胜!2月8日决赛:王楚钦VS张本智和

王曼昱对张本美和十连胜!2月8日决赛:王楚钦VS张本智和

开成运动会
2026-02-08 18:46:49
《人民日报》:很多人的病,都是长期与不舒服的人在一起得来的

《人民日报》:很多人的病,都是长期与不舒服的人在一起得来的

富书
2026-02-06 14:17:11
看完还敢买吗?市场员工说漏嘴,这“6种”年货全是“科技狠活”

看完还敢买吗?市场员工说漏嘴,这“6种”年货全是“科技狠活”

飘逸语人
2026-02-08 05:05:45
比特币暴跌:美国痛彻心扉,中国几乎免疫,冰火两重天!

比特币暴跌:美国痛彻心扉,中国几乎免疫,冰火两重天!

老马拉车莫少装
2026-02-06 21:49:45
骑士险胜!米切尔35+4,哈登23+2+8,赛后哈登走过去,抱住威少

骑士险胜!米切尔35+4,哈登23+2+8,赛后哈登走过去,抱住威少

担酒
2026-02-08 13:30:19
全球只有5位领导人被永久保留遗体,他们都是谁

全球只有5位领导人被永久保留遗体,他们都是谁

扶苏聊历史
2026-01-29 16:13:42
中成药欧美国家上市有多难?复方丹参滴丸出海合作终止,在美临床试验近30年未获批

中成药欧美国家上市有多难?复方丹参滴丸出海合作终止,在美临床试验近30年未获批

时代周报
2026-02-07 17:55:07
上海vs山东CBA杯半决赛12人名单:洛夫顿PK克里斯,刘铮复出

上海vs山东CBA杯半决赛12人名单:洛夫顿PK克里斯,刘铮复出

狼叔评论
2026-02-08 19:18:04
伊朗外长坚持铀浓缩权利 空军处于“最高战备”

伊朗外长坚持铀浓缩权利 空军处于“最高战备”

看看新闻Knews
2026-02-08 18:47:25
美司令:解放军有134个战机中队,只要心智正常就不会同中国作对

美司令:解放军有134个战机中队,只要心智正常就不会同中国作对

荷兰豆爱健康
2026-02-08 18:27:37
中国航天重大损失,实践三十二号发射失利,中国航天开年遇挫!

中国航天重大损失,实践三十二号发射失利,中国航天开年遇挫!

阿龙聊军事
2026-01-18 20:27:20
俄医院爆惊天丑闻!医生倒卖逝者器官,无亲属遗体成牟利工具

俄医院爆惊天丑闻!医生倒卖逝者器官,无亲属遗体成牟利工具

老马拉车莫少装
2026-02-07 21:58:41
日本真要脱钩了?日本超市大量停用支付宝微信支付,信号相当明显

日本真要脱钩了?日本超市大量停用支付宝微信支付,信号相当明显

青青子衿
2026-02-04 20:56:37
老马,加大投入了!

老马,加大投入了!

子说一点
2026-02-07 18:29:09
台湾费尽心思安排到解放军内部的间谍,全都被李志豪给揪了出来

台湾费尽心思安排到解放军内部的间谍,全都被李志豪给揪了出来

雪中风车
2026-02-06 08:12:58
2月8日俄乌:美俄联手向乌克兰发出最后通牒

2月8日俄乌:美俄联手向乌克兰发出最后通牒

山河路口
2026-02-08 18:40:01
白嫖月子中心后续: 13天白吃白住还借钱 深夜抱孩子跑路 警方介入

白嫖月子中心后续: 13天白吃白住还借钱 深夜抱孩子跑路 警方介入

离离言几许
2026-02-06 22:01:56
中国香港“保姆车”冠军变了:日系MPV让位,国产车冲到了第一

中国香港“保姆车”冠军变了:日系MPV让位,国产车冲到了第一

柳先说
2026-02-03 17:12:14
S妈反悔了!想夺回孙子抚养权准备打官司,小玥儿越来越高冷!

S妈反悔了!想夺回孙子抚养权准备打官司,小玥儿越来越高冷!

古希腊掌管月桂的神
2026-02-06 11:29:24
306票碾压胜利,日本迎来关键变数,高市连出两招,都以失败告终

306票碾压胜利,日本迎来关键变数,高市连出两招,都以失败告终

观星赏月
2026-02-07 15:38:32
2026-02-08 19:39:00
开源中国 incentive-icons
开源中国
每天为开发者推送最新技术资讯
7589文章数 34500关注度
往期回顾 全部

科技要闻

欧盟认定存在"上瘾"设计 TikTok:结论错误

头条要闻

出口民调显示日本执政联盟将获得众议院过半议席

头条要闻

出口民调显示日本执政联盟将获得众议院过半议席

体育要闻

铜牌与苏翊鸣的这四年,他说:我对得起自己

娱乐要闻

曝带女星回老家小区,罗云熙紧急回应

财经要闻

宽基ETF开年大赎回,什么信号?

汽车要闻

VLA司机大模型优化 理想汽车OTA8.3版本更新

态度原创

时尚
亲子
手机
健康
军事航空

40+女性冬季这样穿:“长外套+裙子”,保暖与洋气双向在线

亲子要闻

萌娃让妈妈开门,还送妈妈两个香吻,太可爱了

手机要闻

小米17 Pro Max升级澎湃3.0.300.9版本:体验后,不吐不快!

转头就晕的耳石症,能开车上班吗?

军事要闻

捐钱造航母的男孩登上军舰

无障碍浏览 进入关怀版