第 4 章 · 动态拼装:条件缝合术 章节摘要:本章走在手术台的中段——SQL 语句的按需拼装。后台筛选面板传上来一堆可空条件,动态 SQL 决定哪些片段上台、哪些剪掉、前后缀怎么修剪。if 与 where 是基础缝合,choose 与 set 是分支与更新专用针法,foreach 负责把集合拆开缝进 IN 与批量语句。读完你能写出任何组合条件下都语法正确的动态 SQL。 一条主线 一个订单管理后台的筛选面板:订单号、客户名、状态、日期区间,四个条件全可空。产品经理的逻辑很简单——用户填了什么就按什么查。落到 SQL 上却是个陷阱:条件拼接时逗号、AND 前缀、WHERE 子句的有无,每一处都可能拼出语法错误。
章节摘要:本章走在手术台的中段——SQL 语句的按需拼装。后台筛选面板传上来一堆可空条件,动态 SQL 决定哪些片段上台、哪些剪掉、前后缀怎么修剪。if 与 where 是基础缝合,choose 与 set 是分支与更新专用针法,foreach 负责把集合拆开缝进 IN 与批量语句。读完你能写出任何组合条件下都语法正确的动态 SQL。
一个订单管理后台的筛选面板:订单号、客户名、状态、日期区间,四个条件全可空。产品经理的逻辑很简单——用户填了什么就按什么查。落到 SQL 上却是个陷阱:条件拼接时逗号、AND 前缀、WHERE 子句的有无,每一处都可能拼出语法错误。老一辈开发者用 StringBuilder 和无数个 if 判断硬扛,MyBatis 把这套逻辑做成了 XML 里的九个标签。
本章顺着拼装的实际顺序走三站。4.1 讲最常用的组合:if 判空上岗,where 自动修剪多余前缀,trim 则是 where 的底层原形,理解它等于理解全部前后缀处理;4.2 讲互斥分支 choose 与更新专用的 set,顺带把模糊查询的 bind 技巧收进工具箱;4.3 讲集合的拆解——foreach 把一个列表展开成 IN 括号里的值序列,或拼成一条批量插入语句,同时要守住空集合与超长 SQL 两条警戒线。
一句金句:动态 SQL 不是拼字符串的语法糖,而是带修剪规则的标签树——每个标签都对应一类"拼错就会语法报错"的历史事故。
本章的认知转折有两个。第一个在 4.1 的 trim 一节:where 和 set 都是 trim 的预设包装,把 prefixOverrides 的行为看懂后,"为什么 AND 会被吃掉"从一个玄学现象变成可推导的规则,从此任何前缀残缺问题都可以自己造 trim 解决。
第二个在 4.3 的批量一节:foreach 的能力边界。它擅长把几十上百个值缝进一条语句,但上千行时拼出的 SQL 会撞数据库参数上限、撑爆执行计划缓存。认识到"foreach 不是批量写入的唯一解"(第 6 章会给出 BATCH 执行器的完整对照),才算真正会用这个标签。
缝合术练完,单册内 MyBatis 的映射主干(参数入、结果出、动态拼装)就齐了。下一章转入术后监护:缓存如何记住查询结果、TypeHandler 如何缝合类型差异、插件如何在四大对象的执行链上插入自己的处理。