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>
相关推荐
沃尔威武6 小时前
数据库 Sinks(.net8)
数据库·.net·webview
014-code6 小时前
订单超时取消与库存回滚的完整实现(延迟任务 + 状态机)
java·开发语言
lly2024066 小时前
组合模式(Composite Pattern)
开发语言
Dreamboat¿7 小时前
SQL 注入漏洞
数据库·sql
游乐码7 小时前
c#泛型约束
开发语言·c#
Dontla7 小时前
go语言Windows安装教程(安装go安装Golang安装)(GOPATH、Go Modules)
开发语言·windows·golang
chushiyunen7 小时前
python rest请求、requests
开发语言·python
铁东博客7 小时前
Go实现周易大衍筮法三变取爻
开发语言·后端·golang
baidu_huihui7 小时前
在 CentOS 9 上安装 pip(Python 的包管理工具)
开发语言·python·pip
南 阳7 小时前
Python从入门到精通day63
开发语言·python