Mybatis-Plus中updateById方法不能更新空值問題解決
問題描述
在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詳解
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ù)量實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java中小球碰撞并使用按鈕控制數(shù)量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-12-12springboot整合spring-data-redis遇到的坑
使用springboot整合redis,使用默認(rèn)的序列化配置,然后使用redis-client去查詢時(shí)查詢不到相應(yīng)的key.問題出在哪,怎么解決呢?下面小編給大家?guī)砹藄pringboot整合spring-data-redis遇到的坑,需要的的朋友參考下吧2017-04-04Maven項(xiàng)目中resources配置總結(jié)
這篇文章主要介紹了Maven項(xiàng)目中resources配置總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式總結(jié)
使用Mybatis-plus可以很方便的實(shí)現(xiàn)批量新增和批量修改,不僅比自己寫foreach遍歷方便很多,而且性能也更加優(yōu)秀,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus批量添加或修改數(shù)據(jù)的3種方式,需要的朋友可以參考下2023-05-05