Mybatis-Plus批量添加或修改数据的3种方式总结
SpringBoot批量添加或修改数据的三种方式
方式一.Mybatis-plus 提供的 saveOrUpdateBatch
提供的方法 是遍历每一个元素,判断主键是否存在,如果存在则做更新,不存在添加


方式二.分组数据再批量添加或修改
先获取表中所有的主键 ,然后 判断是否已存在,存在更新,不存在添加
queryWrapper = new QueryWrapper<>();
queryWrapper.select("PROC_INSTANCEID");
List<BpmProcInstance> bpmProcInstanceList = iBpmProcInstanceDaoService.list(queryWrapper);
//获取所有主键
List<String> procList = bpmProcInstanceList.stream().map(BpmProcInstance::getProcInstanceid).collect(Collectors.toList());
//分组
Map<Boolean, List<BpmProcInstance>> booleanListMap = bpmProcInstances.stream().collect(Collectors.groupingBy(b -> {
return procList.contains(b.getProcInstanceid());
}));
//true 则更新 false 修改
iBpmProcInstanceDaoService.updateBatchById( booleanListMap.get(true));
iBpmProcInstanceDaoService.saveBatch( booleanListMap.get(false));方式三. 利用MySQL的on duplicate key update
on duplicate key update 是Mysql特有的语法,如下图所示,表中id 为主键

再插入id为1的数据,则提示主键已存在
改成如下SQL,则当主键重复时,将更新 字段 name 的值
INSERT into provider values (1,'w') ON DUPLICATE KEY UPDATE `name` = 'w';
因此我们可以编写如下的XML映射语句
insert into 表名 (需插入的字段)
values
<foreach collection="list" item="item" index="index" separator=",">
#插入的数据
</foreach>
ON DUPLICATE KEY UPDATE
# 当主键重复时,需要更新的字段以及对应的数据
字段名1=VALUES(字段名1),
字段名2 =VALUES(字段名2)
......补充:不使用Mybatis-plus进行批量操作
有时候项目里没有引用Mybatis-plus,但是也想进行批量操作,数据量大了后foreach循环会影响性能。所以可以参考Mybatis-plus的批量操作,编写在mybatis环境下的批量操作,代码如下:
@Component
public class MybatisBatchUtils {
private static final int BATCH_SIZE = 1000;
@Autowired
private SqlSessionFactory sqlSessionFactory;
public <T,U,R> boolean batchUpdateOrInsert(List<T> data, Class<U> mapperClass, BiFunction<T,U,R> function) {
int i = 1;
SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
U mapper = batchSqlSession.getMapper(mapperClass);
int size = data.size();
for (T element : data) {
function.apply(element, mapper);
if ((i % BATCH_SIZE == 0) || i == size) {
batchSqlSession.flushStatements();
}
i++;
}
// 非事务环境下强制commit,事务情况下该commit相当于无效
batchSqlSession.commit(!TransactionSynchronizationManager.isSynchronizationActive());
return true;
} catch (Exception e) {
batchSqlSession.rollback();
throw new RuntimeException(e);
} finally {
batchSqlSession.close();
}
}
}总结
到此这篇关于Mybatis-Plus批量添加或修改数据的3种方式的文章就介绍到这了,更多相关Mybatis-Plus批量添加修改数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot RestController接口输出到终端的操作代码
这篇文章主要介绍了Spring Boot RestController接口如何输出到终端,使用 HttpServletResponse 类,可以在使用curl执行 Spring Boot REST接口的同时,在控制台输出一些信息,给运维人员知道当前命令执行的状态,感兴趣的朋友跟随小编一起看看吧2023-09-09
关于ResponseEntity类和HttpEntity及跨平台路径问题
这篇文章主要介绍了关于ResponseEntity类和HttpEntity及跨平台路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
深入剖析java中String、StringBuffer、StringBuilder的区别
下面小编就为大家带来一篇深入剖析java中String、StringBuffer、StringBuilder的区别。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2016-05-05


最新评论