zoukankan      html  css  js  c++  java
  • ibatis CDATA

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

    环境:oracle、ibatis、java

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

  • 相关阅读:
    选择器的用处
    全栈工程师基础知识与笔记
    9.13日笔记
    9.12笔记
    9.11Css
    学习笔记
    9.10HTLM
    redis和memcached的区别(总结)
    OO第四次博客作业
    OO第三次博客作业
  • 原文地址:https://www.cnblogs.com/fhtwins/p/4155237.html
Copyright © 2011-2022 走看看