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[ ]]>的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis实现自定义MyBatis插件的流程详解

    MyBatis实现自定义MyBatis插件的流程详解

    MyBatis的一个重要的特点就是插件机制,使得MyBatis的具备较强的扩展性,我们可以根据MyBatis的插件机制实现自己的个性化业务需求,本文给大家介绍了MyBatis实现自定义MyBatis插件的流程,需要的朋友可以参考下
    2024-12-12
  • java map中相同的key保存多个value值方式

    java map中相同的key保存多个value值方式

    这篇文章主要介绍了java map中相同的key保存多个value值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • @OneToMany查询陷入循环引用的解决方案

    @OneToMany查询陷入循环引用的解决方案

    这篇文章主要介绍了@OneToMany查询陷入循环引用的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot整合minio服务的示例代码

    SpringBoot整合minio服务的示例代码

    本文主要介绍了SpringBoot整合minio服务的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • IDEA快速创建SpringBoot项目的图文详解与避坑指南

    IDEA快速创建SpringBoot项目的图文详解与避坑指南

    IntelliJ IDEA作为Java开发者的‌首选IDE‌,深度集成Spring Boot支持,可一键生成项目骨架和智能配置依赖,下面我们就来看看如何零基础‌通过IDEA创建Spring Boot项目吧
    2025-05-05
  • 在SpringBoot中整合数据源的示例详解

    在SpringBoot中整合数据源的示例详解

    这篇文章主要介绍了在SpringBoot中如何整合数据源,本文介绍了如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨了如何配置和使用多数据源,需要的朋友可以参考下
    2023-06-06
  • Netty 轻松实现文件上传功能

    Netty 轻松实现文件上传功能

    今天我们来完成一个使用netty进行文件传输的任务。在实际项目中,文件传输通常采用FTP或者HTTP附件的方式,对Netty 文件上传功能感兴趣的朋友一起看看吧
    2021-07-07
  • idea打开和读取*properties文件乱码的解决

    idea打开和读取*properties文件乱码的解决

    本文主要介绍了idea打开和读取*properties文件乱码的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Java基于外观模式实现美食天下食谱功能实例详解

    Java基于外观模式实现美食天下食谱功能实例详解

    这篇文章主要介绍了Java基于外观模式实现美食天下食谱功能,较为详细的讲述了外观模式的概念、原理并结合实例形似详细分析了Java基于外观模式实现美食天下食谱功能的具体操作步骤与相关注意事项,需要的朋友可以参考下
    2018-05-05
  • Spring Security使用单点登录的权限功能

    Spring Security使用单点登录的权限功能

    本文主要介绍了Spring Security使用单点登录的权限功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论