批量操作工具

批量操作工具

背景 比如有时候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));
posted @ 2024-11-28 11:50  川流不息&  阅读(2)  评论(0编辑  收藏  举报