当前位置: 首页 > news >正文

MyBatis-Plus 中 update 和 updateById 的区别

在 MyBatis-Plus 中,updateupdateById都是用于更新数据的方法,但它们的用途和行为有显著区别:

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=1

2.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.主要区别对比

特性updateByIdupdate
更新依据主键 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+ 条件构造器

http://www.jsqmd.com/news/253177/

相关文章:

  • Java开发终面45分钟深度复盘:实在智能高频考点全解析(红黑树、HashMap线程安全、Spring Boot IOC/AOP、JWT鉴权、分布式ID、Python GIL)
  • 腾讯后端日常实习一面45分钟深度复盘:Agent安全、协议栈、SQL优化与滑动窗口实战
  • 【异常】数据库“隐形”字符大揭秘:Navicat 中如何发现并批量清除换行符与制表符
  • 不用再写Mock了!AI自动生成符合业务逻辑的API响应
  • Java版LeetCode热题100之「删除链表的倒数第 N 个结点」详解
  • 云服务器2G内存运行MySQL 9.0有哪些性能瓶颈?如何调优?
  • 农业大数据系统怎样实现CKEDITOR批量图片上传到C#.NET?
  • 为什么你的AI测试工具总误报?因为你没教它“业务语义”
  • 可控 AI 时代来了:当模型幻觉无限趋向于 0,我们到底能得到什么?
  • Java版LeetCode热题100之「两两交换链表中的节点」详解
  • 全平台兼容·一触即发,新一代AI直播场控系统,实现全平台高效管理
  • 从“脚本维护”到“模型调优”:我的测试岗位进化史
  • 重新定义“模型幻觉”:为什么它不该被消灭,而是必须被控制
  • 当 AI 不再乱跑:一些以前做不了的事,开始变得可行
  • 兽医影像联邦学习诊断准确率翻倍
  • 深度测评继续教育AI论文工具TOP8:选对工具轻松写好毕业论文
  • Deepoc具身模型开发板:重新定义机器人智能化的技术底座
  • Deepoc具身模型开发板:半导体制造智能化的技术引擎
  • 可控 AI 不是更聪明,而是能停下来:Human–AI Co-Work 的一次工程验证
  • Windows 10,11怎么用系统自带工具清理C盘?
  • 为什么清理 C 盘后空间还是很快被占满?
  • 国企系统中,PHP如何实现大文件的切片上传示例?
  • 基于django框架和python的的小超市进货采购管理系统
  • 新手怎么安全清理C盘,不损坏系统和重要数据?
  • 基于 N1 盒子的 iStoreOS 实战:刷机原理、EMMC 安装与服务部署全流程解析
  • 清理C盘时,哪些文件绝对不能删,避免系统崩溃?
  • 基于django框架和python的的张家口旅游攻略系统的设计与实现
  • 7.9 工具性能优化与监控:确保系统稳定高效运行
  • 基于django框架和python的农产品扶贫助农系统的开发与实现
  • 7.6 智能文档处理:自动化处理各类办公文档