MyBatis?XML?里<![CDATA[?]]>的使用示例詳解
今天我們來(lái)聊聊 MyBatis XML 文件里的 <![CDATA[ ]]> ,我依稀記得我第一次看到 <![CDATA[ ]]>,心想,這是個(gè)啥???
首先我們要明確:<![CDATA[ ]]> 不是 MyBatis 的專(zhuān)屬語(yǔ)法,而是 XML 的原生語(yǔ)法(全稱(chēng) Character Data,字符數(shù)據(jù))。
XML 解析器 對(duì)某些特殊字符(比如 <、>、&、'、" 等)進(jìn)行解析的時(shí)候,可能會(huì)將這些特殊字符 誤判,比如 將 < 識(shí)別為 XML 標(biāo)簽的開(kāi)始,等等。
<![CDATA[ ]]> 的核心作用:將包裹的內(nèi)容標(biāo)記為 "純文本",XML 解析器會(huì)跳過(guò)對(duì)其中內(nèi)容的語(yǔ)法解析,直接 原樣保留,從而避免特殊字符與 XML 語(yǔ)法的沖突,保證 MyBatis 最終拿到的 SQL 是我們預(yù)期的樣子。
我們除了可以使用 <![CDATA[ ]]>,也可以使用 轉(zhuǎn)義字符。
常用的 轉(zhuǎn)義字符對(duì)照:
- < → <
- > → >
- & → &
- " → "
- ' → '
注意結(jié)尾的 ; 需要留著。
錯(cuò)誤寫(xiě)法:
<!-- XML解析器會(huì)把 < 識(shí)別為標(biāo)簽開(kāi)始,直接報(bào)錯(cuò) -->
<select id="getUserByAge" resultType="User">
SELECT * FROM user WHERE age < #{age}
</select>使用 轉(zhuǎn)義 寫(xiě)法:
<select id="getUserByAge" resultType="User">
SELECT * FROM user WHERE age < #{age}
</select>使用 CDATA 寫(xiě)法:
<select id="getUserByAge" resultType="User">
SELECT * FROM user WHERE <![CDATA[ age < #{age} ]]>
</select>是不是使用 CDATA 的可讀性要高很多,所以推薦使用 CDATA,尤其是復(fù)雜SQL。
我們看個(gè)不是很復(fù)雜的SQL。
復(fù)雜SQL 轉(zhuǎn)義 寫(xiě)法:
<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 寫(xiě)法:
<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 高版本 對(duì)部分特殊字符做了兼容,比如直接寫(xiě) > 可能不報(bào)錯(cuò)了。這是 "寬松解析",跨環(huán)境(比如不同 XML 解析器、不同數(shù)據(jù)庫(kù)驅(qū)動(dòng)等)仍有可能出問(wèn)題,推薦始終用 CDATA 保證兼容性。
<![CDATA[ ]]> 是 MyBatis 中處理 SQL 語(yǔ)句與 XML 語(yǔ)法沖突的安全屏障。對(duì)包含 特殊字符 的 SQL 片段進(jìn)行最小范圍的 CDATA 包裹,既保證了安全,又確保了 MyBatis 動(dòng)態(tài) SQL 功能的完整性。
到此這篇關(guān)于MyBatis XML 里<![CDATA[ ]]>的使用的文章就介紹到這了,更多相關(guān)MyBatis XML 里<![CDATA[ ]]>的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus混合使用XML和注解過(guò)程
- 如何在MyBatis中使用XML和注解混合配置過(guò)程
- MyBatis Mapper.xml入?yún)ist使用in函數(shù)問(wèn)題
- Mybatis mapper.xml使用全局變量的三種實(shí)現(xiàn)方法
- mybatis-config.xml文件中的mappers標(biāo)簽使用
- mybatis-plus使用xml自定義sql語(yǔ)句方式
- mybatis如何使用xml中的if-else/choose
- Mybatis使用XML實(shí)現(xiàn)動(dòng)態(tài)sql的示例代碼
- Mybatis的xml中使用if/else標(biāo)簽的具體使用
相關(guān)文章
java使用gzip實(shí)現(xiàn)文件解壓縮示例
這篇文章主要介紹了java使用gzip實(shí)現(xiàn)文件解壓縮示例,需要的朋友可以參考下2014-03-03
JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解
這篇文章主要為大家介紹了JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
springboot?aop里的@Pointcut()的配置方式
這篇文章主要介紹了springboot?aop里的@Pointcut()的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java?NIO下ByteBuffer的常用方法學(xué)習(xí)
這篇文章主要帶大家來(lái)初步學(xué)習(xí)一下NIO?中的?ByteBuffer的應(yīng)用與常用方法,文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下2023-05-05
Spring?@EventListener?異步中使用condition的問(wèn)題及處理
這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問(wèn)題及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring?框架中的?Bean?作用域(Scope)使用詳解
Spring框架中的Bean作用域(Scope)決定了在應(yīng)用程序中創(chuàng)建和管理的Bean對(duì)象的生命周期和可見(jiàn)性。本文將詳細(xì)介紹Spring框架中的Bean作用域的不同類(lèi)型,包括Singleton、Prototype、Request、Session和Application,并解釋它們的特點(diǎn)和適用場(chǎng)景。2023-09-09

