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" 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
   

你可能感兴趣的:(ibatis,iterate)