在 MyBatis-Plus 中,saveOrUpdate方法本质上是根据主键来判断是执行 INSERT 还是 UPDATE,而在执行 UPDATE 时,默认的字段更新策略是 FieldStrategy.NOT_NULL,即字段为 null 时不会参与 SQL 的更新语句。
1.在实体类的字段上加上
/**
* 听力测试
*/
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String hearingTest;其他方法
✅ 方式一:全局配置 updateStrategy
在配置类中统一修改字段的更新策略:
@Configuration
public class MybatisPlusConfig {
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
dbConfig.setUpdateStrategy(FieldStrategy.IGNORED); // 核心配置:null 值也更新
globalConfig.setDbConfig(dbConfig);
return globalConfig;
}
}⚠️ 注意:这个配置会影响全局字段更新行为,所有字段的更新都不会忽略 null 值,所以需要慎重使用。
✅ 方式二:构造 UpdateWrapper 手动更新(推荐灵活使用)
如果你只在某些场景想让 null 值也更新,可以使用 UpdateWrapper:
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", user.getId());
wrapper.set("name", user.getName());
wrapper.set("email", user.getEmail()); // 即使为null也会更新
userMapper.update(null, wrapper);注意:
saveOrUpdate是简化操作,如果要控制更细粒度的更新逻辑,可以用update+Wrapper更灵活。
✅ 方式三:使用 MetaObjectHandler 自定义字段更新逻辑(高级用法)
可以实现 MyBatis-Plus 提供的接口,在字段为 null 时注入默认值或特殊处理。
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void updateFill(MetaObject metaObject) {
// 这里可以设置默认值,即使传入 null
this.strictUpdateFill(metaObject, "email", String.class, null);
}
}