ibatis中使用List作为传入参数的使用方法及 CDATA使用

转载 2017年01月03日 09:26:08

ibatis中使用List作为传入参数的使用方法及 CDATA使用

 (2013-01-22 19:16:02)

ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用

Java代码  收藏代码
  1. (List)getSqlMapClientTemplate().queryForList("sqlName", paraName);  

并经类型转换即可,做入参还需要稍微调整下,本文主要讲list做入参碰到的几个小问题

 

做入参主要有两种方法一种是以list直接作为入参,另一种是将list作为map的元素之一为入参,个人觉得第一种明显优势,就一个list为入参,还用map包装一层多蛋疼。下面的介绍都以这个sql为例

Java代码  收藏代码
  1. "getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"  
  2.     parameterClass="java.util.ArrayList">  
  3.       
  4.     SELECT id   
  5.     FROM cic_job   
  6.     WHERE last_buildid <> 'NULL'  
  7.       
  8.     "AND" open="(" close=")" conjunction="or">  
  9.         CRID=#projectIdList[]#  
  10.           
  11.   

以上是正确的写法,意义大家不用关注,重点放在倒数2到4行,表示以list为入参,其中projectIdList为dao层传入的参数名。主要写法就是parameterClass="java.util.ArrayList",然后加上

Java代码  收藏代码
  1.     "AND" open="(" close=")" conjunction="or">  
  2. CRID=#projectIdList[]#  
  3.   

意思就是迭代器循环projectIdList,并用or拼接形成sql,拼接完后用()括起来,在加上前缀and

 

1、iterate property的问题

网上很多写法是

Java代码  收藏代码
  1. "projectIdList" prepend="AND" open="(" close=")" conjunction="or">  

即多了一个property,这个时候ibatis会从参数中寻找属性为projectIdList的对象,而list是一个对象没有属性就会报

Xml代码  收藏代码
  1. Cause: com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException: String index out of range: -1  

异常,解决方法就是去掉property="projectIdList"

其实这种写法是相对第二种以map为参数而言的,你可以使用map传入参数设置属性为 property对应名即可

 

2、< ! [ CDATA[的问题

大家注意到上面sql添加有 ! [ CDATA[,它的作用是对一些字符进行转移,具体可以参见http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html

但上面sql如果写成

Sql代码  收藏代码
  1. <select id="getProjectJobIdsByProjectIds" resultClass="java.lang.Integer"  
  2.     parameterClass="java.util.ArrayList">  
  3.     <![CDATA[  
  4.     SELECT id   
  5.     FROM cic_job   
  6.     WHERE last_buildid <> 'NULL'  
  7.     <iterate prepend="AND" open="(" close=")" conjunction="or">  
  8.         CRID=#projectIdList[]#  
  9.         </iterate>  
  10.     ]]>  
  11. </select>  

即扩大转义范围会出现如下错误

Xml代码  收藏代码
  1. com.ibatis.common.beans.ProbeException: There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'  

解决方法,就是缩小 CDATA的范围。原因是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中使用List作为传入参数的使用方法

(转自:http://trinea.iteye.com/blog/1343269) ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用 ...
  • tqwwilliam
  • tqwwilliam
  • 2012年02月07日 20:32
  • 3996

ibatis的配置文件中需要注意<![CDATA[ ]]>标记

ibatis中用标记避免sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响. 以""标记结束,指的是不应由xml解析器进行解析的文本数据(Unparsed Character Data...
  • qq_27289001
  • qq_27289001
  • 2017年02月22日 17:04
  • 353

ibatis配置xml文件中CDATA的用法

ibatis作为一种半自动化的OR Mapping工具,其灵活性日益体现出来,越来越多的人都倾向于在项目中使用。由于Sql中经常有与xml规范相冲突的字符对xml映射文件的合法性造成影响。许多人都知道...
  • crystony
  • crystony
  • 2011年09月05日 23:44
  • 5004

ibatis中CDATA的一点小知识

作为一个初学者,我认为不应该去使用一些工具来帮助自己生成代码的。我觉得更应该是自己去写代码,不然很容易成为“白痴”。现在我觉得自己有点像白痴了。比如说使用ibatis时,xxsqlmap.xml中的许...
  • Sweblish
  • Sweblish
  • 2011年07月17日 21:47
  • 5612

iBatis中联合AND和OR进行查询

 在项目中使用条件查询的时候一直都是使用的AND,有一天突然碰到要使用OR的,情况是类似这样的:Where a2 OR b,在iBatis中怎么写呢?我是这么写的:     isNotEmpty pr...
  • CMTobby
  • CMTobby
  • 2007年08月31日 12:56
  • 6846

ibatis学习之道:ibatis的<[CDATA]>dynamic属性跟#$的应用

ibatis的,dynamic属性和#,$的应用 的正确使用 ibatis作为一种半自动化的OR Mapping工具,其灵活性日益体现出来,越来越多的人都倾向于在项目中使用。由于Sql中经常有与x...
  • u011511429
  • u011511429
  • 2013年09月30日 14:49
  • 1569

Ibatis中sqlmap参数map中还需要套list的情况如何写?

原文地址:http://hittyt.iteye.com/blog/1518665 原始需求: 有若干个参数,需要作为ibatis拼装sql的参数传入,但是有个参数的值比较特殊,是若干...
  • majian_1987
  • majian_1987
  • 2015年06月03日 09:37
  • 4342

ibatis中CDATA的使用

sqlmap里面经常会有 出现,记录一下这么用的作用。 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。 在 XML 元素中,"...
  • libing06081227
  • libing06081227
  • 2015年10月30日 10:59
  • 247

mybatis或ibatis中的#和$的区别?

转自:http://weijun726.blog.163.com/blog/static/87342299201362652950398/ 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一...
  • suyu_yuan
  • suyu_yuan
  • 2016年09月19日 14:34
  • 713

[Java][ibatis]Ibatis TypeHandler使用总结

Ibatis TypeHandler使用总结 ibatis中有一个TypeHandler(准确的说应该是TypeHandlerCallback), 这个接口一般用的比较少, google一下, 大部...
  • szwangdf
  • szwangdf
  • 2013年08月19日 14:39
  • 1877
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ibatis中使用List作为传入参数的使用方法及 CDATA使用
举报原因:
原因补充:

(最多只允许输入30个字)