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

解决 Mybatis-Plus 中 `updateById` 方法不更新空值、更新字段无效的问题

前言

在使用 Mybatis-Plus 进行数据库操作时,我们经常会遇到需要将某个字段更新为 null 的情况。例如:我们的更新操作,假如之前设置了人的邮箱,修改时想去掉,那么修改时前端就会将对应的字段传成空(null)值。然而,默认情况下,Mybatis-Plus 的 updateById 方法不会更新字段为 null 的值。这是因为 Mybatis-Plus 在更新时会对字段值进行空值判断,默认策略是 FieldStrategy.NOT_NULL,即不会对 null 值的数据进行处理。

解决方案

要解决这个问题,有两种主要的方法:

  1. 字段级别的更新策略
  2. 全局更新策略

MybatisPlus官方文档–新增、查询策略

1. 字段级别的更新策略

如果只是希望实体中的某几个字段支持空值更新,可以在这些字段上通过 @TableField 注解指定字段的更新策略为 FieldStrategy.IGNOREDFieldStrategy.ALWAYS。这样就可以忽略空值判断,直接更新字段为 null。这种方式是字段级别的控制。

@TableField(updateStrategy = FieldStrategy.IGNORED)
private String exampleField;

例如,假设我们有一个 User 实体类,其中有一个 email 字段需要支持空值更新:

public class User {private Long id;@TableField(updateStrategy = FieldStrategy.IGNORED)private String email;// 其他字段和方法
}
2. 全局更新策略

如果希望所有实体的更新操作都支持空值更新,可以修改 Mybatis-Plus 的全局更新策略。这需要在项目的配置文件中进行设置。例如,在 Spring Boot 项目中,可以在 application.ymlapplication.properties 文件中添加如下配置:

mybatis-plus:global-config:db-config:update-strategy: ignored

这样做的结果是整个项目的更新操作都会忽略空值判断,允许字段更新为 null

示例代码

假设我们有一个简单的 Spring Boot 项目,以下是完整的配置和代码示例:

实体类 User.java

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("user")
public class User {private Long id;@TableField(updateStrategy = FieldStrategy.IGNORED)private String email;// Getter 和 Setter 方法
}

配置文件 application.yml

server:port: 8080mybatis-plus:global-config:db-config:update-strategy: ignored

Service 类 UserService.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;@Service
public class UserService extends ServiceImpl<UserMapper, User> {public void updateUser(User user) {updateById(user);}
}

Controller 类 UserController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PutMapping("/{id}")public String updateUser(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateUser(user);return "User updated successfully";}
}
总结

通过以上两种方法,你可以灵活地控制 Mybatis-Plus 中 updateById 方法的行为,使其支持将字段更新为 null。选择合适的方式取决于你的具体需求。如果你的应用中只有少数字段需要支持空值更新,建议采用字段级别的设置;如果大多数或所有字段都需要支持空值更新,那么修改全局配置会更加方便。


http://www.mrgr.cn/news/75225.html

相关文章:

  • leetcode-15-三数之和
  • docker构建jdk11
  • Rust面向对象特性
  • 区块链赋能Web3:数据透明与隐私保护的新纪元
  • react-router-dom 库作用
  • CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳
  • Altium Designer使用技巧(五)
  • 微服务day08
  • AUTOSAR_EXP_ARAComAPI的7章笔记(3)
  • 17-鸿蒙开发中的背景图片设置:位置、定位、单位和尺寸
  • Linux软件包管理与Vim编辑器使用指南
  • 绝对路径和相对路径的区别
  • 搜维尔科技:我们使用Xsens动作捕捉技术创建的短片
  • 行驶证 OCR 识别 API 接口的优势分析
  • Python中,处理日期和时间的库
  • GCN基于图卷积神经网络多特征分类预测(多输入单输出) Matlab代码
  • springboot039基于Web足球青训俱乐部管理系统
  • 似然函数解析
  • LeetCode 每日一题 统计满足 K 约束的子字符串数量 I
  • AI视觉小车基础--2.按键读取
  • 【MYSQL】数据库日志 (了解即可)
  • Linux 驱动
  • 机器学习(1)
  • [DB]
  • [ICML 2024]Learning High-Order Relationships of Brain Regions
  • 超全面!一文带你快速入门HTML,CSS和JavaScript!