最近工作中有批量导入需求,最开始用循环单条插入(因为当时限制最多30条,效率感觉没什么影响),后来用户提议能不能一次100条,为了提高程序效率就想到了用mybatis的批量插入。
主键采用序列增长,数据库是oracle,代码如下:
<!-- 批量插入 -->
<insert id=
"inserts"
parameterType=
"java.util.List"
>
<!-- 在此处做了修改 -->
insert into PRESON
select SEQ_PRESON_ID.NEXTVAL,A.* from(
<foreach collection=
"list"
item=
"item"
index=
"index"
separator=
"UNION"
>
SELECT
#{item.presonName},
#{item.presonTel},
#{item.presonEmail},
#{item.presonAge}
from dual
</foreach>
) A
</insert>
执行后控制台打印出来的SQL是(两条记录的SQL):
insert into PRESON
select SEQ_PRESON_ID.NEXTVAL,A.* from (
SELECT ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? from dual
UNION SELECT ?, ?, ?, ?, ?, ?, ?,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? from dual )A
注:union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
因此如果有要求重复记录不被合并时,需要将foreach标签的separator属性的值改为union all。
数据库是mysql,代码如下 :
<insert id="insertBatch" parameterType="ArrayList">
insert intoPRESON
values
<foreach collection="list"item="obj" index="index"separator="," >
(#{item.presonName},
#{item.presonTel},
#{item.presonEmail},
#{item.presonAge})