Oracle 批量插入问题

最近工作中遇到oracle批量插入问题 记录下 方便以后查阅

1.第一种方法

      begin

              insert into test(字段1, 字段2 ) values(数据1, 数据2);--此处分号不要忘记

              insert into test(字段1, 字段2 ) values(数据1, 数据2);

              insert into test(字段1, 字段2 ) values(数据1, 数据2);

             insert into test(字段1, 字段2 ) values(数据1, 数据2);

     end;

严格来说 这并不算批量  只是减少了数据库连接时间以及事物提交次数 但是如果没有别的办法 这也不失为一种办法

2.第二种方法

     思考一下 如果我们要从A表中取出部分字段 然后放入B表中如何操作 

    答案肯定是:  insert into B(字段1, 字段2) select (字段1, 字段2) from A    

   ok, 我们大体有思路了 但是如果我们做批量操作 应该只有B表  而没有A表  这里应该如何操作   ?

   要知道 Oracle中存在一个dual表 是Oracle提供的最小的工作表,我们可以利用他达到我们的想要结果。

   inset  into B(字段1, 字段2) select (字段1, 字段2) from dual;

   但是此处好像并不能达到批量的效果 , ok  这里就该union all出场了  我们应该知道union all的作用 可以使多条sql查询的结果组     合到一起并且不去重  这也是他跟union的区别 (union 会去掉多条sql查询的结果中重复的数据 然后再合并),

   接下来的工作迎刃而解了    

        insert into B(字段1, 字段2)

              select (字段1, 字段2) from dual 

              union all

              select (字段1, 字段2) from dual

              union all

             select (字段1, 字段2) from dual  ---最后一个不要加 union all

ok 问题解决  。

好了接下来 我们看一下 在ibatis中的具体实现

第一种方法具体实现

<insert id="batchInsert" parameterClass="java.util.List"> 
        <iterate open="begin" close="end;">
          insert into test(字段1, 字段2) values
         (#list[].属性1#,#list[].属性2#);
</iterate>

此处需要注意的是此处list为你传入的list的名字,加入你dao中传入的list对象为xxxList 则此处就为 #xxxList.属性1#

此外list集合中的对象要为实体类,同时实体类中要有属性的get方法 ,因为#list[].属性1#在操作时是用的get方法

例如 如果字段1, 字段2对应的数据为 id和name   则 实体类中要有 getId和getName方法  即 

<insert id="batchInsert" parameterClass="java.util.List"> 
        <iterate open="begin" close="end;">
          insert into test(id, name) values
         (#xxxList [].id#,#xxxList [].name#); 
</iterate>

第二种方法具体实现

我们可以参考第一种写法

<insert id="batchInsert" parameterClass="java.util.List"> 

    insert into test(字段1, 字段2)
        <iterate conjunction = "union all">  -- 指定每次循环后的连接字段
         select #list[].属性1#,#list[].属性2# from dual
</iterate>

才疏学浅, 如有错误 望不吝赐教 thx

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值