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

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+" 条记录");}

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

相关文章:

  • 西门子S7-1200 PLC 游泳池水处理远程控制设计文章(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • AI Agent设计模式 Day 1:ReAct模式:推理与行动的完美结合 - 详解
  • 步向“数字一局”,中交一公局“语义 + AI”双引擎驱动经营管理智能化转型
  • 当用户输入变成系统指令:我的数据库完成了一次“公开处刑“
  • 树套树 | 题解:[ZJOI2013] K 大数查询
  • 首信保险代理靠谱吗?值得推荐吗?电话号码是多少? - 包罗万闻
  • DevOps平台行业实践案例:金融、政务、汽车行业成功经验分享
  • 【国家级学会专委会主办】2026年智能检测与运动控制技术国际会议(IDMCT 2026)
  • 海外求职机构有哪些?全球资源覆盖机构盘点(2026最新) - Matthewmx
  • ICLR 2026 | UIUC:一行代码,终结大模型“过度思考”!
  • 数据库的索引和约束
  • 生产物料分拣MCGS程序(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 配置html报告中的时间粒度granularity
  • 合集推荐|外籍人血浆靠谱的供应商+空白人血浆国内最专业供应商,猴全血/猴血清/比格犬血浆厂家一站式汇总 - 品牌推荐大师1
  • Typora绘制-饼图象限图
  • 第六章 二叉树part01
  • 实验室必备!高性价比纳米粒度仪选购推荐 - 品牌推荐大师1
  • cladue skills
  • 48 小时做完并提审:待办事项微信小程序实战(VS Code + Codex 插件)
  • 【IEEE出版 | EI检索】第三届生成式人工智能与信息安全国际学术会议(GAIIS 2026)
  • 解决Abaqus分析不收敛问题的10个实用方法
  • telock0.98b1脱壳分析
  • 完整演示 Git Flow 所有分支的创建与流转过程的 实操命令示例
  • nginx的安装一个最简单的配置(windows和Centos)
  • 内存映射的属性
  • 神马影视 8.8 版 2026 最新源码系统 技术解析
  • 拉萨样本:高原缺氧环境下的AI压力测试术
  • OCAD应用:凸轮曲线的优化设计
  • Git Flow 详解与最佳实践:打造规范高效的团队协作流程
  • 【Django毕设全套源码+文档】基于Python的旅游管理系统的设计(丰富项目+远程调试+讲解+定制)