自学内容网 自学内容网

解决 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: 8080

mybatis-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 {
    @Autowired
    private 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。选择合适的方式取决于你的具体需求。如果你的应用中只有少数字段需要支持空值更新,建议采用字段级别的设置;如果大多数或所有字段都需要支持空值更新,那么修改全局配置会更加方便。


原文地址:https://blog.csdn.net/wenxuankeji/article/details/143782788

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!