一、实现目标:
在SqlServer使用的过程当中,为了较少程序与数据库的交互,使用批量插入的形式完成一次性将数据插入到数据库中。
二、Mysql、Oracle 的用法:
我们平时使用Mysql的时候可以使用下面的形式完成批量的插入
insert into table(column1,column2) values("1","2"),("2","2");
对应的Xml的写法 :
<insert id="insert" parameterType="domain.xxx"> insert into table <trim
prefix="(" suffix=")" suffixOverrides="," > COLUMN1, COLUMN2, </trim> <foreach
item="item" collection="list" separator=","> (
#{item.column1,jdbcType=VARCHAR}, #{item.column2,jdbcType=VARCHAR} ) </foreach>
</insert>
三、SqlServer的用法
区别 :sqlServer在使用sql进行批量插入时与Mysql的方式不同,不支持Values(...),(...) ....的形式完成插入;
采用方式 :
insert into table(column1,column2) select column1,column2 union select
column1,column2 union select column1,column2 .....
对应的Xml的写法 :
这里为了还原上方sql的写法在<foreach>标签的属性 index的下标进行了判断,如果为插入的
第一条数据,则不拼接 “union select”,后面的数据拼接“union select”,从而达到实现效果
<insert id="insertBatch" parameterType="java.util.List"> insert into table
<trim prefix="(" suffix=")" suffixOverrides="," > column1, column2, </trim>
select <foreach item="item" collection="list" index="index"> <if test="index !=
0"> union select </if> #{item.column1,jdbcType=VARCHAR},
#{item.column2,jdbcType=VARCHAR} </foreach> </insert>
四、注意事项(sqlServer操作批量插入遇到的问题解决方案)
注意 :在使用union select进行拼接插入的时候,SqlServer的限制总体插入字符不能大于
2100,(其含义是 :如果表里有两个字段,你插入了三条数据,你一共完成了6个字符的插入)
所以,在考虑当前所使用的数据表在可支持扩展的字段数量限制内,通过后台逻辑进行分批次的插入(假设:你当前需要操作批量插入的表结构设计上限位
21个字段,那么你单次进行插入的上限就是100条数据)
分批次完成批量插入后台代码示例:
Java
// 获取list的大小 int listSize = list.size(); // 每次插入50条数据 int count = 50; //
批次数量,一共分几批 int batch = listSize / count; // 将剩余的不满50条数据归为一批 if (listSize %
count != 0) { batch = batch + 1; } //循环批量保存每组数据 for (int i = 0; i < batch; i++)
{ List<Entity> newList; if (i == batch - 1) { // 最后一批 newList =
list.subList(count * i, listSize); } else { // 其他批次 newList =
list.subList(count * i, count * (i + 1)); } // 完成插入
xxxxService.insertBatch(newList); }