在xml中,不能存在如下的特殊字符:
大于等于符号:>=
小于等于符号:<=
不等于符号:<>
大于符号:>
小于符号:<
且符号:&
英文双引号符号:"
英文单引号符号:'
…
如果xml中需要写入特殊符号,则需要添加<![CDATA[]]>。
2. 概述<![CDATA[ ]]>
上文提到了<![CDATA[]]>,那么,我就简要概述它。
被<![CDATA[]]>这个标记,所包含的内容将表示为纯文本,比如<![CDATA[ < ]]>表示文本内容"<"。
平时在mybatis的映射文件写sql时,很多时候都需要写一些特殊的字符。例如:<字符、>字符、>=字符、<=字符,但是在xml文件中并不能直接写上述列举的字符,否则就会报错。
因为在解析xml文件时,我们如果书写了特殊字符,在没有特殊处理的情况下。
这些字符会被转义,但我们并不希望它被转义,所以我们要使用<![CDATA[ ]]>来解决。
那为什么要这样书写呢?<![CDATA[ ]]>是XML语法,在CDATA内部的所有内容都会被解析器忽略。
所以,当我们在xml文本中包含了很多的<、<= 和 &字符,就像程序代码一样,那么最好把他们都放到CDATA部件中。
3. 书写规范 需要注意的问题就是,在我们的mybatis的映射文件中,以下<where>、<select> 等这些标签都不会被解析,所以,我们只把有特殊字符的语句放在<![CDATA[ ]]>中,尽量缩小<![CDATA[ ]]>的范围。
因而,我在上文的sql语句中,存在不等于符号(<>),那么,我可以进行如下修改: <select id="queryByUsernameAndId" resultType="com.test.entity.po.User"> SELECT * FROM `user` <where> username = #{username} AND id <![CDATA[ <> ]]> #{userId} and deleted = 0 and user_status = 1 LIMIT 1 </where> </select>
4. 文末总结
不管怎么样,转义前的字符也好,转义后的字符也好,都会被xml解析器解析。
为了方便起见,使用<![CDATA[]]>来包含不被xml解析器解析的内容。
但要注意的是:
此部分不能再包含]]>
不允许嵌套使用
]]>这部分不能包含空格或者换行。
最后,说说<![CDATA[]]>和xml转移字符的关系,它们两个看起来是不是感觉功能重复了? 是的,它们的功能就是一样的,只是应用场景和需求有些不同:
<![CDATA[]]>不能适用所有情况,转义字符可以
对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差;
<![CDATA[]]>表示xml解析器忽略解析,所以更快。