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

  • 相关阅读:
    IDEA中getgetServletContext()报错
    会话跟踪小结
    Sklearn-CrossValidation交叉验证
    js定时器 数码时钟
    centos7 新建用户并获取root权限
    linux cetos7 yum 安装redis
    mybatis 中 使用 List<Map<String,Object>> Map<String,Object>接收结果
    Mybatis resultMap 中 collection association 的用法
    各大型邮箱smtp服务器及端口收集: SMTP
    Mybatis 动态sql 示例 复杂类型对象 作为参数进行取值
  • 原文地址:https://www.cnblogs.com/fhtwins/p/4155237.html
Copyright © 2020-2023  润新知