问题场景
批量往数据库插入数据时,提示服务器接收参数过多,服务器最多接收2100参数。
此时用2100除以实体中的字段数量,可以得出每次commit的个数。
- 不大于这个阈值的时候,可以直接通过mapper.xml批量插入;
- 大于这个阈值的时候,可以分批次批量插入数据。
Java代码
int resultInt = 0;
int batchCount = 90; // 每批commit的个数
int batchLastIndex = batchCount;// 每批最后一个的下标
for (int index = 0; index < list.size(); ) {
if (batchLastIndex >= list.size()) {
batchLastIndex = list.size();
resultInt = resultInt * userDao.insertByList(list.subList(index, batchLastIndex));
break;// 数据插入完毕,退出循环
} else {
resultInt = resultInt * userDao.insertByList(list.subList(index, batchLastIndex));
index = batchLastIndex;// 设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
}
mapper.xml 代码
<insert id="insertByList">
insert into user
(Id, Code, TimePoint, MaxValue, MonValue)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id}, #{item.Code}, #{item.timePoint}, #{item.maxValue}, #{item.monValue})
</foreach>
</insert>
原文借鉴:关于MyBatis批量插入SqlServer报:RPC 请求中提供了过多的参数。最多应为 2100。