最近帮别人写代码,经常遇到需要将一个 List 分成几等份然后分别操作。比如将一个列表,大小未知,很可能比较大,插入到数据库中,如果我们直接遍历执行 insert into,成本太高,主要消耗在网络延迟上。而如果直接将这1000条数据批量插入,可能会出现SQL太长无法执行成功的问题。
所以,最简单的方法就是将这个列表分成10份,每份100条数据,分10次插入,速度快大大提升。
下面分享一个分割列表的算法
使用例子
关于批量执行多行SQL这里也说明一下
jdbc url 需要添加 &allowMultiQueries=true
mybatis xml
注意末尾需要加分号
所以,最简单的方法就是将这个列表分成10份,每份100条数据,分10次插入,速度快大大提升。
下面分享一个分割列表的算法
- /**
- * 将一个list均分成n个list,主要通过偏移量来实现的
- *
- * @param source
- * @return
- */
- public <T> List<List<T>> averageAssign(List<T> source, int n) {
- List<List<T>> result = new ArrayList<List<T>>();
- //(先计算出余数)
- int remaider = source.size() % n;
- //然后是商
- int number = source.size() / n;
- //偏移量
- int offset = 0;
- for (int i = 0; i < n; i++) {
- List<T> value = null;
- if (remaider > 0) {
- value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
- remaider--;
- offset++;
- } else {
- value = source.subList(i * number + offset, (i + 1) * number + offset);
- }
- result.add(value);
- }
- return result;
- }
使用例子
- // for (Device device : deviceList) {
- // deviceMapper.insert(device);
- // }
- //改成批量插入
- //deviceList 是一个比较大的列表
- List<List<Device>> lists = averageAssign(deviceList, deviceList.size() / 100 + 1);
- for (List<Device> devices : lists) {
- deviceMapper.batchInsert(devices);
- }
关于批量执行多行SQL这里也说明一下
jdbc url 需要添加 &allowMultiQueries=true
mybatis xml
- <insert id="batchInsert">
- <foreach collection="list" index="index" item="item">
- INSERT INTO `device` (
- xxx,yyy
- )
- VALUES (
- #{item.xxx}, #{item.yyy}
- );
- </foreach>
- </insert>
注意末尾需要加分号
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏