ibatis 搭配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 



<!-- 批量添加消息 -->
      <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>

你可能感兴趣的:(ibatis 搭配oracle做批量插入小结)