📚 MyBatis-Plus 中 SaveOrUpdate的使用

Administrator
发布于 2025-06-15 / 0 阅读
0
0

📚 MyBatis-Plus 中 SaveOrUpdate的使用

在 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);
    }
}

小结:

方式

简述

是否推荐

注解 @TableField(updateStrategy = IGNORED)

只影响指定字段

✅ 推荐

全局配置 FieldStrategy.IGNORED

所有字段 null 也更新

⚠️ 慎用

使用 UpdateWrapper

灵活构造更新字段

✅ 推荐

自定义 MetaObjectHandler

注入默认值或特殊处理

✅ 进阶用法


评论