温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MybatisPlus中updateById方法不能更新空值如何解决

发布时间:2022-08-11 11:29:51 来源:亿速云 阅读:1186 作者:iii 栏目:开发技术

这篇文章主要介绍了MybatisPlus中updateById方法不能更新空值如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus中updateById方法不能更新空值如何解决文章都会有所收获,下面我们一起来看看吧。

    问题描述

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

    演示:

    实体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;
    }

    updateById方法单元测试:

        @Test
        public void testUpdateById() {
            System.out.println("----- updateById method test ------");
            User user = new User();
            user.setId(1543920054188400641L);
            user.setName("test");
            user.setAge(13);
            //user.setEmail();
            userMapper.updateById(user);
            System.out.println(user.toString());
        }

    执行结果:

    MybatisPlus中updateById方法不能更新空值如何解决

    可以看到由于email字段的值为null,所以执行updateById方法时没有对email字段进行更新。

    原因分析:

    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,忽略空值判断,直接更新即可。
    该方式的控制级别是字段级别的控制

    实体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;
        @TableField(updateStrategy = FieldStrategy.IGNORED)
        private String email;
    }

    再次执行上面的单元测试:

    MybatisPlus中updateById方法不能更新空值如何解决

    email字段虽然是空值,但仍然进行了更新操作,说明此时email字段已经支持空值更新。

    2、设置全局更新策略IGNORED

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

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

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

    测试:
    实体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;
    }

    单元测试:

    @Test
    public void testUpdateById() {
        System.out.println("----- updateById method test ------");
        User user = new User();
        user.setId(1543920054188400641L);
        user.setName("test");
        //user.setAge(13);
        //user.setEmail();
        userMapper.updateById(user);
        System.out.println(user.toString());
    }

    执行结果:

    MybatisPlus中updateById方法不能更新空值如何解决

    age和email字段都支持空值更新,说明全局更新策略ignored生效。

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

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

    实现步骤:

    1、继承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;
        }
    }

    2、将扩展的sql注入器配置到spring容器中

    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public MySqlInjector sqlInjector() {
            return new MySqlInjector();
        }
    }

    3、扩展自己的通用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);
    }

    4、UserMapper继承自定义的CommonMapper

    public interface UserMapper extends CommonMapper<User> {
    
    }

    5、实体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;
    }

    6、单元测试

        @Test
        public void testUpdateById() {
            System.out.println("----- updateById method test ------");
            User user = new User();
            user.setId(1543920054188400641L);
            user.setName("test");
            user.setAge(13);
            //user.setEmail();
            userMapper.alwaysUpdateSomeColumnById(user);
            System.out.println(user.toString());
        }

    执行结果:

    MybatisPlus中updateById方法不能更新空值如何解决

    虽然没有修改Mybatis-Plus全局的更新策略,也没有在实体字段上使用@TableField注解修改字段的更新策略,但是alwaysUpdateSomeColumnById方法仍然可以对空值字段进行更新。

    小结:

    本文主要是对Mybatis-Plus中updateById方法不能更新空值问题进行了分析说明,并提供了3种解决方案。

    字段级别解决方案
    采用@TableField注解修改字段默认的更新策略为FieldStrategy.IGNORED

       @TableField(updateStrategy = FieldStrategy.IGNORED)
       private String email;

    实体级别解决方案
    调用Mybatis-Plus中的扩展方法alwaysUpdateSomeColumnById,忽略字段更新策略,直接对实体中所有字端进行更新。

    全局级别解决方案
    修改Mybatis-Plus的全局更新策略为ignored

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

    关于“MybatisPlus中updateById方法不能更新空值如何解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MybatisPlus中updateById方法不能更新空值如何解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI