news 2026/5/1 7:14:20

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/4/30 16:49:57

解决Abaqus分析不收敛问题的10个实用方法

对于每一位有限元分析工程师而言&#xff0c;Abaqus分析过程中弹出的“Too many attempts made for this increment”警告&#xff0c;无疑是最令人沮丧的时刻之一。模型的abaqus不收敛问题&#xff0c;不仅消耗了宝贵的计算资源&#xff0c;更严重拖慢了项目进度。导致abaqus分…

作者头像 李华
网站建设 2026/5/1 6:55:29

python协同过滤算法的鲜花商城销售管理系统vue

目录 协同过滤算法在鲜花商城销售管理系统中的应用核心算法实现Python 实现示例Vue 前端集成系统优势 开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 协同过滤算法在鲜花商城销售管理系统中的应用 协同过滤算法是一种基…

作者头像 李华
网站建设 2026/4/20 0:32:37

python基于内容推荐算法的校园人才招聘系统

目录系统概述核心功能技术实现优势与创新应用场景开发技术路线结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 基于内容推荐算法的校园人才招聘系统旨在通过分析学生简历和岗位需求的匹配度&#xff0c;实现精准推荐。系统利…

作者头像 李华
网站建设 2026/5/1 6:47:07

本土化战略咨询新势力崛起!2026中国战略咨询公司推荐TOP5

在全球经济格局深度调整与中国企业转型升级的双重驱动下&#xff0c;战略咨询行业正迎来前所未有的变革契机。当"中国制造"加速向"中国创造"跨越&#xff0c;当"中国产品"向"中国品牌"跃升&#xff0c;一批兼具国际视野与本土智慧的咨…

作者头像 李华
网站建设 2026/5/1 5:26:19

大模型落地全景指南:从技术实践到企业价值创造

大模型落地全景指南&#xff1a;从技术实践到企业价值创造大模型落地已从概念验证进入规模化应用阶段&#xff0c;微调、提示词工程、多模态融合和企业级解决方案构成四大核心支柱。本文通过技术解析、代码实现、流程图解和实战案例&#xff0c;系统拆解落地路径&#xff0c;帮…

作者头像 李华