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>

猜你喜欢

转载自blog.csdn.net/c1149418436/article/details/81170152