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

ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用
并经类型转换即可,做入参还需要稍微调整下,本文主要讲list做入参碰到的几个小问题
做入参主要有两种方法一种是以list直接作为入参,另一种是将list作为map的元素之一为入参,个人觉得第一种明显优势,就一个list为入参,还用map包装一层多蛋疼。下面的介绍都以这个sql为例
- "getProjectJobIdsByProjec
tIds" resultClass="java.lang.Integer" -
parameterClass="java.util.ArrayList"> -
-
SELECT id -
FROM cic_job -
WHERE last_buildid <> 'NULL' -
-
"AND" open="(" close=")" conjunction="or"> -
CRID=#projectIdList[]# -
-
以上是正确的写法,意义大家不用关注,重点放在倒数2到4行,表示以list为入参,其中projectIdList为dao层传入的参数名。主要写法就是parameterClass="java.util.ArrayList",然后加上
意思就是迭代器循环projectIdList,并用or拼接形成sql,拼接完后用()括起来,在加上前缀and
1、iterate property的问题
网上很多写法是
即多了一个property,这个时候ibatis会从参数中寻找属性为projectIdList的对象,而list是一个对象没有属性就会报
- Cause:
com.ibatis.common.beans.ProbeException: Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsEx ception: String index out of range: -1
异常,解决方法就是去掉property="projectIdList"
其实这种写法是相对第二种以map为参数而言的,你可以使用map传入参数设置属性为
2、< ! [ CDATA[的问题
大家注意到上面sql添加有 ! [ CDATA[,它的作用是对一些字符进行转移,具体可以参见http://renren.it/a/JAVAbiancheng/iBATIS/20111105/139874.html
但上面sql如果写成
- <select
id="getProjectJobIdsByProjec tIds" resultClass="java.lang.Integer" -
parameterClass="java.util.ArrayList"> -
<![CDATA[ -
SELECT id -
FROM cic_job -
WHERE last_buildid <> 'NULL' -
<iterate prepend="AND" open="(" close=")" conjunction="or"> -
CRID=#projectIdList[]# -
</iterate> -
]]> - </select>
即扩大转义范围会出现如下错误
- com.ibatis.common.beans.ProbeException:
There is no READABLE property named 'projectIdList[]' in class 'java.util.ArrayList'
解决方法,就是缩小
在使用ibatis时,经常需要配置待执行的sql语句。使用过ibatis的朋友都知道,无可避免的都会碰到一些不兼容、冲突的字符,多数人也都 知道用<![CDATA[
环境:oracle、ibatis、java
错误例1:符号“<=”会对xml映射文件的合法性造成影响
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
select id
from tableA a,
</select>
错误例2:将整个sql语句用<![CDATA[
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
< ![CDATA[
select id
from tableA a,
</select>
正确做法:缩小范围,只对有字符冲突部分进行合法性调整。
<select id="find" parameterClass="java.util.Map" resultClass="java.lang.Long">
select id
from tableA a,
</select>
ibatis中应该经常见到"<![CDATA["这样的东西吧,它的用处应该是转义一些特殊关键字字符,不合法的XML字符必须被替换为相应的实体。
< | > | 小于号 |
> | < | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
一个 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"标签以 "<"开头,那么可能被"< ! [CDATA["转义了,所以造成语法错误,sql不能正常执行,去掉"<![CDATA["后发现sql能正常执行。
所以在碰到类似问题的时候,应该留意,在"< ! [CDATA["转义符中间不要用标签。