batis 配置中的<!CDATA[]]>

ibatis 配置中的<!CDATA[]]> 

经过反复的实验证实,假如在IBATIS中自己的SQL中包含
<
>
&
需要用<![CDATA[。
一般ibatis中出现<表示小于号,于XML格式冲突。>号一样。
&符号ibatis中一般不出现,除非很特殊就是写死要查某个值里含有这个&。
'单引号我试了,没有影响:类似如下SQL配置是没有题目的:
"引号我也试了,同样没有题目:类似如下:
看了IBAITS的DTD文档,没有发现有其自己定义过的实体,综上所述,只有在SQL中碰到<>&符号时才需要用
<![CDATA[
后来我又仔细学习了DTD文档

CDATA标志在属性声明中用于指明属性为CDATA字符类型,这种类型中&,<,和引号具有特殊意义。PCDATA标志在元素声明中用于指明元素有混合内容(字符数据或者字符数据与子元素的混合)。元素内容将被解析。这种类型中&和<具有特殊意义,假如不是作为标记开始,则使用时要转义。

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

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文档中预定义好的实体:

< >  小于号 

> <  大于号 

& & 和 

' ' 单引号 

" " 双引号 

一个 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["转义符中间不要用标签。

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

  <!--2010年7月2日添加 功能:查询房子到期的租赁记录 -->
  <!-- 这里之所以要将sql放在<![CDATA[ ]]>中,是因为()是特殊字符,需要转义 -->
  <select id="custom_getExpiredRentRecordInfo" resultMap="custom_RentRecordResult">
   <![CDATA[ 
    select customer_id, customer_name, room_id, register_date, 
    register_time, expire_date ,DATEDIFF(now(),t.expire_date) as expireDays
    from rent_record t where t.expire_date<now()
    ]]>
  </select> 

如果,不放在<![CDATA[ ]]>,会报错的。可以试试看。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值