当前位置: 首页 > news >正文

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 &lt; #{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 功能的完整性。

手执烟火以谋生,心怀诗意以谋爱。-- 烟沙九洲

http://www.jsqmd.com/news/371284/

相关文章:

  • elasticSearch之API:基础命令及文档基本操作
  • 【Azure Event Hub】在VMSS中使用WAD(Window Azure Diagnostic)插件发送日志到Event Hub中报错分析
  • Flask-SocketIO深度详解
  • 数据可视化能将复杂的临床数据转换成直观的图形和图像,展示数据间的关联和趋势,通过人类视觉思维能力帮助理解大量数据信息,发现数据中的规律,从而提高数据使用效率
  • Flask-Migrate深度详解
  • 价值投资经典书籍:《李大霄投资战略(第三版)》电子版解读:投资四面体模型分析(附PDF文件分享)
  • 26春1-6年级下册语文《寒假预习知识点汇总》pdf合集下载
  • 2025年Agent概念落地,2026年智能体生产力基础设施:如何规模化部署Agent?收藏这份学习指南!
  • 投资经典书籍之《股票大作手回忆录 丁圣元注疏版》PDF分享与深度解读
  • 中科天玑全要素AI舆情系统功能、架构解析 - 教程
  • 大模型幻觉:小白程序员必看!收藏这份2025年突破性检测与抑制技术指南
  • 【UMEP第12.4期】GQF教程-估算人类活动热通量
  • 从零到一:使用Hadoop构建高并发推荐系统
  • 2026年比较好的ULPA超高效空气过滤器/活性炭空气过滤器生产厂家实力参考哪家强(更新) - 行业平台推荐
  • 2026-02-11 考试总结 - Sail-With
  • 【UMEP第12.3期】LQF实例教程:模拟伦敦2015年人类活动热通量QF
  • 2026年质量好的轻型反弹器/卡扣式反弹器哪家好销售厂家推荐 - 行业平台推荐
  • 2026年比较好的冰雕施工/户外冰雕怎么联系实用公司采购参考 - 行业平台推荐
  • 2026年靠谱的耐磷酸涂料/耐盐酸涂料公司口碑推荐哪家靠谱 - 行业平台推荐
  • 【UMEP第12.3期】LQF教程-估算人类活动热通量
  • 2026年口碑好的成套配电箱/动力配电箱畅销厂家采购指南如何选 - 行业平台推荐
  • 2025提示工程架构师趋势:AI提示系统个性化的情感化设计
  • Flask-Caching深度详解
  • Flask 技术栈
  • 为什么同样是学过C++,有人面试碾压,有人开口就怂?差距在这18个C++硬核项目
  • Java常用底层数据结构设计思想-集合类-复用强相关的闲置变量
  • 基金申请季必备:这份攻略帮你轻松拿下项目
  • Flask-Login深度详解
  • 企业数字化转型的AI智慧密码,AI应用架构师的方案策略全解
  • SSH:Windows系统、Linux系统配置如此简单