news 2026/5/31 1:04:25

mybatis-plus 基于 Mapper接口的 update

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mybatis-plus 基于 Mapper接口的 update

基于BaseMapper的crud

  • 通用 CRUD 封装 BaseMapper接口,
  • Mybatis-Plus 启动时,自动解析实体表关系映射转换为 Mybatis 内部对象注入容器,内部包含常见的单表操作

update

// 根据 whereWrapper 条件,更新记录intupdate(@Param(Constants.ENTITY)TupdateEntity,@Param(Constants.WRAPPER)Wrapper<T>whereWrapper);// 根据 ID 修改 主键属性必须值intupdateById(@Param(Constants.ENTITY)Tentity);
类型参数名描述
Tentity实体对象 (set 条件值,可为 null)
WrapperupdateWrapper实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)



举例详解

关键补充说明

  1. 字段为 null 的处理:无论哪个更新方法,entity中值为 null 的字段都不会参与更新(比如只想改年龄,就只设置 age,其他字段留 null 即可);
  2. 主键策略不影响更新:无论是自增ID、雪花算法ID,只要entity中ID有值,updateById就能正常定位;
  3. 返回值的意义:返回的是数据库「受影响的行数」,而非「匹配的行数」(比如更新的字段值和原有值一致,受影响行数为0)。

总结

  1. updateById(T entity):适用于已知主键ID的单条记录更新,entity 必须设置主键,非 null 字段为更新内容;
  2. update(T updateEntity, Wrapper<T> whereWrapper):适用于按条件批量更新,updateEntity 放要修改的字段,whereWrapper 控制更新范围,严禁传 null(避免全表更新);
  3. 推荐使用Lambda 版 Wrapper构建条件,减少列名硬编码错误。

前置准备

1. User 实体类

importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;@Data@TableName("user")publicclassUser{@TableId(type=IdType.AUTO)// 数据库自增主键privateLongid;// 主键ID(updateById时必须有值)privateStringusername;// 用户名privateIntegerage;// 年龄privateStringemail;// 邮箱}

2. UserMapper 接口(继承 BaseMapper 即可使用更新方法):

importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importorg.apache.ibatis.annotations.Mapper;@MapperpublicinterfaceUserMapperextendsBaseMapper<User>{"无需手动编写更新方法,BaseMapper 已内置"}

3. Service 层注入 Mapper

importorg.springframework.stereotype.Service;importjavax.annotation.Resource;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;@ServicepublicclassUserService{@ResourceprivateUserMapperuserMapper;"以下示例方法均写在该类中"}

一、updateById(T entity):根据 ID 精准更新

核心特点:
  • 必须给entity设置主键 ID(否则无法定位要更新的记录);
  • 仅更新entity非 null 的字段(null 字段会被忽略,不会修改数据库对应列);
  • 返回值:受影响的行数(成功更新返回1,无匹配ID返回0)。
示例:更新 ID 为 1 的用户信息
"更新ID为1的用户,仅修改年龄和邮箱,用户名保持不变"publicintupdateUserById(){// 1. 创建实体对象,必须设置主键ID(定位要更新的记录)UserupdateUser=newUser();updateUser.setId(1L);// 主键ID(必填)updateUser.setAge(28);// 要更新的字段:年龄改为28updateUser.setEmail("new_zhangsan@example.com");// 要更新的字段:邮箱修改// 注意:未设置username,该字段会保持数据库原有值// 2. 调用 updateById 方法intaffectedRows=userMapper.updateById(updateUser);// 3. 打印结果System.out.println("受影响行数:"+affectedRows);// 匹配到ID返回1,否则返回0returnaffectedRows;}

二、update(T updateEntity, Wrapper whereWrapper):按条件批量更新

核心特点:
  • updateEntity:存放要设置的字段值(非 null 字段为 set 条件);
  • whereWrapper:构建更新的筛选条件(where 语句),若为 null 会触发全表更新(极度危险!);
  • 返回值:受影响的行数(匹配到多少条就返回多少)。
场景1:基础用法(按简单条件更新)
"更新用户名是"zhangsan"的所有用户,将年龄改为30,邮箱改为统一值"publicintupdateUserByWrapper(){// 1. 构建要更新的字段(set 条件)UserupdateEntity=newUser();updateEntity.setAge(30);// 所有匹配用户的年龄改为30updateEntity.setEmail("zhangsan_unified@example.com");// 邮箱统一修改// 2. 构建更新条件(where 条件)QueryWrapper<User>whereWrapper=newQueryWrapper<User>().eq("username","zhangsan");// where username = 'zhangsan'// 3. 调用 update 方法intaffectedRows=userMapper.update(updateEntity,whereWrapper);System.out.println("批量更新受影响行数:"+affectedRows);// 比如匹配到2条就返回2returnaffectedRows;}
场景2:复杂条件更新(Lambda 写法,避免列名硬编码)

推荐用 Lambda 写法,防止写错数据库列名导致报错:

"更新年龄大于25且邮箱包含"example"的用户,将用户名改为"updated_user""publicintupdateUserByLambdaWrapper(){// 1. 构建要更新的字段UserupdateEntity=newUser();updateEntity.setUsername("updated_user");// 用户名统一修改// 2. 构建复杂条件(Lambda 写法更优雅)QueryWrapper<User>lambdaWrapper=newQueryWrapper<User>().lambda()// 开启Lambda模式.gt(User::getAge,25)// age > 25.like(User::getEmail,"example");// email 包含 "example"// 3. 执行更新intaffectedRows=userMapper.update(updateEntity,lambdaWrapper);returnaffectedRows;}
场景3:注意!避免全表更新

如果whereWrapper传 null,会更新全表所有记录,务必警惕:

"错误示例(慎用!):更新全表所有用户的年龄为20"publicvoidwrongUpdateDemo(){UserupdateEntity=newUser();updateEntity.setAge(20);// whereWrapper 为 null,会执行:UPDATE user SET age = 20intaffectedRows=userMapper.update(updateEntity,null);System.out.println("全表更新了 "+affectedRows+" 条记录");}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 23:02:08

2026年毕业论文维普AIGC检测率高于30%怎么办?避坑指南

答辩前7天&#xff0c;导师说我的论文AIGC率42%不能送审 距离答辩还有7天的时候&#xff0c;导师把我叫到办公室。他把电脑屏幕转过来给我看&#xff0c;维普AIGC检测报告上赫然显示42.6%。"学校今年的红线是30%&#xff0c;你这个过不了。"他说这句话的时候表情很平…

作者头像 李华
网站建设 2026/5/28 15:16:39

2026年DeepSeek写的论文维普AIGC查重率98%怎么办

2026年DeepSeek写的论文维普AIGC查重率98%怎么办 上个月帮一个学弟看论文&#xff0c;他打开维普检测结果的时候我俩都沉默了&#xff1a;AIGC疑似比例98%。 98%什么概念&#xff1f;基本上维普认为你整篇论文都是AI写的。而他确实是用DeepSeek写的。事情的经过是这样的&…

作者头像 李华
网站建设 2026/5/29 2:08:48

HTML 用户二次确认:提升操作安全性的关键实践

在 Web 开发中&#xff0c;用户交互的安全性始终是首要考虑因素。特别是对于敏感操作&#xff08;如删除数据、修改密码、支付确认等&#xff09;&#xff0c;简单的点击即执行模式存在巨大风险。本文将深入探讨如何通过 HTML 和 JavaScript 实现用户二次确认机制&#xff0c;帮…

作者头像 李华
网站建设 2026/5/28 15:16:49

【Django毕设源码分享】基于Python的智慧社区管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/30 3:08:40

RK3588 分区表详解:每一块分区到底装了什么、负责什么

&#x1f4fa; B站&#xff1a;博主个人介绍 &#x1f4d8; 博主书籍-京东购买链接*&#xff1a;Yocto项目实战教程 &#x1f4d8; 加博主微信&#xff0c;进技术交流群&#xff1a; jerrydev RK3588 分区表详解&#xff1a;每一块分区到底装了什么、负责什么 目标&#xff1…

作者头像 李华
网站建设 2026/5/28 16:03:41

闭眼入!8个AI论文工具测评:专科生毕业论文+开题报告全攻略

在当前学术研究日益数字化的背景下&#xff0c;AI写作工具已成为提升效率、优化内容质量的重要助手。然而面对市场上五花八门的产品&#xff0c;如何选择真正适合自己的工具成为难题。为此&#xff0c;笔者基于2026年的实测数据与真实用户反馈&#xff0c;围绕功能覆盖、核心服…

作者头像 李华