`

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

分享到:
评论

相关推荐

    Ibatis查询Id列表.doc

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

    ibatis日期格式.doc

    文档“ibatis日期格式.doc”主要讨论了在使用iBatis框架时,关于日期格式处理以及数据库查询优化的问题。iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,方便数据库操作。 在小组...

    Ibatis框架的核心知识点

    【Ibatis框架的核心知识点】 Ibatis 是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,从而简化了Java应用程序与数据库的交互。Ibatis 的核心知识点主要包括以下几个方面: 1. **SQL Map ...

    ibatis环境搭建教程

    - **CDATA**:用于包含原始文本内容,避免XML解析器对其进行特殊处理。 - ****:用于引用其他配置文件,有助于保持配置文件的简洁性。 - **&lt;selectKey&gt;`**:用于生成主键,在某些数据库中可能需要在插入记录前先获取...

    ibatis and和or联合查询 .doc

    ### ibatis and和or联合查询知识点 #### 一、ibatis简介 ibatis是一个支持普通SQL查询、存储过程以及高级映射的优秀开源数据访问框架。ibatis消除了几乎所有的JDBC对象操作,提供了一个简单的基本API,它通过XML或...

    Ibatis多表查询

    ### Ibatis多表查询知识点详解 #### 一、数据库表结构设计 为了演示Ibatis的多表查询功能,本文档采用了一个简单的例子:一个图书 (`book`) 表和一个用户 (`user`) 表,其中图书表与用户表之间存在一对多的关系。...

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

    ### ibatis SQL语句对条件中特殊字符% # 处理 在开发过程中,经常会遇到SQL查询时需要处理字符串中的特殊字符的情况。特别是在使用类似`LIKE`这样的操作符时,如果用户输入的数据中含有`%`、`_`或`#`等特殊字符,...

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

    ### iBatis 多表查询知识点详解 #### 一、iBatis简介 iBatis 是一款优秀的持久层框架,它将 SQL 映射到 Java 对象,简化了 JDBC 编程过程中的繁琐操作,提高了开发效率。iBatis 的核心功能包括 SQL 映射、动态 SQL...

    ibatis高级特性

    ### ibatis高级特性详解 #### 一、引言 Ibatis 是一款优秀的持久层框架,它简化了 Java 开发者与数据库之间的交互过程。本文将详细介绍 ibatis 的一些高级特性,包括数据关联、延迟加载、动态映射以及事务管理等...

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

    [CDATA[ {call share_dev_prv_to_person(?,?,?,?,?)} ]]&gt; ``` 上述代码定义了一个名为`PROCEDURE`的命名空间,并在这个命名空间下定义了一个存储过程映射`shareDeviceToPerson`。该过程接收四个输入参数(`...

    ibatis教程学习笔记

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

    ibatis基础教程

    在iBatis的映射文件中,使用CDATA段可以包含SQL语句,这样可以避免XML特殊字符引起的问题。例如: ```xml &lt;![CDATA[ SELECT * FROM person WHERE id = #{id} ]]&gt; ``` #### 十一、SqlMapClient的使用 ...

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

    [CDATA[ SELECT g.TITLE FROM USER p, BOOK g WHERE p.BOOK_ID = g.ID AND p.ID = #id# ]]&gt; ``` 在这个例子中,我们有一个名为`findBOOK`的方法,其功能是从`BOOK`表中根据`ID`查询`TITLE`字段的值。...

    ibatis+spring完全整合

    ### ibatis+spring完全整合知识点解析 #### 一、引言 在软件开发过程中,将ORM框架(如ibatis)与应用框架(如Spring)进行整合可以极大地提高开发效率和系统的可维护性。本文将详细介绍如何实现ibatis与Spring框架...

    ibatis笔记

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

    iBatis示例

    [CDATA[&gt;=]]&gt; #{age} ``` 七、事务管理 iBatis支持两种事务管理方式:JDBC(由数据库驱动管理)和MANAGED(由容器管理)。默认情况下,事务管理是自动的,但也可以自定义以适应不同环境。 总结,iBatis通过将...

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

    [CDATA[ select * from test where name like '%$name$%' ]]&gt; ``` 在Java代码中,我们创建一个HashMap,并将参数放入其中,然后调用`queryForList`方法执行查询: ```java Map, String&gt; map = new HashMap(); ...

    IBATIS入门(第二节)

    [CDATA[&gt;=]]&gt; #{age} ``` ## 6. 总结 IBATIS作为一款轻量级的持久层框架,其优势在于SQL的灵活性和控制权,开发者可以充分利用SQL的强大功能,同时避免了ORM框架可能带来的性能问题。通过理解并熟练掌握...

    ibatis查询语句配对.doc

    [CDATA[ SELECT p.* FROM MEMBER_POST p, MEMBER_GROUP m, MEMBER_MEMBER_GROUP_REL r WHERE m.ID = r.GROUP_ID AND p.GROUP_ID = m.ID AND m.AUDIT_STATUS = #bo.AUDIT_STATUS:NUMERIC# AND r.USER_...

Global site tag (gtag.js) - Google Analytics