当前使用版本 3.5.7 当前环境信息 Java21 + Mysql8.0.32 + springboot3.2.6
描述bug现象 在使用Db.saveBatch(entityList)时,执行成功 但是一直返回false
提供问题复现步骤
使用Db.saveBatch(entityList)进行批量插入
/**
* 插入(批量)
*
* @param entityList 实体对象集合
* @param batchSize 插入批次数量
*/
public static <T> boolean saveBatch(Collection<T> entityList, int batchSize) {
if (CollectionUtils.isEmpty(entityList)) {
return false;
}
Class<T> entityClass = getEntityClass(entityList);
List<BatchResult> batchResults = SqlHelper.execute(entityClass, baseMapper -> baseMapper.insert(entityList, batchSize));
return batchResults.stream().flatMapToInt(r -> IntStream.of(r.getUpdateCounts())).allMatch(i -> i > 0);
}
allMatch(i -> i > 0)中i是-2
提供完整堆栈日志(可选)
提供问题复现工程(可选) 请尽量提供复现工程,减少大家排错的时间.
Comment From: xxx-tea
没有什么问题,SUCCESS_NO_INFO代表”指示批处理语句已成功执行,但没有可用的受影响行数的计数的常量。“ 也就是这次saveBatch操作没有修改行数量,mp里面返回值是boolean类似insert和remove的方法false都代表的是没有行数修改,抛出异常才代表执行失败。
Comment From: zhww9206
没有什么问题,SUCCESS_NO_INFO代表”指示批处理语句已成功执行,但没有可用的受影响行数的计数的常量。“ 也就是这次saveBatch操作没有修改行数量,mp里面返回值是boolean类似insert和remove的方法false都代表的是没有行数修改,抛出异常才代表执行失败。
但是3.5.7版本Db.saveBatch 无法正确判断批量插入是否成功, Db.updateBatchById却可以正常判断
3.5.6版本Db.saveBatch 是这样的
Comment From: zhww9206
我用ruoyi-vue-plus最新代码测试, 批量插入也是数据库成功, 方法永远返回false
Comment From: JavaLionLi
确实存在这个问题 插入已经成功了 但确实返回false
Comment From: qmdx
无法重现该问题,看看是不是 RuoyiPlus 配置什么批量操作引起的
Comment From: VampireAchao
能给个复现demo吗
Comment From: qmdx
解决方案: 驱动连接去掉 rewriteBatchedStatements=true
Comment From: zhww9206
解决方案: 驱动连接去掉 rewriteBatchedStatements=true
以了解, 并已经去掉参数 测试成功
Comment From: nieqiurong
直接用BaseMapper#insert(java.util.Collection
Comment From: JavaLionLi
经查实 mp最新的批处理与 jdbc的批处理参数 rewriteBatchedStatements=true 不兼容
Comment From: VampireAchao
我正在尝试兼容