您的位置:首页 > 数据库 > Oracle

ibatis 搭配oracle做批量插入小结

2012-12-12 08:52 405 查看
比如,经常遇到的情况是,要把表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" parameterClass="example.test">

UPDATE TBL_COMPANY

SET ADDRESS = #address#

WHERE COMPANY_ID IN

<iterate conjunction="," open="(" 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" parameterClass="map">

insert all

<iterate conjunction=" " 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
<!-- 批量添加消息 -->

<insert id="addMessageBatch" parameterClass="java.util.Map">

Insert into messages

<iterate property="statusList" conjunction=" UNION ALL ">

SELECT (SELECT rawtohex(sys_guid()) AS messageId FROM DUAL),#statusList[]#,0,0,#link#,#title#,#content#,#createDate# from dual

</iterate>

</insert>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: