Skip to content

MyBatis比较符安全写法


在写 MyBatis Mapper XML 的时候,我经常会遇到一个小坑:有时候 SQL 里的 >= 可以直接写,有时候却报语法错误。刚开始我还以为是 SQL 写错了,但仔细排查才发现,这其实是 XML 解析的问题

在 XML 文件里,像 <、>、& 这些符号都是有特殊含义的:

  • < 用于标签开始

  • > 用于标签结束

  • & 用于转义

所以当在 Mapper 里直接写:

<select id="selectUsers" parameterType="int" resultType="User">
SELECT * FROM user WHERE age >= {age}
</select>
  • 有时候 MyBatis 可以解析正常;

  • 有时候解析器会把 >= 当作非法字符或 XML 语法的一部分,报错。

所以问题并不是 SQL 本身,而是 XML 对符号的敏感性

这是最推荐的方法,也是现在几乎默认用的方法:

<select id="selectUsers" parameterType="int" resultType="User">
SELECT * FROM user WHERE age <![CDATA[>=]]> #{age}
</select>
  • <![CDATA[ ... ]]> 表示 这里的内容不要解析 XML 标签

  • 任何特殊符号都可以安全放进去,比如 >=、<=、&

SELECT * FROM user WHERE age &gt;= #{age}
  • <&lt;

  • >&gt;

  • &&amp;

虽然可行,但可读性不如 CDATA 好,尤其是符号多时。

  • 问题原因>=、<=、& 等符号在 XML 中可能被误读

  • 推荐做法

    1. <![CDATA[>=]]> → 安全且可读性好

    2. &gt;= → 可用但略显繁琐

  • 动态 SQL 中也建议用 CDATA 包裹符号