解决 Mybatis-Plus 中 `updateById` 方法不更新空值、更新字段无效的问题
前言
在使用 Mybatis-Plus 进行数据库操作时,我们经常会遇到需要将某个字段更新为 null
的情况。例如:我们的更新操作,假如之前设置了人的邮箱,修改时想去掉,那么修改时前端就会将对应的字段传成空(null)值。然而,默认情况下,Mybatis-Plus 的 updateById
方法不会更新字段为 null
的值。这是因为 Mybatis-Plus 在更新时会对字段值进行空值判断,默认策略是 FieldStrategy.NOT_NULL
,即不会对 null
值的数据进行处理。
解决方案
要解决这个问题,有两种主要的方法:
- 字段级别的更新策略
- 全局更新策略
MybatisPlus官方文档–新增、查询策略
1. 字段级别的更新策略
如果只是希望实体中的某几个字段支持空值更新,可以在这些字段上通过 @TableField
注解指定字段的更新策略为 FieldStrategy.IGNORED
或FieldStrategy.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.yml
或 application.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
。选择合适的方式取决于你的具体需求。如果你的应用中只有少数字段需要支持空值更新,建议采用字段级别的设置;如果大多数或所有字段都需要支持空值更新,那么修改全局配置会更加方便。