批量数据入库工具类

当我们使用insert往数据库中批量添加数据时,需要考虑一次批量新增的数据量,因为sql语句的长度是有限制的,当批量新增的数据量太大,比如一次新增一万条数据或者表的字段太多,会导致sql超长报错
Mysql可以使用以下命令查询sql语句支持的最大字符数

SHOW VARIABLES LIKE 'max_allowed_packet';

在这里插入图片描述
为了防止sql超长,我们可以每次只往数据库插入200条数据,当数据量较大时,可以循环插入,为此,可以写一个批量插入的工具类进行处理

/**
 * 数据库工具类
 */
public final class DBUtil {
    private DBUtil() {
    }

    /**
     * 批量保存数据到数据库
     *
     * @param dataList 数据集合
     * @param func     保存数据的具体函数
     * @param <T>      实体类型
     */
    public static <T> void batchInsert(List<T> dataList, Consumer<List<T>> func) {
        if (CollectionUtils.isEmpty(dataList)) {
            return;
        }

        int batchSize = 200;
        for (int i = 0; i < dataList.size(); i += batchSize) {
            int end = Math.min(i + batchSize, dataList.size());
            List<T> subList = dataList.subList(i, end);

            func.accept(subList);
        }
    }
}

batchInsert()方法的第一个参数是需要批量入库的数据集合,第二个参数是具体入库的方法,调用的方式如下:

DBUtil.batchInsert(statisticsEntityList, entityList -> statisticsDao.batchInsert(entityList));

statisticsDao就是Mybatis的Mapper

@Mapper
public interface StatisticsDao {
    /**
     * 批量新增
     *
     * @param dataList 数据集合
     */
    void batchInsert(@Param("dataList") List<StatisticsEntity> dataList);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值