Mybatis-Plus批量添加或修改数据的3种方式总结

 更新时间:2023年05月22日 10:13:43   作者:秋日的晚霞  
使用Mybatis-plus可以很方便的实现批量新增和批量修改,不仅比自己写foreach遍历方便很多,而且性能也更加优秀,下面这篇文章主要给大家介绍了关于Mybatis-Plus批量添加或修改数据的3种方式,需要的朋友可以参考下

SpringBoot批量添加或修改数据的三种方式

方式一.Mybatis-plus 提供的 saveOrUpdateBatch

提供的方法 是遍历每一个元素,判断主键是否存在,如果存在则做更新,不存在添加

image-20230411142159127

image-20230411142521452

方式二.分组数据再批量添加或修改

先获取表中所有的主键 ,然后 判断是否已存在,存在更新,不存在添加

        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 为主键

image-20230411150035835

再插入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接口输出到终端的操作代码

    这篇文章主要介绍了Spring Boot RestController接口如何输出到终端,使用 HttpServletResponse 类,可以在使用curl执行 Spring Boot REST接口的同时,在控制台输出一些信息,给运维人员知道当前命令执行的状态,感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • 如何准确判断邮件地址是否存在

    如何准确判断邮件地址是否存在

    本文介绍了如何判断邮件地址是否存在的方法,具有很高的使用价值,提高了工作效率
    2015-07-07
  • 关于ResponseEntity类和HttpEntity及跨平台路径问题

    关于ResponseEntity类和HttpEntity及跨平台路径问题

    这篇文章主要介绍了关于ResponseEntity类和HttpEntity及跨平台路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring boot如何开启跨域配置

    Spring boot如何开启跨域配置

    这篇文章主要介绍了Spring boot如何开启跨域配置问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 常用的Spring Boot调用外部接口方式实现数据交互

    常用的Spring Boot调用外部接口方式实现数据交互

    Spring Boot提供了多种调用外部接口的方式,可以方便地实现与其他系统的数据交互,提高系统的可扩展性和数据共享能力,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • 浅谈二分法查找和原始算法查找的效率对比

    浅谈二分法查找和原始算法查找的效率对比

    这篇文章主要介绍了浅谈二分法查找和原始算法查找的效率对比,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • SpringBoot嵌入式Web容器原理与使用介绍

    SpringBoot嵌入式Web容器原理与使用介绍

    Web开发的核心内容主要包括内嵌的Servlet容器和SpringMVCSpringBoot使用起来非常简洁,大部分配置都有SpringBoot自动装配,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • 深入剖析java中String、StringBuffer、StringBuilder的区别

    深入剖析java中String、StringBuffer、StringBuilder的区别

    下面小编就为大家带来一篇深入剖析java中String、StringBuffer、StringBuilder的区别。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • 详解Java构建树结构的公共方法

    详解Java构建树结构的公共方法

    本文主要介绍了详解Java构建树结构的公共方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 浅谈Java中IO和NIO的本质和区别

    浅谈Java中IO和NIO的本质和区别

    IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就存在的。NIO叫做new IO,是在java1.4中引入的新一代IO。IO的本质是什么呢?它和NIO有什么区别呢?我们该怎么学习IO和NIO呢?看完这篇文章一切都有答案。
    2021-06-06

最新评论