0
点赞
收藏
分享

微信扫一扫

为了实现上网自由,我做了一个多功能串口服务器

夜空一星 2023-07-04 阅读 71

问题描述:

在使用Mybatis-Plus调用updateById方法进行数据更新默认情况下是不能更新空值字段的,而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况,该如何解决呢?

原因分析:

Mybatis-Plus中字段的更新策略是通过FieldStrategy属性控制的。在实体字段上,如果不通过@TableField注解指定字段的更新策略,字段默认的更新策略是FieldStrategy.DEFAULT,即跟随全局策略。而Mybatis-Plus的全局配置中,字段的默认更新策略是FieldStrategy.NOT_NULL,即进行空值判断,不对NULL值数据进行处理。

public DbConfig() {
    this.idType = IdType.ASSIGN_ID;
    this.tableUnderline = true;
    this.capitalMode = false;
    this.logicDeleteValue = "1";
    this.logicNotDeleteValue = "0";
    this.insertStrategy = FieldStrategy.NOT_NULL;
    this.updateStrategy = FieldStrategy.NOT_NULL;
    this.whereStrategy = FieldStrategy.NOT_NULL;
}

解决方案:

1、设置字段级别的更新策略IGNORED

如果只需要实体中的几个字段支持空值更新,则通过@TableField注解指定字段的更新策略为FieldStrategy.IGNORED,忽略空值判断,直接更新即可。
该方式的控制级别是字段级别的控制。

示例:

@TableName(value ="user")
@Data
public class User implements Serializable {

    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String email;
}

示例

2、设置全局更新策略IGNORED

如果需要全局所有实体的更新操作都需要支持空值更新,可以修改Mybatis-Plus的全局更新策略。
该方式的控制级别是项目级别的控制。

在spring boot中修改如下属性即可:

mybatis-plus.global-config.db-config.update-strategy=ignored

3、采用alwaysUpdateSomeColumnById方法进行全字段更新

Mybatis-Plus中自带的扩展方法alwaysUpdateSomeColumnById会忽略字段的更新策略,直接对实体中的每一个字段都执行更新操作。
如果你不想修改全局的字段更新策略,又需要项目中某个实体的所有字段都支持空值更新,推荐采用该方法。
该方式的控制级别是实体级别的控制。

实现步骤:

  • 继承DefaultSqlInjector扩展sql注入器,注入AlwaysUpdateSomeColumnById方法
public class MySqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass,tableInfo);
        //自动填充策略为更新填充策略时,不用插入值
        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));

        //自动填充策略为插入时自动填充时,字段不用更新
        methodList.add(new AlwaysUpdateSomeColumnById(i -> i.getFieldFill() != FieldFill.INSERT));
        return methodList;
    }
}
  • 将扩展的sql注入器配置到spring容器中
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MySqlInjector sqlInjector() {
        return new MySqlInjector();
    }
}
  • 扩展自己的通用Mapper接口CommonMapper
public interface CommonMapper<T> extends BaseMapper<T> {
    /**
     * 全量插入,等价于insert
     * @param entityList
     * @return
     */
    int insertBatchSomeColumn(List<T> entityList);

    /**
     * 全字段更新,不会忽略null值
     * @param entity
     * @return
     */
    int alwaysUpdateSomeColumnById(@Param("et") T entity);
}
  • UserMapper继承自定义的CommonMapper
public interface UserMapper extends CommonMapper<User> {

}
  • 实体User
@TableName(value ="user")
@Data
public class User implements Serializable {
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
举报

相关推荐

0 条评论