MyBatis?XML?里<![CDATA[?]]>的使用示例詳解
今天我們來聊聊 MyBatis XML 文件里的 <![CDATA[ ]]> ,我依稀記得我第一次看到 <![CDATA[ ]]>,心想,這是個啥???
首先我們要明確:<![CDATA[ ]]> 不是 MyBatis 的專屬語法,而是 XML 的原生語法(全稱 Character Data,字符數(shù)據(jù))。
XML 解析器 對某些特殊字符(比如 <、>、&、'、" 等)進行解析的時候,可能會將這些特殊字符 誤判,比如 將 < 識別為 XML 標簽的開始,等等。
<![CDATA[ ]]> 的核心作用:將包裹的內(nèi)容標記為 "純文本",XML 解析器會跳過對其中內(nèi)容的語法解析,直接 原樣保留,從而避免特殊字符與 XML 語法的沖突,保證 MyBatis 最終拿到的 SQL 是我們預(yù)期的樣子。
我們除了可以使用 <![CDATA[ ]]>,也可以使用 轉(zhuǎn)義字符。
常用的 轉(zhuǎn)義字符對照:
- < → <
- > → >
- & → &
- " → "
- ' → '
注意結(jié)尾的 ; 需要留著。
錯誤寫法:
<!-- XML解析器會把 < 識別為標簽開始,直接報錯 -->
<select id="getUserByAge" resultType="User">
SELECT * FROM user WHERE age < #{age}
</select>使用 轉(zhuǎn)義 寫法:
<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,尤其是復(fù)雜SQL。
我們看個不是很復(fù)雜的SQL。
復(fù)雜SQL 轉(zhuǎn)義 寫法:
<select id="getUserBySpec" resultType="User">
SELECT * FROM user WHERE (age < #{age} OR salary > #{salary})
AND (create_time gt;= #{startTime} OR update_time lt;= #{endTime})
</select>復(fù)雜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 高版本 對部分特殊字符做了兼容,比如直接寫 > 可能不報錯了。這是 "寬松解析",跨環(huán)境(比如不同 XML 解析器、不同數(shù)據(jù)庫驅(qū)動等)仍有可能出問題,推薦始終用 CDATA 保證兼容性。
<![CDATA[ ]]> 是 MyBatis 中處理 SQL 語句與 XML 語法沖突的安全屏障。對包含 特殊字符 的 SQL 片段進行最小范圍的 CDATA 包裹,既保證了安全,又確保了 MyBatis 動態(tài) SQL 功能的完整性。
到此這篇關(guān)于MyBatis XML 里<![CDATA[ ]]>的使用的文章就介紹到這了,更多相關(guān)MyBatis XML 里<![CDATA[ ]]>的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis實現(xiàn)自定義MyBatis插件的流程詳解
MyBatis的一個重要的特點就是插件機制,使得MyBatis的具備較強的擴展性,我們可以根據(jù)MyBatis的插件機制實現(xiàn)自己的個性化業(yè)務(wù)需求,本文給大家介紹了MyBatis實現(xiàn)自定義MyBatis插件的流程,需要的朋友可以參考下2024-12-12
IDEA快速創(chuàng)建SpringBoot項目的圖文詳解與避坑指南
IntelliJ IDEA作為Java開發(fā)者的?首選IDE?,深度集成Spring Boot支持,可一鍵生成項目骨架和智能配置依賴,下面我們就來看看如何零基礎(chǔ)?通過IDEA創(chuàng)建Spring Boot項目吧2025-05-05
在SpringBoot中整合數(shù)據(jù)源的示例詳解
這篇文章主要介紹了在SpringBoot中如何整合數(shù)據(jù)源,本文介紹了如何在SpringBoot項目中整合常見的數(shù)據(jù)源,包括JdbcTemplate、MyBatis和JPA,并探討了如何配置和使用多數(shù)據(jù)源,需要的朋友可以參考下2023-06-06
Java基于外觀模式實現(xiàn)美食天下食譜功能實例詳解
這篇文章主要介紹了Java基于外觀模式實現(xiàn)美食天下食譜功能,較為詳細的講述了外觀模式的概念、原理并結(jié)合實例形似詳細分析了Java基于外觀模式實現(xiàn)美食天下食譜功能的具體操作步驟與相關(guān)注意事項,需要的朋友可以參考下2018-05-05
Spring Security使用單點登錄的權(quán)限功能
本文主要介紹了Spring Security使用單點登錄的權(quán)限功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

