溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2022-08-11 11:29:51 來(lái)源:億速云 閱讀:1138 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了MybatisPlus中updateById方法不能更新空值如何解決的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇MybatisPlus中updateById方法不能更新空值如何解決文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

    問(wèn)題描述

    在Mybatis-Plus中調(diào)用updateById方法進(jìn)行數(shù)據(jù)更新默認(rèn)情況下是不能更新空值字段的。而在實(shí)際開(kāi)發(fā)過(guò)程中,往往會(huì)遇到需要將字段值更新為空值的情況。
    那么如果讓Mybatis-Plus中的updateById方法支持空值更新呢?

    演示:

    實(shí)體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方法單元測(cè)試:

        @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());
        }

    執(zhí)行結(jié)果:

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

    可以看到由于email字段的值為null,所以執(zhí)行updateById方法時(shí)沒(méi)有對(duì)email字段進(jìn)行更新。

    原因分析:

    Mybatis-Plus中字段的更新策略是通過(guò)FieldStrategy屬性控制的。

    在實(shí)體字段上,如果不通過(guò)@TableField注解指定字段的更新策略,字段默認(rèn)的更新策略是FieldStrategy.DEFAULT,即跟隨全局策略。

    而Mybatis-Plus的全局配置中,字段的默認(rèn)更新策略是FieldStrategy.NOT_NULL,即進(jìn)行空值判斷,不對(duì)NULL值數(shù)據(jù)進(jìn)行處理。

    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、設(shè)置字段級(jí)別的更新策略IGNORED

    如果只需要實(shí)體中的幾個(gè)字段支持空值更新,則通過(guò)@TableField注解指定字段的更新策略為FieldStrategy.IGNORED,忽略空值判斷,直接更新即可。
    該方式的控制級(jí)別是字段級(jí)別的控制

    實(shí)體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;
    }

    再次執(zhí)行上面的單元測(cè)試:

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

    email字段雖然是空值,但仍然進(jìn)行了更新操作,說(shuō)明此時(shí)email字段已經(jīng)支持空值更新。

    2、設(shè)置全局更新策略IGNORED

    如果需要全局所有實(shí)體的更新操作都需要支持空值更新,可以修改Mybatis-Plus的全局更新策略。
    該方式的控制級(jí)別是項(xiàng)目級(jí)別的控制。

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

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

    測(cè)試:
    實(shí)體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;
    }

    單元測(cè)試:

    @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());
    }

    執(zhí)行結(jié)果:

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

    age和email字段都支持空值更新,說(shuō)明全局更新策略ignored生效。

    3、采用alwaysUpdateSomeColumnById方法進(jìn)行全字段更新

    Mybatis-Plus中自帶的擴(kuò)展方法alwaysUpdateSomeColumnById會(huì)忽略字段的更新策略,直接對(duì)實(shí)體中的每一個(gè)字段都執(zhí)行更新操作。
    如果你不想修改全局的字段更新策略,又需要項(xiàng)目中某個(gè)實(shí)體的所有字段都支持空值更新,推薦采用該方法。
    該方式的控制級(jí)別是實(shí)體級(jí)別的控制

    實(shí)現(xiàn)步驟:

    1、繼承DefaultSqlInjector擴(kuò)展sql注入器,注入AlwaysUpdateSomeColumnById方法

    public class MySqlInjector extends DefaultSqlInjector {
        @Override
        public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
            List<AbstractMethod> methodList = super.getMethodList(mapperClass,tableInfo);
            //自動(dòng)填充策略為更新填充策略時(shí),不用插入值
            methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
    
            //自動(dòng)填充策略為插入時(shí)自動(dòng)填充時(shí),字段不用更新
            methodList.add(new AlwaysUpdateSomeColumnById(i -> i.getFieldFill() != FieldFill.INSERT));
            return methodList;
        }
    }

    2、將擴(kuò)展的sql注入器配置到spring容器中

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

    3、擴(kuò)展自己的通用Mapper接口CommonMapper

    public interface CommonMapper<T> extends BaseMapper<T> {
        /**
         * 全量插入,等價(jià)于insert
         * @param entityList
         * @return
         */
        int insertBatchSomeColumn(List<T> entityList);
    
        /**
         * 全字段更新,不會(huì)忽略null值
         * @param entity
         * @return
         */
        int alwaysUpdateSomeColumnById(@Param("et") T entity);
    }

    4、UserMapper繼承自定義的CommonMapper

    public interface UserMapper extends CommonMapper<User> {
    
    }

    5、實(shí)體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、單元測(cè)試

        @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());
        }

    執(zhí)行結(jié)果:

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

    雖然沒(méi)有修改Mybatis-Plus全局的更新策略,也沒(méi)有在實(shí)體字段上使用@TableField注解修改字段的更新策略,但是alwaysUpdateSomeColumnById方法仍然可以對(duì)空值字段進(jìn)行更新。

    小結(jié):

    本文主要是對(duì)Mybatis-Plus中updateById方法不能更新空值問(wèn)題進(jìn)行了分析說(shuō)明,并提供了3種解決方案。

    字段級(jí)別解決方案
    采用@TableField注解修改字段默認(rèn)的更新策略為FieldStrategy.IGNORED

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

    實(shí)體級(jí)別解決方案
    調(diào)用Mybatis-Plus中的擴(kuò)展方法alwaysUpdateSomeColumnById,忽略字段更新策略,直接對(duì)實(shí)體中所有字端進(jìn)行更新。

    全局級(jí)別解決方案
    修改Mybatis-Plus的全局更新策略為ignored

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

    關(guān)于“MybatisPlus中updateById方法不能更新空值如何解決”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“MybatisPlus中updateById方法不能更新空值如何解決”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI