MyBatis比较符安全写法
在写 MyBatis Mapper XML 的时候,我经常会遇到一个小坑:有时候 SQL 里的 >= 可以直接写,有时候却报语法错误。刚开始我还以为是 SQL 写错了,但仔细排查才发现,这其实是 XML 解析的问题。
1. 问题原因
Section titled “1. 问题原因”在 XML 文件里,像 <、>、& 这些符号都是有特殊含义的:
-
<用于标签开始 -
>用于标签结束 -
&用于转义
所以当在 Mapper 里直接写:
<select id="selectUsers" parameterType="int" resultType="User"> SELECT * FROM user WHERE age >= {age}</select>-
有时候 MyBatis 可以解析正常;
-
有时候解析器会把
>=当作非法字符或 XML 语法的一部分,报错。
所以问题并不是 SQL 本身,而是 XML 对符号的敏感性。
2. 解决方案
Section titled “2. 解决方案”2.1. 使用 <![CDATA[]]>
Section titled “2.1. 使用 <![CDATA[]]>”这是最推荐的方法,也是现在几乎默认用的方法:
<select id="selectUsers" parameterType="int" resultType="User"> SELECT * FROM user WHERE age <![CDATA[>=]]> #{age}</select>-
<![CDATA[ ... ]]>表示 这里的内容不要解析 XML 标签 -
任何特殊符号都可以安全放进去,比如
>=、<=、&
2.2. 使用 XML 转义字符
Section titled “2.2. 使用 XML 转义字符”SELECT * FROM user WHERE age >= #{age}-
<→< -
>→> -
&→&
虽然可行,但可读性不如 CDATA 好,尤其是符号多时。
-
问题原因:
>=、<=、&等符号在 XML 中可能被误读 -
推荐做法:
-
<![CDATA[>=]]>→ 安全且可读性好 -
>=→ 可用但略显繁琐
-
-
动态 SQL 中也建议用 CDATA 包裹符号