Mybatis xml中SQL处理小于号与大于号

在MyBatis项目中遇到编译错误,原因是SQL查询语句中的小于号(<)在XML中被误解析。解决方案包括对特殊字符进行转义或者使用CDATA包裹SQL片段。转义字符适用于所有情况但可能导致长字符串可读性差,而CDATA则避免了XML解析,提高效率。理解两者在不同场景下的应用是关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目编译过程中,会出现如下错误

Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 693; columnNumber: 27; The content of elements must consist of well-formed character data or markup.
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:263)
	at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:127)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:81)
	at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.buildSqlSessionFactory(MybatisSqlSessionFactoryBean.java:592)
	... 75 common frames omitted

根据错误提示信息(创建文档实例时出错。原因:xml异常),然后找到xml查看

<select id="findYesterdayOrderByGroupBatchId" resultType="com.touchealth.physical.bo.order.OrderBo">
        select
            *
        from
            trd_order
        where order_state in (1, 2)
        and checkup_type = 2
        and created_time >= #{startTime}
        and created_time <=  #{endTime}
        and deleted_flag = 0
        and group_batch_id in
        <foreach collection="groupBatchIds" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>

因为语句中有一个小于号“<”,在XML中,会被当成一个页面元素来解析,不会处理为mysql的SQL语句的组成部分

解决办法

1. 只需要对使用大于号, 小于号的地方进行转义即可, 其对应的关系如下表所示
在这里插入图片描述
2. 将需要使用特殊字符的SQL语句写在 <![CDATA[...]]> 中, 其中的特殊符号不进行解析

<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”。

最后,说说<![CDATA[]]>xml转移字符的关系,它们两个看起来是不是感觉功能重复了?

是的,它们的功能就是一样的,只是应用场景和需求有些不同:

  • <![CDATA[]]>不能适用所有情况,转义字符可以;
  • 对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差;
  • <![CDATA[]]>表示xml解析器忽略解析,所以更快。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚双鱼座的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值