ibatis 2搭配oracle做批量插入小结
比如,经常遇到的情况是,要把表A中的符合条件的数据全部取出来,形成一个结果集,
然后针对结果集中的每一条数据,循环插入到数据表B中去,除了传统的在JAVA代码中
FOR循环来做外,在ibatis 2中,还增加了iterate标签,可以用来生成循环要执行的语句,介绍如下:
<iterate
property="" /*可选,
从传入的参数集合中使用属性名去获取值,
这个必须是一个List类型,
否则会出现OutofRangeException,
通常是参数使用java.util.Map时才使用,
如果传入的参数本身是一个java.util.List, 不能只用这个属性.
conjunction="" /*可选,
iterate可以看作是一个循环,
这个属性指定每一次循环结束后添加的符号,
比如使每次循环是OR的, 则设置这个属性为OR*/
open="" /*可选, 循环的开始符号*/
close="" /*可选, 循环的结束符号*/
prepend="" /*可选, 加在open指定的符号之前的符号*/
>
</iterate>
例子:
<iterate prepend=”AND” property=”userNameList”
open=”(” close=”)” conjunction=”OR”>
username=#userNameList[]#
</iterate>
这个时候,会生成如下形式的语句:
(username=xxx1 or username=xxx2 or username=xxx3)
因为open,close中指定了括号,conjunction则指定了分割是用or,
又如:
id in
<iterate prepend="" property="ids" open="(" close=")" conjunction="," >
#ids[]#
</iterate>
生成为:
id in (xx1,xx2,xx3,.....),
注意:使用<iterate>时,在List元素名后面包括方括号[]非常重要,方括号[]将对象标记为List,
以防解析器简单地将List输出成String。
再来看几个例子:
1) 删除的:
<delete id="delete">
delete from t_table where key in
<iterate property="keys" conjunction="," open="(" close=")">
#keys[]#
</iterate>
</delete>
2 ) update:
如果传用的参数是自己定义的类,如:
<update id="sqlMap" parameteropen="(" close=")" property="companyIds" >
#companyIds[]#
</iterate>
</update>
生成Sql语句: UPDATE TBL_COMPANY SET ADDRESS='address' WHERE COMPANY_ID IN ( 45, 50, 70)
其中:companyIds是example.test类中的list属性。
3) 批量插入,oracle中可以用insert all into,比如:
<insert id="insertintoragroupra" parameter" property="ragrouppreinsert">
into GROUP_ASSETRA
(RISKID, GROUPID,GROUPNAME,AV,RALISTID)
values
(
F_GETSEQ(),#ragrouppreinsert[].groupId#,#ragrouppreinsert[].groupname#,#ragrouppreinsert[].av#,
#ralistId#
)
</iterate>
select * from dual
</insert>
注意:比如这里parameterClass="map"中,表明传入的是一个MAP,这个MAP中
可以包含内容很丰富的东西了,比如:
map.put("ragrouppreinsert",list) //这里ragrouppreinsert"存放的
是一个LIST结果集了
map.put("ralistId",ralistId) //这里另外设置一个要批量增加到group_assetra表中的数据
注意在上面的语句中,因为要将结果集合list中的每一条记录对应的字段插入到
GROUP_ASSETRA中,所以要使用#ragrouppreinsert[].groupId#的写法,
而把map中的ralistId插进去,则只需要#ralistId#就可以了,这样其实就是
插入到group_assetra表中的每一个ralistid字段都是相同的值了
F_GETSEQ()是一个函数,获得GROUP_ASSETRA表中的每次的序列,
具体其中遇到的问题,参考不错的一篇讲oracle insert all into的文:
http://yangtingkun.itpub.net/post/468/188133