设为首页 收藏本站
查看: 607|回复: 0

[经验分享] ibatis 2搭配oracle做批量插入小结

[复制链接]
YunVN网友  发表于 2016-8-16 06:23:01 |阅读模式
比如,经常遇到的情况是,要把表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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-258201-1-1.html 上篇帖子: 转载《Oracle数据库impdb和expdb操作》 下篇帖子: Oracle expdp/impdp导出导入命令及数据库备份
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表