环境: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语句如下:
|