欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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方法單元測(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é)果:

可以看到由于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í)行上面的單元測(cè)試:

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

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

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、單元測(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é)果:

雖然沒有修改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)敏感詞過濾實(shí)例

    Java實(shí)現(xiàn)敏感詞過濾實(shí)例

    敏感詞、文字過濾是一個(gè)網(wǎng)站必不可少的功能,本篇文章主要介紹了Java實(shí)現(xiàn)敏感詞過濾實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • Java中Calendar時(shí)間操作常用方法詳解

    Java中Calendar時(shí)間操作常用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中Calendar時(shí)間操作常用方法,calendar中set方法和靜態(tài)屬性帶來的一些坑,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    Java中小球碰撞并使用按鈕控制數(shù)量實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java中小球碰撞并使用按鈕控制數(shù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • JAVA設(shè)計(jì)模式中的策略模式你了解嗎

    JAVA設(shè)計(jì)模式中的策略模式你了解嗎

    這篇文章主要為大家詳細(xì)介紹了JAVA設(shè)計(jì)模式中的策略模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • springboot整合spring-data-redis遇到的坑

    springboot整合spring-data-redis遇到的坑

    使用springboot整合redis,使用默認(rèn)的序列化配置,然后使用redis-client去查詢時(shí)查詢不到相應(yīng)的key.問題出在哪,怎么解決呢?下面小編給大家?guī)砹藄pringboot整合spring-data-redis遇到的坑,需要的的朋友參考下吧
    2017-04-04
  • Java操作hdfs文件系統(tǒng)過程

    Java操作hdfs文件系統(tǒng)過程

    這篇文章主要介紹了Java操作hdfs文件系統(tǒng)過程,這個(gè)過程需要前置準(zhǔn)備默認(rèn)服務(wù)器上的hadoop服務(wù)已經(jīng)啟動(dòng)、本地如果是windows環(huán)境,需要本地配置下hadoop的環(huán)境變量,下面來看看具體得操作過程吧
    2022-02-02
  • Maven項(xiàng)目中resources配置總結(jié)

    Maven項(xiàng)目中resources配置總結(jié)

    這篇文章主要介紹了Maven項(xiàng)目中resources配置總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)

    Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)

    使用Mybatis-plus可以很方便的實(shí)現(xiàn)批量新增和批量修改,不僅比自己寫foreach遍歷方便很多,而且性能也更加優(yōu)秀,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式,需要的朋友可以參考下
    2023-05-05
  • Spring注解和同步鎖不能同步問題解決

    Spring注解和同步鎖不能同步問題解決

    這篇文章主要介紹了Spring注解和同步鎖不能同步問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java?SpringMvc中攔截器的應(yīng)用

    java?SpringMvc中攔截器的應(yīng)用

    大家好,本篇文章主要講的是java?SpringMvc中攔截器的應(yīng)用,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01

最新評(píng)論