MyBatis Plus批量插入或更新数据

saveOrUpdateBatch() 是 MyBatis Plus 提供的一个非常实用的方法,它允许你在批量插入或更新数据时,根据指定的条件(通常是主键或唯一标识)来判断是应该插入新记录还是更新现有记录。这个方法特别适用于需要同时处理大量新增和更新操作的场景,它可以大大减少与数据库的交互次数,提高性能。

假设我们有一个 User 实体类,对应数据库中的 user 表,该表有一个自增的主键 id 和一个用于唯一标识用户的 email 字段。我们想要批量插入或更新多个用户信息。


// 1. 定义实体类  
public class User {  
    private Long id; // 主键  
    private String email; // 唯一标识  
    private String name;  
    private Integer age;  
    // getters and setters  
}  
  
// 2. 定义 Mapper 接口(省略,因为通常只需要继承 BaseMapper 即可)  
  
// 3. 定义 Service 接口  
public interface UserService extends IService<User> {  
}  
  
// 4. 实现 Service 接口  
@Service  
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {  
     
    // 批量插入或更新用户  
    public void saveOrUpdateUsers(List<User> users) {  
        saveOrUpdateBatch(users); // 使用默认批量大小  
        // 或者使用 saveOrUpdateBatch(users, batchSize) 方法来指定批量大小  
    }  
}  
  
// 5. 在你的业务代码中调用  
@Autowired  
private UserService userService;  
  
public void someBusinessMethod() {  
    List<User> users = new ArrayList<>();  
      
    // 假设这里添加了多个用户到 users 列表中,有些用户可能已存在(根据 email 判断)  
    User user1 = new User();  
    user1.setEmail("user1@example.com");  
    user1.setName("User One");  
    user1.setAge(25);  
      
    User user2 = new User();  
    user2.setId(1L); // 假设这个用户已经存在,并且我们知道他的 ID  
    user2.setEmail("user2@example.com");  
    user2.setName("User Two Updated");  
    user2.setAge(30);  
      
    users.add(user1);  
    users.add(user2);  
      
    userService.saveOrUpdateUsers(users);  
}

在上面的例子中,我们有两个用户:user1 和 user2user1 是一个新用户,因为他的 email 在数据库中不存在,所以会被插入。user2 是一个已存在的用户,因为我们指定了他的 id 和 email,并且假设这个 email 在数据库中已经存在对应的记录,所以他的信息会被更新。

当 saveOrUpdateBatch() 方法被调用时,MyBatis Plus 会根据每个实体的主键或唯一标识(在这个例子中是 email,但实际上应该是 id 和 email 的组合,因为 id 是主键)来判断是应该插入还是更新。如果实体在数据库中不存在,则执行插入操作;如果存在,则执行更新操作。

  • 当更新记录时,如果实体类中的某些字段为 null,并且这些字段在数据库中有非空约束,那么更新操作可能会失败。为了避免这种情况,你可以在更新前检查这些字段的值,或者确保你的更新逻辑能够正确处理 null 值。

mybatis-plus提供了两种方式来实现批量更新操作。第一种方式是使用`saveOrUpdateBatch`方法,这个方法可以同时插入或者更新多条数据。第二种方式是通过继承`com.baomidou.mybatisplus.extension.service.impl.ServiceImpl`类来实现批量更新操作。在这个类中,有一个`updateBatchById`方法可以用于批量更新数据。这两种方式都可以根据需要选择来进行批量更新操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [批量插入更新数据(MyBatis-plus框架)](https://blog.csdn.net/hauchun/article/details/126488062)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MyBatis-Plus批量更新](https://blog.csdn.net/m0_67390379/article/details/126463376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Mybatis批量更新三种方式的实现](https://download.csdn.net/download/weixin_38667697/12751284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值