赞
踩
- public interface BatchAddCallback<T> {
-
- Integer batchAdd(List<T> list);
- }
- @Override
- public Integer batchAdd(List list, BatchAddCallback callback) {
- if (list.size() <= BATCH_MAX_SIZE) {
- return callback.batchAdd(list);
- }
- // 最终插入记录数
- int resCount = 0;
- List saveList = new ArrayList<>();
- for (Object item : list) {
- // 如果大于等于允许插入最大数量 则进行插入数据
- if (saveList.size() >= BATCH_MAX_SIZE) {
- Integer count = callback.batchAdd(saveList);
- if (count != null) {
- resCount = resCount + count;
- }
- saveList.clear();
- }
- saveList.add(item);
- }
-
- // 最后一批
- if (!saveList.isEmpty()) {
- Integer count = callback.batchAdd(saveList);
- if (count != null) {
- resCount = resCount + count;
- }
- }
- return resCount;
- }
这个方法是要遍历一遍list用于获取每一个批次需要的数据,效率一般,适合数据量不大的情况。
- public Integer batchAdd2(List list, BatchAddCallback callback) {
- if (CollectionUtils.isEmpty(list)) {
- return 0;
- }
-
- if (list.size() <= BATCH_MAX_SIZE) {
- return callback.batchAdd(list);
- }
- // 最终插入记录数
- int resCount = 0;
-
- // 计算一共有多少页
- int pageNum =
- list.size() % BATCH_MAX_SIZE == 0 ? list.size() / BATCH_MAX_SIZE : list.size() / BATCH_MAX_SIZE + 1;
-
- List saveList = new ArrayList<>();
- // 按照页数取数据
- for (int i = 0; i < pageNum; i++) {
- int startIndex = i * BATCH_MAX_SIZE;
- int endIndex;
- // 最后一页
- if (i == pageNum - 1) {
- endIndex = list.size() - 1;
- } else {
- endIndex = i * (BATCH_MAX_SIZE + 1) - 1;
- }
- // 批量操作
- saveList = list.subList(startIndex, endIndex);
- callback.batchAdd(saveList);
- resCount = resCount + saveList.size();
- }
- return resCount;
- }
这个方法看似很底层,它通过subList避免了遍历每个元素,效率较高。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。