1. 程式人生 > >mybatis踩坑:批量插入oracle與mysql的區別

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>