mybatis踩坑:批量插入oracle与mysql的区别

环境:mybatis+oracle

功能需求:做项目时遇到一个需求,需要把几条数据批量插入到数据库。

内容:开始做的时候,一下子就想到了

<insert id="save"  useGeneratedKeys="false" parameterType="java.util.List">
insert into table (ID,IMAGE_URL,STATE,UPDATE_TIME, PATROL_RECORD_ID,UPDATE_USER_OPENID)

values
       <foreach collection="list" item="item" index="index" separator="," close=";">

          (#{item.ID,jdbcType=VARCHAR}, #{item.IMAGE_URL,jdbcType=VARCHAR}, #{item.STATE,jdbcType=VARCHAR}, 
          #{item.UPDATE_TIME,jdbcType=TIMESTAMP},#{item.PATROL_RECORD_ID,jdbcType=VARCHAR}, 
          #{item.UPDATE_USER_OPENID,jdbcType=VARCHAR})
        </foreach>
</insert>

但是测试的时候,就是报错,启动不了项目,怎么办?内事不决问百度喽:

然后就发现了上面那种批量插入的方法是MySQL的,不是oracle的,百度了一圈发现了几种方法:

1.首先就是下面这种,与上面那个方法看起来很像,但确是很多不同的地方,

不同之处 (已验证):

(1)oracle的没有values关键字

(2)foreach中的separator的值要是union all(将入参的list集合通过UNION ALL

生成虚拟数据)

(3)foreach中的语句需要select。。。from dual包裹

<insert id="save"  useGeneratedKeys="false" parameterType="java.util.List">
insert into table (ID,IMAGE_URL,STATE,UPDATE_TIME, PATROL_RECORD_ID,UPDATE_USER_OPENID)

 <foreach close=")" collection="list" item="item" open="(" separator="union all">
           
select
            #{item.ID,jdbcType=VARCHAR}, #{item.IMAGE_URL,jdbcType=VARCHAR}, #{item.STATE,jdbcType=VARCHAR}, 
              #{item.UPDATE_TIME,jdbcType=TIMESTAMP},#{item.PATROL_RECORD_ID,jdbcType=VARCHAR}, 
              #{item.UPDATE_USER_OPENID,jdbcType=VARCHAR}
            from dual
  </foreach>

2.第二种方式:利用存储过程实现批量插入(百度的,待验证)

注意:入参仍然是list集合,sql中有values,本质是利用存储过程实现批量插入;

<insert id="insertPlanRepaymentOtherfeeBatch" parameterType="java.util.List">

  begin

  <foreach collection="list" item="item" index="index">

   insert into table(id,key,value,term,contract_id,PAY_ORDER)

   values

    (SEQ_LB_T_PLAN_REPAY_OTHERFEE.nextval,#{item.key,jdbcType=VARCHAR}

   ,#{item.value,jdbcType=VARCHAR},#{item.term,jdbcType=DECIMAL}

   ,#{item.contractId,jdbcType=VARCHAR},#{item.payOrder,jdbcType=DECIMAL}

   );

  </foreach>

  end;

 </insert>

3.第三种方式:使用特殊的sql语句(百度的,待验证)

注意:当list的size大于500时,会失败;

参考博客:http://blog.csdn.net/w_y_t_/article/details/51416201

下面这条sql语句可以实现一条语句批量插入!

INSERT ALL

 INTO USERINFO(userid,username) VALUES('1','ggg')

 INTO USERINFO(userid,username) VALUES('2','bbb')

...

SELECT 1 FROM DUAL;

翻译成mybatis语句如下:

<insert id="batchInsertUser" parameterType="java.util.ArrayList">

INSERT ALL

  <foreach collection="list" item="userList" index="index">

   INTO USERINFO(userid,username) VALUES(#{userList.userid},#{userList.username})

  </foreach>

  SELECT 1 FROM DUAL

</insert>

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值