MyBatis XML 里<![CDATA[ ]]>的使用示例详解

 更新时间:2026年02月12日 08:53:21   作者:烟沙九洲  
<![CDATA[ ]]>是 MyBatis中处理SQL语句与XML语法冲突的安全屏障,本文给大家介绍MyBatis XML里<![CDATA[ ]]>的使用,感兴趣的朋友跟随小编一起看看吧

今天我们来聊聊 MyBatis XML 文件里的 <![CDATA[ ]]> ,我依稀记得我第一次看到 <![CDATA[ ]]>,心想,这是个啥啊?

首先我们要明确:<![CDATA[ ]]>  不是 MyBatis 的专属语法,而是 XML 的原生语法(全称 Character Data,字符数据)。

XML 解析器 对某些特殊字符(比如 <、>、&、'、" 等)进行解析的时候,可能会将这些特殊字符 误判,比如 将 < 识别为 XML 标签的开始,等等。

<![CDATA[ ]]> 的核心作用:将包裹的内容标记为 "纯文本",XML 解析器会跳过对其中内容的语法解析,直接 原样保留,从而避免特殊字符与 XML 语法的冲突,保证 MyBatis 最终拿到的 SQL 是我们预期的样子。

我们除了可以使用 <![CDATA[ ]]>,也可以使用 转义字符

常用的 转义字符对照

  • < → &lt;
  • > → &gt;
  • & → &amp;
  • " → &quot;
  • ' → &apos;

注意结尾的 需要留着。

错误写法

<!-- XML解析器会把 < 识别为标签开始,直接报错 -->
<select id="getUserByAge" resultType="User">
    SELECT * FROM user WHERE age < #{age}
</select>

使用 转义 写法

<select id="getUserByAge" resultType="User">
    SELECT * FROM user WHERE age < #{age}
</select>

使用 CDATA 写法

<select id="getUserByAge" resultType="User">
    SELECT * FROM user WHERE <![CDATA[ age < #{age} ]]>
</select>

是不是使用 CDATA 的可读性要高很多,所以推荐使用 CDATA,尤其是复杂SQL。

我们看个不是很复杂的SQL。

复杂SQL 转义 写法

<select id="getUserBySpec" resultType="User">
    SELECT * FROM user WHERE (age &lt; #{age} OR salary &gt; #{salary})
    AND (create_time gt;= #{startTime} OR update_time lt;= #{endTime})
</select>

复杂SQL CDATA 写法

<select id="getUserBySpec" resultType="User">
    SELECT * FROM user
    <![CDATA[
        WHERE (age < #{age} OR salary > #{salary}) 
        AND (create_time >= #{startTime} OR update_time <= #{endTime})
    ]]>
</select>

MyBatis 高版本 对部分特殊字符做了兼容,比如直接写 可能不报错了。这是 "宽松解析",跨环境(比如不同 XML 解析器、不同数据库驱动等)仍有可能出问题,推荐始终用 CDATA 保证兼容性

<![CDATA[ ]]> 是 MyBatis 中处理 SQL 语句与 XML 语法冲突的安全屏障。对包含 特殊字符 的 SQL 片段进行最小范围的 CDATA 包裹,既保证了安全,又确保了 MyBatis 动态 SQL 功能的完整性。

到此这篇关于MyBatis XML 里<![CDATA[ ]]>的使用的文章就介绍到这了,更多相关MyBatis XML 里<![CDATA[ ]]>的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用gzip实现文件解压缩示例

    java使用gzip实现文件解压缩示例

    这篇文章主要介绍了java使用gzip实现文件解压缩示例,需要的朋友可以参考下
    2014-03-03
  • Java开发必备的三大修饰符

    Java开发必备的三大修饰符

    JAVA的三个修饰:static,final,abstract,在JAVA语言里无处不在,但是它们都能修饰什么组件,修饰组件的含义又有什么限制,总是混淆.所以来总结一下,需要的朋友可以参考下
    2021-06-06
  • JUC循环屏障CyclicBarrier与CountDownLatch区别详解

    JUC循环屏障CyclicBarrier与CountDownLatch区别详解

    这篇文章主要为大家介绍了JUC循环屏障CyclicBarrier与CountDownLatch区别详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • springboot aop里的@Pointcut()的配置方式

    springboot aop里的@Pointcut()的配置方式

    这篇文章主要介绍了springboot aop里的@Pointcut()的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 利用java操作Excel文件的方法

    利用java操作Excel文件的方法

    以下是对利用java操作Excel文件的方法进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • Java CAS机制的一些理解

    Java CAS机制的一些理解

    这篇文章主要介绍了Java CAS机制的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • Java NIO下ByteBuffer的常用方法学习

    Java NIO下ByteBuffer的常用方法学习

    这篇文章主要带大家来初步学习一下NIO 中的 ByteBuffer的应用与常用方法,文中的示例代码讲解详细,对我们深入学习Java有一定的帮助,感兴趣的可以了解一下
    2023-05-05
  • java泛型详解

    java泛型详解

    本文主要介绍了java泛型的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Spring @EventListener 异步中使用condition的问题及处理

    Spring @EventListener 异步中使用condition的问题及处理

    这篇文章主要介绍了Spring @EventListener 异步中使用condition的问题及处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring 框架中的 Bean 作用域(Scope)使用详解

    Spring框架中的Bean作用域(Scope)决定了在应用程序中创建和管理的Bean对象的生命周期和可见性。本文将详细介绍Spring框架中的Bean作用域的不同类型,包括Singleton、Prototype、Request、Session和Application,并解释它们的特点和适用场景。
    2023-09-09

最新评论