`

(转)注意ibatis2中的 <![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["转义符中间不要用标签。
分享到:
评论

相关推荐

    ibatis and和or联合查询 .doc

    ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或注解进行配置,将接口及Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。 #### 二、and与or联合查询基础 在SQL查询中,`AND...

    Ibatis查询Id列表.doc

    根据提供的文档信息,我们可以深入探讨Ibatis框架中的一个具体应用场景:如何通过动态SQL查询特定条件下的ID列表。本文将从以下几个方面进行详细解析: ### 一、Ibatis简介 Ibatis是一个基于Java的持久层框架,它...

    Ibatis查询语句里,可以使用多表查询

    iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL 生成等,它通过配置文件或者注解的形式来实现 SQL 语句...

    Ibatis多表查询

    接下来,我们需要在 Ibatis 中配置这两个实体类以及它们之间的关联。 **`book.xml` 文件:** ```xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN...

    ibatis日期格式.doc

    在iBatis中,实现批量删除可以通过动态SQL,使用`IN`操作符结合`&lt;foreach&gt;`标签,将选中的ID集合传入SQL语句中。 2. **小组审核管理** - **问题1**: 建议优化`search`方法,使用联合查询替代多条SQL语句。iBatis...

    ibatis教程学习笔记

    ### ibatis教程学习笔记 #### 一、ibatis简介与特点 ibatis 是一个基于 Java 的持久层框架,它提供了一种将 SQL 映射到 Java 对象的方式,简化了 JDBC 的复杂操作。ibatis 通过 XML 配置文件或者注解的形式来描述 ...

    ibatis高级特性

    ### ibatis高级特性详解 ...本文详细介绍了 ibatis 中的一些高级特性,包括数据关联、延迟加载、动态映射以及事务管理等内容。通过这些特性的使用,开发者能够更高效地处理数据库操作,并提高应用程序的性能和灵活性。

    ibatis sql语句对条件中特殊字符% # 处理

    在提供的代码片段中,使用了`&lt;isNotEmpty&gt;`标签来动态判断条件是否为空,并且通过`&lt;CDATA&gt;`标签来编写SQL片段。这种方式可以避免硬编码SQL语句,提高代码的可维护性和灵活性。 ```xml &lt;sql id=...

    Ibatis框架的核心知识点

    Ibatis 提供了多种条件元素,如 `&lt;if&gt;`、`&lt;choose&gt;`(类似switch语句)、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`、`&lt;trim&gt;` 等,用于构建动态SQL。这些元素可以帮助我们根据Java对象的属性值生成相应的SQL条件。 7. *...

    Ibatis调用存储过程调用存储过程

    在Ibatis中,可以通过XML映射文件来定义存储过程的调用。下面是一个具体的例子: ```xml &lt;sqlMap namespace="PROCEDURE"&gt; &lt;!-- 存储过程参数映射 --&gt; &lt;parameterMap class="map" id="proPermissionDevicePerson"&gt;...

    ibatis+spring完全整合

    在软件开发过程中,将ORM框架(如ibatis)与应用框架(如Spring)进行整合可以极大地提高开发效率和系统的可维护性。本文将详细介绍如何实现ibatis与Spring框架的完全整合,包括数据库配置、实体类设计、DAO层实现、...

    IBATIS中,要查询出来的属性来自哪个xml,就把这个方法写在该xml下

    需要注意的是,`id`属性应与接口中的方法名称一致,以便于iBatis能够正确识别并执行。 3. **参数类型与返回类型**: 在`&lt;select&gt;`标签中,通过`parameterClass`和`resultClass`属性指定参数类型和返回结果的类型。在...

    ibatis入门教程

    iBatis 是一个优秀的持久层框架,它允许开发者将 SQL 语句直接写在 XML 映射文件中,从而实现了 SQL 与 Java 代码的分离,提高了开发效率和可维护性。本教程旨在帮助初学者快速掌握 iBatis 的基本使用,并通过调用...

    ibatis基础教程

    为了启用代码提示,需要在IDE中导入iBatis的相关DTD文件,如`sql-map-config-2.dtd`和`sql-map-2.dtd`,这样可以提高开发效率并减少错误。 #### 九、动态映射与JavaBean实例化 动态映射是iBatis的一个重要特性,它...

    ibatis笔记

    [CDATA[&gt;=]]&gt; #{age}&lt;/if&gt; &lt;/where&gt; &lt;/select&gt; ``` Ibatis还支持ResultMap,用于定义复杂的结果集映射,可以处理多对一、一对多、一对一等关系。例如,通过外键关联,将用户和其所有订单一起查询出来: ```xml ...

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    在使用iBATIS(现已被MyBatis取代)进行数据库操作时,我们常常需要传递参数到SQL语句中。在iBATIS中,有两种主要的方式来处理这些参数:使用`$`和`#`。这两种方式在不同的场景下有不同的效果。 首先,让我们来看看...

    ibatis 动态代理dtd

    根据提供的文件信息,我们可以深入探讨ibatis框架中的动态SQL元素及其使用方法。下面将详细介绍标题、描述以及部分内容中涉及的关键知识点。 ### ibatis 动态代理DTD #### 标题解释 - **ibatis**: 是一个开源的...

    ibatis查询语句配对.doc

    - 在实际应用中,推荐使用更现代的语法糖,比如MyBatis的动态SQL标签(`&lt;if&gt;`、`&lt;choose&gt;`等),来代替直接在SQL字符串中使用变量。 - 对于复杂的查询逻辑,考虑使用子查询或者连接查询来提高SQL语句的可读性和执行...

    ibatis环境搭建教程

    在ibatis中,DAO的实现通常与具体的业务逻辑层分离,通过提供一组统一的数据访问接口,使得业务逻辑层可以透明地操作底层数据。 - **优点**: - 提高了代码的复用性和可测试性。 - 降低了业务逻辑与数据访问之间...

Global site tag (gtag.js) - Google Analytics