ibatis中CDATA的使用【转】

ibatis CDATA

 

在使用ibatis时,经常需要配置待执行的sql语句。使用过ibatis的朋友都知道,无可避免的都会碰到一些不兼容、冲突的字符,多数人也都知道用<![CDATA[   ]]>标记避免Sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响。但是,如果在ibatis中使用了动态语句的时候,还是有一些细节需要注意。下面举例说明一下:

 

 

 

环境:oracleibatisjava

 

 

 

错误例1:符号“<=”会对xml映射文件的合法性造成影响

 

 

 

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long"> 

 

select id

 

from tableA a,

 

     tableB b

 

 <dynamic prepend="WHERE">

 

 <isNotNull prepend="AND" property="startDate">

 

  a.act_time >= #startDate#

 

  and a.act_time <= #endDate#

 

  and a.id = b.id

 

 </isNotNull>   

 

 </dynamic> 

 

</select>

 

 

 

错误例2:将整个sql语句用<![CDATA[   ]]>标记来避免冲突,在一般情况下都是可行的,但是由于该sql配置中有动态语句(where部分),将导致系统无法识别动态判断部分,导致整个sql语句非法。

 

 

 

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">

 

<![CDATA[  

 

select id

 

from tableA a,

 

     tableB b

 

 <dynamic prepend="WHERE">

 

 <isNotNull prepend="AND" property="startDate">

 

  a.act_time >= #startDate#

 

  and a.act_time <= #endDate#

 

  and a.id = b.id

 

 </isNotNull>   

 

 </dynamic> 

 

  ]]>

 

</select>

 

 

 

正确做法:缩小范围,只对有字符冲突部分进行合法性调整。

 

 

 

<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long"> 

 

select id

 

from tableA a,

 

     tableB b

 

 <dynamic prepend="WHERE">

 

 <isNotNull prepend="AND" property="startDate">

 

  a.act_time >= #startDate#

 

  <![CDATA[ and a.act_time <= #endDate#  ]]>

 

  and a.id = b.id

 

 </isNotNull>   

 

 </dynamic> 

 

</select>

 

------------------------------------------------------------------

ibatis中应该经常见到"<![CDATA["这样的东西吧,它的用处应该是转义一些特殊关键字字符,不合法的XML字符必须被替换为相应的实体。 下面是五个在XML文档中预定义好的实体:

 

< &gt;  小于号

> &lt;  大于号

& &

&apos; ' 单引号

" " 双引号

 

一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:

 

<message>if salary < 1000 then</message>

 

为了避免出现这种情况,必须将字符"<" 转换成实体,象下面这样:

 

<message>if salary < 1000 then</message>

 

这里有一个问题,由于我在ibatis中用到了一个循环标签"<iterate>" ,为了写一个  类似

 

SELECT * FROM b

 

WHERE b.trade_no in

 <iterate property="tradeNoList" open="(" close=")" conjunction=",">#tradeNoList[]#</iterate>

   AND .........这样的一个语句。

 

由于"<iterate"标签以 "<"开头,那么可能被"<![CDATA["转义了,所以造成语法错误,sql不能正常执行,去掉"<![CDATA["后发现sql能正常执行。

 

所以在碰到类似问题的时候,应该留意,在"<![CDATA["转义符中间不要用标签。

 

你可能感兴趣的:(ibatis)