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

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)
        ......
        
### 回答1: Mybatis-Plus支持使用updateBatch方法批量修改数据。 示例代码如下: ``` List<User> userList = new ArrayList<>(); // 添加需要修改数据 userMapper.updateBatch(userList); ``` 需要注意的是updateBatch方法需要传入的是实体类集合,实体类需要设置主键。 ### 回答2: Mybatis-Plus是一款基于Mybatis增强功能的ORM框架,提供了较多的功能和便捷的方法简化对数据库的操作。在Mybatis-Plus中,批量修改数据的方法非常简单。下面,我将详细介绍如何使用Mybatis-Plus实现批量修改数据。 1.使用Wrapper进行条件查询 Mybatis-Plus提供了Wrapper类进行条件查询,可以根据多个条件进行查询,通过Wrapper类可以对表中的数据进行修改。代码实例: ``` QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(User::getName, "张三").eq(User::getAge, 18); User user = new User(); user.setEmail("111@qq.com"); userMapper.update(user, wrapper); ``` 2.使用LambdaUpdateWrapper进行批量修改Mybatis-Plus中,还提供了LambdaUpdateWrapper类,使用LambdaUpdateWrapper可以对指定字段进行批量修改,达到批量修改数据的目的。代码实例: ``` LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(User::getName,"张三").set(User::getAge, 20).set(User::getEmail, "222@qq.com"); userMapper.update(null, updateWrapper); ``` 3.使用UpdateWrapper进行批量修改 使用UpdateWrapper可以进行多个单个字段的批量修改,UpdateWrapper还支持设置条件查询。代码实例: ``` UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("name","张三").set("age",20).set("email","222@qq.com"); userMapper.update(null, updateWrapper); ``` 综上所述,使用Mybatis-Plus实现批量修改数据非常简单。以上三种方法可以根据不同的需求进行选择使用。使用Mybatis-Plus,您可以以简单的方式快速对数据库进行操作,提升开发效率。 ### 回答3: Mybatis-plus是一个基于Mybatis的增强工具,在进行批量修改之前,需要先建立数据访问对象(DAO),DAO是一个Java类,可以通过Mybatis-plus自动生成,者手动编写。在DAO接口中,我们需要定义修改数据的方法,并使用Mybatis-plus提供的注解来进行配置。下面详细介绍Mybatis-plus批量修改数据的实现方式。 1.手动编写SQL语句 Mybatis-plus提供了批量更新数据的方法,具体实现方式如下: ``` List<Entity> entityList = ...; int batchSize = 100; int totalSize = entityList.size(); int batchCount = totalSize % batchSize == 0 ? totalSize / batchSize : totalSize / batchSize + 1; final String updateSql = "update table set field1 = ? , field2 = ? where id = ?"; for(int i = 0; i < batchCount; i++) { List<Entity> subList = entityList.subList(i * batchSize, Math.min((i + 1) * batchSize, totalSize)); jdbcTemplate.batchUpdate(updateSql, new BatchPreparedStatementSetter() { @Override public int getBatchSize() { return subList.size(); } @Override public void setValues(PreparedStatement ps, int j) throws SQLException { Entity entity = subList.get(j); ps.setString(1, entity.getField1()); ps.setString(2, entity.getField2()); ps.setString(3, entity.getId()); } }); } ``` 在这个方法中,我们需要先定义一个实体集合entityList,然后根据每个批次更新的数据量,分割entityList,并使用JdbcTemplate的batchUpdate方法批量更新数据。 2.使用Mybatis-plus提供的方法 Mybatis-plus提供了批量更新数据的方法。在entity类中添加注解@Version,表示乐观锁的版本号,需要加入这个注解,否则记录将无法批量更新。 Mybatis-plus批量更新的具体实现方式为: ``` List<Entity> entityList = ...; boolean result = saveOrUpdateBatch(entityList, batchSize); ``` 其中,result表示批量更新是否成功的结果,batchSize表示每个批次更新的数据量。 总结来说,实现Mybatis-plus批量修改数据主要有两种方法:手动编写SQL语句和使用框架提供的方法,两种方法都有其优缺点,实际使用时需要根据实际情况进行选择,以达到最优的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋日的晚霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值