在 MyBatis 的 XML 映射文件中,特殊符号的处理是一个经典的“坑”,主要分两种情况:SQL 语句里的特殊字符和MyBatis 自身的占位符冲突。
针对你问的“满杯的死面文件”(我猜是“MyBatis 的 XML 文件”),下面这四种场景的处理方案最常用:
1. 比较运算符<>、>=、<=(最常踩的坑)
在 XML 里,尖括号<>会被解析为标签,直接写>或<会导致解析失败。
✅ 推荐用<![CDATA[ ]]>包裹
xml
<select id="query" resultType="..."> <![CDATA[ SELECT * FROM table WHERE age >= 18 AND status <> 0 AND create_time <= NOW() ]]> </select>
✅ 也可以用实体符号代替
<=写成<=>=写成>=<>写成<>或!=
2. LIKE 语句中的%和_
这两个是 SQL 的通配符,直接写在#{}里会被当作字面值,但如果你写的是'%${value}%',会有 SQL 注入风险。
✅ 正确做法:在 Java 代码里拼好通配符,用#{}传进去
java
// Java 代码 String keyword = "%" + text + "%";
xml
<!-- XML 文件 --> <select id="search" resultType="..."> SELECT * FROM table WHERE name LIKE #{keyword} </select>3. 与 MyBatis 占位符冲突(${}和#{}的边界问题)
有时候你的 SQL 里需要用到${}这种字符串拼接,但里面的内容本身就有},或者你想用${}传一个表名进来。
✅ 比较稳妥的方式:区分业务逻辑,能不用${}就尽量不用,如果要用,参数必须在上游做白名单校验。
4. 注释里的特殊符号
XML 的注释<!-- -->里面不能有连续的两个短横线--,否则会报错。
xml
<!-- 错误写法:里面有 -- SELECT 1 -- 这是一个注释 --> <!-- 正确写法:去掉 -- -->
🎯 一个“万能”解决方案:用<![CDATA[ ]]>
如果你懒得记这些规则,直接在 XML 的 SQL 外层套一个<![CDATA[ ]]>标签,里面的内容就不会被 XML 解析器干扰,你可以随便写>、<、&这些符号。
记住:#{}和${}放在 CDATA 里面是无效的,会被当作普通字符串处理。所以要把占位符放在 CDATA 外面。
xml
<select id="safeQuery" resultType="..."> <![CDATA[ SELECT * FROM table WHERE age >= 18 ]]> AND name = #{name} </select>你是在写>=、<=时报错了,还是在用LIKE模糊查询时遇到问题?如果是前者,直接套CDATA就行。