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

mybatis-plus 的更新操作(个人资料更新) —— 前后端传参空值处理

文章目录

  • updateById 方法
  • update 方法
  • 避免 null 和空字符串覆盖
  • 思:不是说mybatis-plus更新的时候如果为null并不会更新数据库吗?但是我new的user里面本来就是null阿,就算copyProperties传null过去,不是一样吗?用updateById为什么更新后,数据库就变null了?
  • 解决方案

updateById 方法

updateById 方法会根据实体对象的主键字段更新数据库中的记录。它会将实体对象中的所有字段(包括 null 值)写入数据库,覆盖原有的值。因此,如果实体对象中的某些字段为 null,这些 null 值会被写入数据库,覆盖原有的值。

update 方法

update 方法需要一个实体对象和一个条件(如 QueryWrapper 或 LambdaUpdateWrapper)。它只会更新实体对象中非 null 的字段。如果实体对象中的某些字段为 null,这些字段不会被更新,原有的值会保持不变。

避免 null 和空字符串覆盖

在调用 updateById 或 update 方法之前,确保实体对象中的字段值是有效的,或者过滤掉 null 和空字符串值。

思:不是说mybatis-plus更新的时候如果为null并不会更新数据库吗?但是我new的user里面本来就是null阿,就算copyProperties传null过去,不是一样吗?用updateById为什么更新后,数据库就变null了?

原因一: updateById 方法会根据实体对象的主键字段更新数据库中的记录。它会将实体对象中的所有字段(包括 null 值)写入数据库,覆盖原有的值

原因二: 前端传的不是null,比如说字符串传了空字符串,并非null,所以也会更新到数据库中

解决方案

方案一: 前端控制:
前端只发送需要更新的字段,减少不必要的字段更新,提高性能。

方案二: 后端处理:
由于 BeanUtils.copyProperties 不支持直接忽略空字符串(“”),你需要在后端手动处理这些空字符串,确保它们不会覆盖目标对象中的现有值。这可以通过在复制属性之前手动检查字段值来实现。

 @Overridepublic UpdateUserResponse updateUser(UpdateUserRequest request) {String jwt = httpServletRequest.getHeader("token");Claims claims = JwtUtil.parse(jwt);String userIdStr = claims.getSubject();Long userId = Long.parseLong(userIdStr);//        //通过token找到对应user
//        //queryWrapper.eq("user_id", ) 中传入的 userId 的数据类型应该与数据库中 user_id 字段的类型一致。
//        //MyBatis-Plus 在构建 SQL 查询时,会根据传入的参数类型生成相应的 SQL 语句。
//        //在我的数据库表中,user_id 字段的类型是 bigint,在我的 Java 实体类中,user_id 字段应该对应为 Long 类型,以匹配数据库中的 bigint 类型。QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id", userId);//注意://updateById 方法会根据实体对象的主键字段更新数据库中的记录。它会将实体对象中的所有字段(包括 null 值)写入数据库,覆盖原有的值。因此,如果实体对象中的某些字段为 null,这些 null 值会被写入数据库,覆盖原有的值。//update 方法需要一个实体对象和一个条件(如 QueryWrapper 或 LambdaUpdateWrapper)。// 它只会更新实体对象中非 null 的字段。// 如果实体对象中的某些字段为 null,这些字段不会被更新,原有的值会保持不变。User user = new User();if (request.getUserName() != null && !request.getUserName().isEmpty()) {user.setUserName(request.getUserName());}if (request.getPassword() != null && !request.getPassword().isEmpty()) {user.setPassword(request.getPassword());}if (request.getEmail() != null && !request.getEmail().isEmpty()) {user.setEmail(request.getEmail());}if (request.getPhone() != null && !request.getPhone().isEmpty()) {user.setPhone(request.getPhone());}if (request.getSignature() != null && !request.getSignature().isEmpty()) {user.setSignature(request.getSignature());}if (request.getGender() != -1) {user.setGender(request.getGender());}if (request.getStatus() != -1) {user.setStatus(request.getStatus());}//在实体类中,需要在主键属性上加上 @TableId 注解。// 使用 updateById 方法时,只需要传入一个实体对象,MyBatis-Plus 会自动更新这个实体中非空字段对应的数据库记录boolean isUpdate = this.update(user, queryWrapper);return new UpdateUserResponse().setUserId(userId).setUpdate(isUpdate);}}

嗯改了一下,都可以兼容

不修改的参数不传也可以,传空字符串也可以,传null也可以

然后像gender和status这种整数类型的如果要传然后不修改的话,传-1就可以


文章转载自:

http://pxvQ3UTp.dqggd.cn
http://YjrJHxGQ.dqggd.cn
http://dZIJBbdB.dqggd.cn
http://oJYFJcG1.dqggd.cn
http://hbFU9jT7.dqggd.cn
http://2ad5bi8A.dqggd.cn
http://ceGHWV3F.dqggd.cn
http://xxclrnX8.dqggd.cn
http://prnAVjoh.dqggd.cn
http://3NuzpZay.dqggd.cn
http://GDx5YW3N.dqggd.cn
http://rty3BeQQ.dqggd.cn
http://aA3frb3h.dqggd.cn
http://srjjWEDm.dqggd.cn
http://rs1id4QQ.dqggd.cn
http://iJeNxn9W.dqggd.cn
http://M3DmPrQx.dqggd.cn
http://meATLG9E.dqggd.cn
http://M6S5dS41.dqggd.cn
http://echTTubG.dqggd.cn
http://0N2iO1wT.dqggd.cn
http://nLrtjJMc.dqggd.cn
http://FbnqBTKm.dqggd.cn
http://yEG5X2ur.dqggd.cn
http://ZnY22dwT.dqggd.cn
http://aopUCzZN.dqggd.cn
http://SSuqj3fV.dqggd.cn
http://SgkLnkXk.dqggd.cn
http://SqEHSb7h.dqggd.cn
http://otTthlts.dqggd.cn
http://www.dtcms.com/a/374350.html

相关文章:

  • 技术方案之数据迁移方案
  • LeetCode热题 15.三数之和(双指针)
  • 我对 OTA 的理解随记,附GD32/STM32例程
  • 快速构建数据集-假数据(生成划分)
  • c++ 杂记
  • Effective Modern C++ 条款26:避免在通用引用上重载
  • Android14 init.rc中on boot阶段操作4
  • PYQT5界面类继承以及软件功能开发小记
  • 【机器学习】吴恩达机器学习笔记
  • UE5 性能优化(1) 模型合并,材质合并
  • Selenium4+Pytest自动化测试框架实战
  • 基于RK3568多网多串(6网+6串+2光)1U/2U机架式服务器在储能与电力的应用
  • 【Python】运动路线记录GPX文件的操作API函数,以及相关GUI界面(支持复制、拼接、数据生成、修改,SRT字幕生成等功能)
  • 西嘎嘎学习 - C++vector容器 - Day 7
  • 第三章:Python基本语法规则详解(二)
  • Next系统总结学习(一)
  • 备考系统分析师-专栏介绍和目录
  • 【rk3229/rk3228a android7.1 LPDDR EMMC EMCP 批量sdk】
  • Kali 自带工具 dirb:Web 路径扫描与 edusrc 挖掘利器
  • 【系统分析师】第2章-基础知识:数学与工程基础(核心总结)
  • 房屋安全鉴定机构评价
  • JAVA:io字符流FileReader和FileWriter基础
  • 从零深入理解嵌入式OTA升级:Bootloader、IAP与升级流程全解析
  • 7.0 热电偶的工作原理
  • GPT(Generative Pre-trained Transformer)模型架构与损失函数介绍
  • 【51单片机】【protues仿真】基于51单片机公交报站系统
  • linux常用命令(2)——系统管理
  • Yarn介绍与HA搭建
  • 记个笔记:Cocos打包安卓使用安卓通信模块
  • 基于Python的云原生TodoList Demo 项目,验证云原生核心特性