在 MyBatis XML 里写大于小于号,一不小心就踩坑
整理了 MyBatis XML 里处理大于、小于等特殊符号的两种方式,以及动态 SQL 里容易报错的写法,配了可直接上手的示例。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道。登录已有账号
2026-06-20 17:15:40 MyBatis XML CDATA
在Mapper XML里写SQL,偶尔需要用到小于号、大于号这些,直接把符号丢进去是不行的——XML解析器会把它当成标签起始,启动就报错,通常是个SAXParseException。第一次遇到的时候我还以为MyBatis哪儿出bug了,查了一圈才发现是要转义。
这东西不复杂,但每次都得处理,踩过两次坑之后基本就固定套路了。
用得最多的是XML预定义的实体转义。小于号<写成<,大于号>写成>,这两个很直接。容易被忽略的是&符号,它必须写成&,不然解析器会以为你要声明一个实体引用,然后抛一个“实体未定义”的错误。至于单引号和双引号,对应的转义符是'和",实际在SQL里很少用到——除非你在标签属性值里硬要用到引号,那个场景比较罕见,知道有这回事就行。
动态SQL里典型的场景是<if>标签的判断条件。
比如想过滤出未成年用户,写成age < 18就会炸,必须改成age < 18。静态SQL同理,SELECT * FROM users WHERE age < 30这个查询得写成WHERE age < 30。如果你刚好在写那种拼接了一堆条件的查询,满屏<和>看着确实有点眼花。
这时候另一个方案就出来了:CDATA区块。
用<![CDATA[ ... ]]>把包含特殊符号的那段SQL包起来,解析器会原样处理里面的内容,<就不用转义了。比如查30岁以下的用户,直接写成:
<select id="selectYoungUsers" resultType="User">
SELECT * FROM users
<where>
<![CDATA[ age < 30 ]]>
</where>
</select>
一整段SQL里如果夹杂了一堆特殊符号,用CDATA能省不少事,读起来也更干净。
但有个小坑:CDATA区块里不能再出现]]>,那是结束标志。要是SQL里真有这种字符串(极少见),就得把]]>拆开,或者改用实体转义拼接。
实际干活的时候两种方案经常混着用。比如静态部分很复杂,直接一个CDATA包住,但是动态条件里还要拼<if>之类的标签,那部分就不能用CDATA包了,只能老老实实写<。混用没问题,关键是别把自己绕进去——动态标签的判断表达式始终是不能放进CDATA里的,那里是XML的活区。
说下自己怎么选。零星一两个比较符号,手写实体转义其实更直观,比如age < 18 AND score > 60,一眼就知道是“小于”“大于”,不需要跳出去看是不是被CDATA包了。如果遇上那种老长一段带嵌套或很多运算符的SQL,全转义写起来又累又容易漏,直接上CDATA是更省眼睛的选择。团队里最好定个统一的倾向,有的文件全用实体,有的文件满篇CDATA,切来切去阅读成本会高一些——尤其是遗留代码里两种混得乱七八糟,排查问题得先对上眼神,烦得很。
线上要是突然因为一个没转义的<挂掉,定位其实很快,日志会很直接地告诉你XML解析失败了。只是这种本可以在本地启动时就暴露的问题拖到发布后才发现,确实有点亏。养成写完随便跑一下的习惯就好,别等打包完才看到那一行红字。
整理了 MyBatis XML 里处理大于、小于等特殊符号的两种方式,以及动态 SQL 里容易报错的写法,配了可直接上手的示例。
记录一次线上ORDER BY拼接漏掉空格导致SQL语法错误的排查过程,以及对应的修复合规和SQL注入防护。
在MyBatis XML映射文件中,特殊符号如`<`、`>`、`&`等常常引发解析错误。本文将为你深入剖析两种核心转义方案:XML实体转义符与CDATA区块。我们将详细阐述它们的适用场景、优缺点,并提供实战建议,帮助你根据SQL复杂度灵活选择,确保XML文件正确解析,告别繁琐的转义工作,全面提升代码可维护性与团队开发效率。
深入剖析MyBatis动态SQL拼接中因字段名与排序方式间缺少空格导致的SQL语法错误。本文详细介绍手动添加空格、巧用`trim`标签的修复策略,并强调参数合法性验证与SQL注入防护的最佳实践,确保代码安全与可维护性。
当MyBatis多表关联查询返回的数据总是“缺斤少两”,甚至一对多只剩一条记录时,你是否感到束手无策?本文将化身技术侦探,深入剖析字段冲突、ResultMap配置陷阱及SQL逻辑漏洞,手把手教你运用别名、id标签和逐步验证法,彻底解决结果集缺失问题,确保数据完整无误。