一、实现目标:
在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); }