问题
在项目开发中,使用到了ibatis作为项目的数据库访问持久层。在sqlmap的XML配置文件中编写一条SQL语句时,遇到这样的问题:where条件中包括了判断出生日期在某一段时间内。
刚开始我是这么写的
<isNotEmpty property="ageBeginTime" prepend=" and ">
A.CSRQ>=#ageBeginTime#
</isNotEmpty>
<isNotEmpty property="ageEndTime" prepend=" and ">
A.CSRQ<=#ageEndTime#
</isNotEmpty>
此时IDE就报出了配置出错的信息
通过查阅资料,明白是判断条件中的大于>和小于<出错,它会使XML解析器产生混淆。也就像JSON格式中出现双引号会使得格式出错的场景。
那么解决办法,也就是对大于和小于进行转义,将大于号>改为>
、小于号<改为<
另外在查阅资料中,在看别人写的SQL中,使用到的是下面这种方法来防止特殊字符的。
<isNotEmpty property="ageBeginTime" prepend=" and ">
<![CDATA[ A.CSRQ>=#ageBeginTime# ]]>
</isNotEmpty>
<isNotEmpty property="ageEndTime" prepend=" and ">
<![CDATA[ A.CSRQ<=#ageEndTime# ]]>
</isNotEmpty>
通过<![CDATA[条件值]]>来解决此问题。
当时没有深究,也就这么用了。后来今天在一本书看到了关于此问题更详细的描述。
处理方式
在XML中有5个特殊的字段,分别是: & < > " '。
如果XML配置文件中的注入值包括这一些特殊字符的话,就需要特别的处理。
处理方式有两种:
1、使用<![CDATA[]]>
这个标签将包括特殊字符的注入值封装起来
2、使用XML转义序列
表示这些特殊字符
五个符号的转义序列如下:
- 小于号<对应的是
<
- 大于号>对应的是
>
- 联结符&对应的是
&
- 双引号"对应的是
"
- 单引号'对应的是
'
备注
在MarkDown中为防止>
被直接解析成了;
,可以采用`符号将其包裹起来。