news 2026/9/28 19:30:06

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/9/24 5:03:44

springboot某高校学生资助贷款管理系统

目录系统概述核心功能技术架构创新点应用效果开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 该高校学生资助贷款管理系统基于SpringBoot框架开发&#xff0c;旨在实现学生贷款申请、审批、发放及还款的全流程数…

作者头像 李华
网站建设 2026/9/24 5:44:14

基于nodejs药膳食堂点餐系统的设计与实现

目录 摘要内容技术架构核心功能模块创新点性能指标 开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要内容 该系统基于Node.js技术栈开发&#xff0c;结合现代Web框架与数据库技术&#xff0c;构建了一个功能完整的药…

作者头像 李华
网站建设 2026/9/24 5:44:33

python基于机器学习的网络购物平台的智能推荐的设计与实现

目录网络购物平台智能推荐系统的设计与实现摘要关键技术系统实现应用效果开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;网络购物平台智能推荐系统的设计与实现摘要 该研究基于机器学习技术&#xff0c;设计并实现了一个…

作者头像 李华
网站建设 2026/9/24 0:53:05

python新能源汽车养护4S店维修系统的设计与实现

目录新能源汽车养护4S店维修系统的设计与实现摘要系统背景与目标技术架构与功能模块创新点与优势应用效果开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;新能源汽车养护4S店维修系统的设计与实现摘要 系统背景与目标 随…

作者头像 李华
网站建设 2026/9/27 2:49:12

python自习室座位签到预约系统nodejs vue

目录系统概述核心功能模块技术实现要点扩展功能建议开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Python自习室座位签到预约系统基于Node.js后端和Vue前端构建&#xff0c;实现座位管理、用户预约、签到签退等…

作者头像 李华
网站建设 2026/9/27 21:56:01

【Django毕设全套源码+文档】基于Python的智慧社区管理系统的设计与实现(丰富项目+远程调试+讲解+定制)

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

作者头像 李华