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>
相关推荐
JAVA面经实录91711 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
周杰伦fans12 小时前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
Flying pigs~~12 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
misL NITL13 小时前
mysql之如何获知版本
数据库·mysql
许彰午13 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
2401_8323655214 小时前
JavaScript中rest参数(...args)取代arguments的优势
jvm·数据库·python
Bat U14 小时前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰14 小时前
C++ 排列组合完整指南
开发语言·c++·算法
2301_7796224115 小时前
Go语言怎么用信号量控制并发_Go语言semaphore信号量教程【入门】
jvm·数据库·python