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語句可以實現一條語句批量插入!
|
翻譯成mybatis語句如下:
|