使用小于号或小于等于号的场景
<delete id="delOvertimeLog" parameterType="java.lang.Integer">
DELETE FROM operate_log
WHERE operate_time < CURDATE() - INTERVAL #{logCleanTime} DAY
</delete>
现象:会报解析异常
Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 53; 元素内容必须由格式正确的字符数据或标记组成。
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:259) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:125) ~[mybatis-3.4.4.jar:3.4.4]
at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:78) ~[mybatis-3.4.4.jar:3.4.4]
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:520) ~[mybatis-spring-1.3.1.jar:1.3.1]
... 54 common frames omitted
解决方案:
<delete id="delOvertimeLog" parameterType="java.lang.Integer">
DELETE FROM operate_log
WHERE operate_time < CURDATE() - INTERVAL #{logCleanTime} DAY
</delete>
使用大于号的场景
<delete id="delOvertimeLog" parameterType="java.lang.Integer">
DELETE FROM operate_log
WHERE operate_time > CURDATE() - INTERVAL #{logCleanTime} DAY
</delete>
现象:正常执行,没有错误
总结
如果用小于号(<) 或者小于等于号(<=)则必须转义,其余可以不转义。因为Mapper.xml 文件里 < (小于)号 , >(大于)号 ,会被认为是括号。
附录
| 转义代码 | 字符 | 含义 |
|---|---|---|
| < | < | 小于号 |
| > | > | 大于号 |
| & | & | 和 |
| ' | ' | 单引号 |
| " | " | 双引号 |

本文探讨了在MyBatis Mapper XML文件中使用小于号和大于号时遇到的问题及解决方法。指出在XML文件中直接使用小于号会导致解析异常,并提供了正确的转义方式。同时列举了XML中的常见转义字符。
5775





