在 MyBatis 中,<
和 >
在动态 SQL 标签内部 无需转义的功能是在以下版本引入的:
📌 关键版本说明
版本 | 支持情况 | 注意事项 |
---|---|---|
MyBatis 3.3.0+ | ✅ 在 <if> 、<where> 、<set> 等动态 SQL 标签内部 可直接使用 < 和 > |
首次官方支持 (官方更新日志) |
MyBatis 3.2.8 及之前 | ❌ 所有位置都需要转义 | 需使用 < 、> 或 CDATA |
🌟 使用场景(仅限 MyBatis 3.3.0+)
<!-- 在动态SQL标签内部直接使用 -->
<select id="getUsers" resultType="User">
SELECT * FROM users
<where>
<if test="minAge != null">
age > #{minAge} <!-- 直接使用 > -->
</if>
<if test="maxAge != null">
AND age < #{maxAge} <!-- 直接使用 < -->
</if>
</where>
</select>
⚠️ 重要限制
-
仅限动态 SQL 标签内 (如
<if>
、<foreach>
、<choose>
、<where>
、<set>
等)<!-- 错误示例:不在动态标签内仍需转义 --> SELECT * FROM products WHERE price > 100 <!-- 这里会报XML解析错误! -->
-
纯 SQL 块仍需处理
非动态部分的 SQL 仍需 CDATA 或转义:
<select id="getProducts"> <!-- 静态SQL部分需要CDATA --> <![CDATA[ SELECT * FROM products WHERE price > 100 ]]> </select>
🛠️ 兼容性建议
-
检查 MyBatis 版本
<!-- pom.xml 示例 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> <!-- 推荐用新版 --> </dependency>
-
当不确定时统一用 CDATA
<![CDATA[ age > #{value} ]]>
-
动态 SQL 外的比较符号 始终用别名:
WHERE price > 100 <!-- 通用方案 -->