当我们使用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);
}
550

被折叠的 条评论
为什么被折叠?



