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>
相关推荐
Hui Baby24 分钟前
Spring Security
java·后端·spring
IT笔记1 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
逝水无殇1 小时前
C# 运算符重载详解
开发语言·后端·c#
哥是强混1 小时前
Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
网络·数据库·.net
ffqws_1 小时前
redis面试:如何保证双写一致
数据库·redis·缓存
我才是银古2 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
TPBoreas2 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
水无痕simon2 小时前
6 数据库同义词
数据库
敲代码的嘎仔2 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森2 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python