美文网首页
MyBatis-Plus的updateById不更新null值的

MyBatis-Plus的updateById不更新null值的

作者: 刘其瑞 | 来源:发表于2024-02-01 10:08 被阅读0次

    在 MyBatis-Plus 中,使用updateById,null字段并不会更新,其实是和更新的策略有关,当然,也有插入策略,本文基于MyBatis-Plus3.41和3.5.2,对插入和更新策略做讲解。

    方式一 调整全局的验证策略

    注入全局配置,设置属性 insertStrategyupdateStrategy

    缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null

    mybatis-plus:
      global-config:
        db-config:
          insert-strategy: ignored  # "忽略判断", 所有字段都插入
          update-strategy: ignored  # "忽略判断", 所有字段都更新
    

    insertStrategyupdateStrategy 属性的值有以下5种枚举类型:

    ignored “忽略判断”, 所有字段都更新或插入
    not_null “非 NULL 判断”, 只更新或插入非NULL值
    not_empty “非空判断”, 只更新或插入非NULL值且非空字符串
    default 如果字段的值不为null,则进行插入或者更新操作;如果字段的值为null,不执行操作,执行结果还是数据库原来的值或者默认值
    never 永远不进行插入或更新操作,即使字段的值不为null

    方式二 调整字段验证注解(如果项目没有全局策略,推荐此注解)

    在实体类属性上注解

    根据具体情况,在需要更新或者插入的字段中调整验证注解,如忽略判断,任何情况都进行插入和更新操作:

    @TableField(updateStrategy = FieldStrategy.IGNORED, insertStrategy = FieldStrategy.IGNORED)
    private String remark;
    

    方式三 使用 UpdateWrapper

    如果没有设置 insert-strategyupdate-strategy 的值,默认为 default

    使用以下方法来进行更新操作,无设置的值还是数据库原来的值,如下

    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("name", "一碗情深")
        .set("remark", "描述")
        .eq("id", 1);
    userMapper.update(null, updateWrapper);
    

    或者使用lambda表达式,只有将属性赋值,数据库的值才会改变,如下,把email设置成null

    mapper.update(
        null,
        Wrappers.<User>lambdaUpdate()
            .set(User::getName, "一碗情深")
            .set(User::getRemark, "描述")
            .set(User::getEmail, null) // 把email设置成null
            .eq(User::getId, 1)
    );
    

    相关文章

      网友评论

          本文标题:MyBatis-Plus的updateById不更新null值的

          本文链接:https://www.haomeiwen.com/subject/sgfpvdtx.html