批量操作工具
背景 比如有时候csv 或者 excel 导入了一批数据,然后想着 每次1000 条操作一次数据库
/**
* @description:
* @author: lyc
* @date: 2024/4/12 15:13
**/
public class BatchHandleUtils {
/**
* 一次性读取文档 批量处理数据 入库
* @param batchSize 批量大小
* @param dataList 数据
* @param function 转换函数
* @param consumer 消费数据
* @param <T>
* @param <R>
*/
public static <T, R> void batch(Integer batchSize, List<T> dataList, Function<T, R> function, Consumer<List<R>> consumer) {
if (CollectionUtil.isEmpty(dataList)) {
return;
}
int size = dataList.size();
int totalPage = PageUtil.totalPage(size, batchSize);
for (int i = 1, index = 0; i <= totalPage; i++, index += batchSize) {
// 一次批量处理的数据
List batchData = Lists.newArrayListWithCapacity(batchSize);
for (int j = index; j < ((index + batchSize) > size ? size : (index + batchSize)); j++) {
T data = dataList.get(j);
R result = function.apply(data);
batchData.add(result);
}
consumer.accept(batchData);
}
}
}
使用
CsvReader reader = CsvUtil.getReader();
//从文件中读取CSV数据
List<CardRollCsvBO> cardRollCsvBOList = reader.read(
ResourceUtil.getReader(localFile, Charset.forName(Constants.CHARSET_GBK)), CardRollCsvBO.class);
//一次500 批量插入
BatchHandleUtils.batch(Constants.BATCH_HANDLE_DATA_SIZE, cardRollCsvBOList, (cardRollCsvBO) -> {
SendCards sendCards = new SendCards();
BeanUtils.copyProperties(cardRollCsvBO, sendCards);
String orderId = cardRollCsvBO.getOrderId();
if (StringUtils.isNotBlank(orderId) && orderId.indexOf("=") != -1) {
sendCards.setOrderId(orderId.substring(orderId.indexOf("=") + 2, orderId.lastIndexOf("\"")));
}
return sendCards;
}, (dataList) -> sendCardsService.addBatch(dataList));