报错一般是由于批量插入时候的list数目多,且单个/总参数超过限制.
常见的解决方案有两种:
-
分批插入:将大批量数据拆分成多个小批量插入,例如每100条或每1000条记录执行一次插入操作;
-
使用存储过程或其他技术来解决:使用存储过程等技术,将数据分割为多个批次插入数据库。
在这里主要推荐方案1
简单说就是把多个list插入多个数目少的list集合
这里介绍list.sublist方法:
list.subList(int fromIndex, int toIndex)
方法
是用来获取 list 中子列表的方法。其中 fromIndex
表示子列表的起始索引(包含),toIndex
表示子列表的结束索引(不包含)。
例如,如果有一个长度为 10 的列表,想要获取它的前三个元素,可以使用 list.subList(0, 3)
方法。返回的子列表包含下标为 0、1 和 2 的元素,不包含下标为 3 的元素。
上完整代码:(拷贝即可用)
if (list != null && !list.isEmpty()) {
// 分批次插入数据,每次插入100条记录
for (int i = 0; i < list.size(); i += 100) {
List<ProductionOrd> subList = list.subList(i, Math.min(i + 100, list.size()));
productionOrdMapper.batchInsert(subList);
}
}
从 list
中获取一个子列表 subList
,子列表的起始索引是 i
,结束索引是 Math.min(i + 100, list.size())
。
具体解释如下:
i
是循环变量,表示当前批次插入的起始位置。Math.min(i + 100, list.size())
计算出子列表的结束索引。这里使用Math.min()
方法是为了防止越界,因为最后一批数据可能不满 100 条,所以取i + 100
和list.size()
的最小值作为结束索引。- 最终,
subList
就是从list
中截取的子列表,其中包含了批次插入的数据。
通过每次循环获取不同的子列表,可以将插入的数据分批次处理,以避免一次性插入过多的数据导致数据库参数数量超过限制。