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
和 user2
。user1
是一个新用户,因为他的 email
在数据库中不存在,所以会被插入。user2
是一个已存在的用户,因为我们指定了他的 id
和 email
,并且假设这个 email
在数据库中已经存在对应的记录,所以他的信息会被更新。
当 saveOrUpdateBatch()
方法被调用时,MyBatis Plus 会根据每个实体的主键或唯一标识(在这个例子中是 email
,但实际上应该是 id
和 email
的组合,因为 id
是主键)来判断是应该插入还是更新。如果实体在数据库中不存在,则执行插入操作;如果存在,则执行更新操作。
- 当更新记录时,如果实体类中的某些字段为
null
,并且这些字段在数据库中有非空约束,那么更新操作可能会失败。为了避免这种情况,你可以在更新前检查这些字段的值,或者确保你的更新逻辑能够正确处理null
值。