Java 开发使用 MyBatis PostgreSQL 问题:使用了特殊字符而没有正确转义

xml 复制代码
<delete id="deleteBeforeDate">
    DELETE FROM record
    WHERE operate_time
    <
    #{date}
</delete>
  • 在 Spring Boot 项目中,使用 MyBatis PostgreSQL,上述 SQL 语句 XML 解析错误,出现如下错误信息

    Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。
    at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
    at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1465)

    复制代码
      ...
问题原因
  1. 这个错误信息表示在 XML 中使用了特殊字符而没有正确转义

  2. 其中,小于号 < 在 XML 中属于特殊字符,需要转义

处理策略
  1. < 替换为 XML 转义字符 &lt;
xml 复制代码
<delete id="deleteBeforeDate">
    DELETE
    FROM record
    WHERE operate_time &lt; #{date}
</delete>
  1. 或者,使用 <![CDATA[]]> 来包裹包含特殊字符的内容,更清晰,更推荐使用
xml 复制代码
<delete id="deleteBeforeDate">
    <![CDATA[
    DELETE
    FROM record
    WHERE operate_time < #{date}
    ]]>
</delete>
相关推荐
两个蝴蝶飞20 小时前
Java量化系列(四):实现自选股票维护功能
java·经验分享
安当加密21 小时前
MySQL 数据库如何加密脱敏?TDE透明加密 + DBG数据库网关 双引擎加固实战
数据库·mysql·adb
半桶水专家21 小时前
go语言中的结构体嵌入详解
开发语言·后端·golang
IT技术分享社区21 小时前
MySQL统计查询优化:内存临时表的正确打开方式
数据库·mysql·程序员
短剑重铸之日21 小时前
7天读懂MySQL|Day 5:执行引擎与SQL优化
java·数据库·sql·mysql·架构
酒九鸠玖1 天前
Java--多线程
java
Dreamboat-L1 天前
云服务器上部署nginx
java·服务器·nginx
长安er1 天前
LeetCode215/347/295 堆相关理论与题目
java·数据结构·算法·leetcode·
好记忆不如烂笔头abc1 天前
RECOVER STANDBY DATABASE FROM SERVICE xxx,ORA-19909
数据库
writeone1 天前
数据库习题
数据库