最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis-Plus中updateById方法不能更新空值問題解決

 更新時(shí)間:2022年08月11日 09:50:21   作者:斗者_(dá)2013  
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

問題描述

在Mybatis-Plus中調(diào)用updateById方法進(jìn)行數(shù)據(jù)更新默認(rèn)情況下是不能更新空值字段的。而在實(shí)際開發(fā)過程中,往往會(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方法單元測試:

    @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é)果:

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

原因分析:

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

在實(shí)體字段上,如果不通過@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;
}

相關(guān)文檔:

Mybatis-Plus中FieldStrategy說明

Mybatis-Plus字段策略FieldStrategy詳解

Tip??:
官網(wǎng)鏈接,自力更生。

解決方案:

1、設(shè)置字段級(jí)別的更新策略IGNORED

如果只需要實(shí)體中的幾個(gè)字段支持空值更新,則通過@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í)行上面的單元測試:

email字段雖然是空值,但仍然進(jìn)行了更新操作,說明此時(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

測試:
實(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;
}

單元測試:

@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é)果:

age和email字段都支持空值更新,說明全局更新策略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、單元測試

    @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é)果:

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

小結(jié):

本文主要是對(duì)Mybatis-Plus中updateById方法不能更新空值問題進(jìn)行了分析說明,并提供了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)于Mybatis-Plus中updateById方法不能更新空值問題解決的文章就介紹到這了,更多相關(guān)Mybatis-Plus updateById空值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)簡單單鏈表

    java實(shí)現(xiàn)簡單單鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單單鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 解決在Gradle/IDEA中無法正常使用readLine的問題原因

    解決在Gradle/IDEA中無法正常使用readLine的問題原因

    這篇文章主要介紹了在Gradle/IDEA中無法正常使用readLine的解決方法,原因是由于Gradle的標(biāo)準(zhǔn)輸入默認(rèn)并不與系統(tǒng)標(biāo)準(zhǔn)輸入綁定,需手動(dòng)設(shè)置,需要的朋友可以參考下
    2021-12-12
  • 關(guān)于Java鎖性能提高(鎖升級(jí))機(jī)制的總結(jié)

    關(guān)于Java鎖性能提高(鎖升級(jí))機(jī)制的總結(jié)

    這篇文章主要介紹了關(guān)于Java鎖性能提高(鎖升級(jí))機(jī)制的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • java實(shí)現(xiàn)簡單五子棋小游戲(2)

    java實(shí)現(xiàn)簡單五子棋小游戲(2)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單五子棋小游戲的第二部分,添加游戲結(jié)束條件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳解在Java中如何優(yōu)雅的停止線程

    詳解在Java中如何優(yōu)雅的停止線程

    線程,作為并發(fā)編程的基礎(chǔ)單元,允許程序同時(shí)執(zhí)行多個(gè)任務(wù),在Java中,線程可以理解為程序中的獨(dú)立執(zhí)行路徑,通過使用線程,開發(fā)者可以創(chuàng)建更加響應(yīng)靈敏、效率更高的應(yīng)用程序,本文小編將給大家介紹一下Java中如何優(yōu)雅的停止線程,需要的朋友可以參考下
    2023-11-11
  • 詳細(xì)講解Java輸入語句的寫法

    詳細(xì)講解Java輸入語句的寫法

    作為初步進(jìn)入java開發(fā)學(xué)習(xí)的小白來說,學(xué)習(xí)java語言一開始的時(shí)候得一步步的學(xué)習(xí),比如說java輸入語句應(yīng)該這么去實(shí)現(xiàn)呢,這篇文章主要給大家介紹了關(guān)于Java輸入語句的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 淺析spring定時(shí)器的使用

    淺析spring定時(shí)器的使用

    這篇文章主要介紹了淺析spring定時(shí)器的使用,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-10-10
  • 在Java 8中將List轉(zhuǎn)換為Map對(duì)象方法

    在Java 8中將List轉(zhuǎn)換為Map對(duì)象方法

    這篇文章主要介紹了在Java 8中將List轉(zhuǎn)換為Map對(duì)象方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • 使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢

    使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢

    這篇文章主要介紹了使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序介紹

    Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序介紹

    這篇文章主要介紹了Spring Cloud Gateway 默認(rèn)的filter功能和執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

张家口市| 调兵山市| 六盘水市| 南安市| 绍兴县| 土默特左旗| 马关县| 五家渠市| 万荣县| 东莞市| 东莞市| 和顺县| 红安县| 五指山市| 临安市| 道孚县| 孙吴县| 凤冈县| 镇远县| 顺义区| 汝州市| 宜昌市| 石泉县| 凤城市| 大石桥市| 侯马市| 西城区| 天镇县| 渭南市| 于田县| 曲麻莱县| 蓬安县| 茂名市| 宁国市| 集贤县| 葫芦岛市| 共和县| 宕昌县| 比如县| 灵璧县| 银川市|