第4章 动态拼装:动态SQL的条件缝合


文档摘要

第 4 章 · 动态拼装:条件缝合术 章节摘要:本章走在手术台的中段——SQL 语句的按需拼装。后台筛选面板传上来一堆可空条件,动态 SQL 决定哪些片段上台、哪些剪掉、前后缀怎么修剪。if 与 where 是基础缝合,choose 与 set 是分支与更新专用针法,foreach 负责把集合拆开缝进 IN 与批量语句。读完你能写出任何组合条件下都语法正确的动态 SQL。 一条主线 一个订单管理后台的筛选面板:订单号、客户名、状态、日期区间,四个条件全可空。产品经理的逻辑很简单——用户填了什么就按什么查。落到 SQL 上却是个陷阱:条件拼接时逗号、AND 前缀、WHERE 子句的有无,每一处都可能拼出语法错误。

第 4 章 · 动态拼装:条件缝合术

章节摘要:本章走在手术台的中段——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 的生成过程

一句金句:动态 SQL 不是拼字符串的语法糖,而是带修剪规则的标签树——每个标签都对应一类"拼错就会语法报错"的历史事故。

沿途站点

  • 4.1 if 条件与 where 修剪:OGNL 判空表达式的写法、where 的自动修剪范围、trim 的四个属性如何还原出 where 与 set、全条件为空时的兜底。
  • 4.2 choose 分支与 set 动态更新:多路互斥的 choose 家族、set 去尾逗号、bind 绑定模糊查询模式串,以及"只更新非空字段"的完整案例。
  • 4.3 foreach 集合展开与批量手术:collection 指向的取值规则、IN 查询与批量插入两种展开、空集合防护、分批上限与 index 的 Map 用法。

拐点与结论

本章的认知转折有两个。第一个在 4.1 的 trim 一节:where 和 set 都是 trim 的预设包装,把 prefixOverrides 的行为看懂后,"为什么 AND 会被吃掉"从一个玄学现象变成可推导的规则,从此任何前缀残缺问题都可以自己造 trim 解决。

第二个在 4.3 的批量一节:foreach 的能力边界。它擅长把几十上百个值缝进一条语句,但上千行时拼出的 SQL 会撞数据库参数上限、撑爆执行计划缓存。认识到"foreach 不是批量写入的唯一解"(第 6 章会给出 BATCH 执行器的完整对照),才算真正会用这个标签。

读完你应该

  1. 能写出多条件可空筛选的完整映射,保证任意条件组合下 SQL 语法正确
  2. 能解释 where 元素会修剪什么、不会修剪什么,什么时候必须退回手写 trim
  3. 能用 trim 的四个属性自定义一个"包裹括号并去除前导逗号"的片段
  4. 能区分 if 与 choose 的语义差异,说出"多条件叠加"与"多选一策略"分别适合哪个
  5. 能写只更新非空字段的 set 映射,并解释为什么全空会生成残缺 SQL、如何防护
  6. 能用 foreach 写 IN 查询与批量插入,并对空列表和超长集合做好防护与分批

下一章的接力

缝合术练完,单册内 MyBatis 的映射主干(参数入、结果出、动态拼装)就齐了。下一章转入术后监护:缓存如何记住查询结果、TypeHandler 如何缝合类型差异、插件如何在四大对象的执行链上插入自己的处理。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U