在 MyBatis-Plus 中,update和updateById都是用于更新数据的方法,但它们的用途和行为有显著区别:
1.updateById 方法
java
// 根据 ID 更新实体 boolean updateById(T entity);
特点:
根据主键 ID进行更新
实体对象必须包含主键值
只会更新非 null 的字段
更安全,避免误操作
示例:
java
User user = new User(); user.setId(1L); // 必须设置 ID user.setName("张三"); user.setAge(25); // 只更新 name 和 age 字段(email 为 null 则不更新) userService.updateById(user); // 生成的 SQL: // UPDATE user SET name='张三', age=25 WHERE id=12.update 方法
java
// 根据条件构造器更新 boolean update(T entity, Wrapper<T> updateWrapper);
特点:
根据条件构造器进行更新
可以批量更新多条记录
需要明确指定更新条件,否则可能更新全表
可以结合条件构造器进行复杂更新
示例:
java
// 示例1:条件更新 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("age", 18).set("status", 1); userService.update(new User(), wrapper); // 示例2:更新指定实体并带条件 User user = new User(); user.setName("李四"); UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("age", 20); userService.update(user, wrapper);3.主要区别对比
| 特性 | updateById | update |
|---|---|---|
| 更新依据 | 主键 ID | 条件构造器 |
| 更新范围 | 单条记录 | 可单条或多条 |
| 安全性 | 较高(必须有ID) | 较低(需注意条件) |
| 使用场景 | 精确更新单条记录 | 批量更新或条件更新 |
| 空值处理 | null 值不更新 | 可配置空值处理 |
| 灵活性 | 较低 | 较高 |
4.使用建议
使用 updateById 的场景:
java
// 1. 单条记录更新(知道ID) user.setId(userId); user.setUpdateTime(new Date()); userService.updateById(user); // 2. 从数据库查询后修改部分字段 User dbUser = userService.getById(id); dbUser.setStatus(2); userService.updateById(dbUser);
使用 update 的场景:
java
// 1. 批量更新 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.set("status", 0) // 直接设置值 .in("id", idList); // 批量条件 userService.update(null, wrapper); // 2. 条件更新(不需要先查询) UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("dept_id", deptId) .gt("age", 30) .set("level", "高级"); userService.update(null, wrapper); // 3. 递增/递减操作 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.setSql("balance = balance + 100") // SQL表达式 .eq("id", userId); userService.update(null, wrapper);5.注意事项
java
// ❌ 危险:没有条件的 update 会更新全表! userService.update(user, null); // 会更新所有记录! // ✅ 安全:始终确保有条件 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("id", userId); // 明确指定条件 userService.update(user, wrapper);6.性能考虑
updateById:更适合单条记录更新,性能更好update:适合批量操作,减少数据库交互次数
选择哪个方法取决于具体场景:
按主键更新 →
updateById按条件批量更新 →
update复杂更新逻辑 →
update+ 条件构造器