0.背景
当下,使用Mybatis
的XML
文件书写复杂SQL
,依然是一种主流的选择。那么,我们在书写SQL
语句时,要时刻提醒自己,自己正在书写一个XML
文件,XML
文件对于一些特殊字符,是会进行解析的。就比如<
>
。
1.使用 <![CDATA[]]>
CDATA,意为 character data,是标记语言
SGML
与XML
,表示文档的特定部分是普通的字符数据,而不是非字符数据或有特定、限定结构的字符数据。
我们举个例子:
<if test="startTimeLong!=null"><![CDATA[
and happen_time > #{startTimeLong}
]]></if>
这种方法很好,只是,我们需要手动敲入这个标签吗?不用的,我们就正常写语句,交给IDEA
就可以了,当我们敲完判断条件后,按下Alt + Enter
,就会弹出提示框,选择Convert text to CData
就可以了。
2.<![CDATA[]]>
转换成普通的text
通常情况下,我们使用这个标签就能搞定一些情况,但是对于部分人来讲,他们会觉得混乱。那么转换后的文本,再使用Convert CData to text
就可以了。
就可以得到我们想要的内容:
<if test="startTimeLong!=null">
and happen_time > #{startTimeLong}
</if>
当然了,IDEA
对于<
支持得不好,所以没有使用<
来做演示,遇到<
的情况还得手动移动一下]]
到句子末尾。
3.XML
文件中的特殊字符的写法
特殊字符 | 转义字符 |
---|---|
& | & |
< | < |
> | > |
" | " |
’ | ' |
4.总结讨论
如果你是在写SQL
,能够使用<![CDATA[]]>
,那是最好,大部分情况下你都不需要想,直接套就行。
若是自己输出XML
文件时,情况就不同了,比如:
CDATA
节不能嵌套。如果文本中需要包含3字符序列]]>
,需要用两个相邻的CDATA
节表示它,如下例:
<![CDATA[]]]]><![CDATA[>]]>
故,在自己进行XML
文件输出时,应该抛弃此标签,避免一些奇怪的问题,而是使用字符串替换的方式,将特殊字符的转义字符替换过来。
总结一下: