在编写 MyBatis Mapper XML 文件时,如果直接在 SQL 语句中使用小于号(<),经常会收到 Tag name expected 的错误提示。这其实不是 MyBatis 本身的 bug,而是底层 XML 解析器的规则限制。
XML 规范中,尖括号 < 和 > 被定义为标签的开始和结束符号。当解析器读到 < 时,它会认为一个新的元素即将开始。如果在属性值或文本内容中直接放入 <,解析器就会混淆结构,从而抛出异常。
以常见的查询条件为例,假设我们需要过滤长度小于 180 的数据:
<select id="selectHavingOtherResultNotYetProcessed" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from mark_result
where length(ai_json) < 180 and ai_json not like '{"gmtModified%' AND
ai_json not like '{}' and code is null
</select>
上面的写法在 XML 中是非法的。要解决这个问题,需要使用 XML 预定义的实体引用将特殊字符转义。具体做法是将 < 替换为 <。修正后的代码片段如下:
<select id="selectHavingOtherResultNotYetProcessed" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from mark_result
where length(ai_json) < 180 and ai_json not like '{"gmtModified%' AND
ai_json not like '{}' and code is null
</select>
除了小于号,XML 中还有几个预定义的实体引用需要留意:
<代表<>代表>&代表&"代表"'代表'
虽然严格来说只有 < 和 & 是必须转义的,但在实际开发中,为了保持代码的一致性和避免潜在风险,建议将 > 也进行转义处理。养成这个习惯后,能减少很多莫名其妙的解析错误。


