mybatis和mybatis-plus設(shè)置值為null不起作用問題及解決
Mybatis-plus
FieldStrategy作用
Mybatis-Plus字段策略FieldStrategy的作用主要是在進(jìn)行新增、更新時,根據(jù)配置的策略判斷是否對實體對象的值進(jìn)行空值判斷,如果策略為字段不能為空,則不會對為空的字段進(jìn)行賦值或更新。
同樣,在進(jìn)行where條件查詢時,根據(jù)whereStrategy策略判斷是否對字段進(jìn)行空值判斷,如果策略為字段不能為空,則為空的字段不會作為查詢條件組裝到where條件中。
三個配置,對應(yīng)三種使用場景:
- insertStrategy 在insert操作時的字段策略,是否進(jìn)行空值判斷,插入空值
- updateStrategy 在update操作時的字段策略,是否進(jìn)行空值判斷,插入空值
- whereStrategy 在where條件組裝時,是否進(jìn)行控制判斷,將空值作為查詢條件
FieldStrategy類型
FieldStrategy的源碼中,一共有5種策略類型
public enum FieldStrategy { IGNORED, NOT_NULL, NOT_EMPTY, DEFAULT, NEVER; private FieldStrategy() { } }
每種策略的作用
值 描述 IGNORED 忽略空值判斷,實體對象的字段是什么值就用什么值更新,支持null值更新操作 NOT_NULL 進(jìn)行非NULL判斷,也是默認(rèn)策略,相當(dāng)于age!=null NOT_EMPTY 進(jìn)行非空判斷,主要是針對字符串類型,相當(dāng)于name != null and name != ‘' NEVER 從不更新,不管字段是否有值,都不進(jìn)行更新 DEFAULT 追隨全局配置
全局策略配置
在全局配置中,三者的默認(rèn)值都是FieldStrategy.NOT_NULL,即進(jìn)行空值判斷,不對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; }
在spring boot中可以通過配置屬性修改全局字段策略
mybatis-plus.global-config.db-config.update-strategy=not_null mybatis-plus.global-config.db-config.insert-strategy=not_null mybatis-plus.global-config.db-config.where-strategy=not_null
@TableField注解的源碼
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) public @interface TableField { String value() default ""; boolean exist() default true; String condition() default ""; String update() default ""; //插入策略 FieldStrategy insertStrategy() default FieldStrategy.DEFAULT; //更新策略 FieldStrategy updateStrategy() default FieldStrategy.DEFAULT; //where條件策略 FieldStrategy whereStrategy() default FieldStrategy.DEFAULT; FieldFill fill() default FieldFill.DEFAULT; boolean select() default true; boolean keepGlobalFormat() default false; String property() default ""; JdbcType jdbcType() default JdbcType.UNDEFINED; Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class; boolean javaType() default false; String numericScale() default ""; }
其中,insertStrategy、updateStrategy和whereStrategy的默認(rèn)策略都是FieldStrategy.DEFAULT,表示跟隨全局配置。
忽略判斷-IGNORED
@TableName(value ="user") @Data public class User implements Serializable { @TableId private Long id; private String name; private Integer age; @TableField(updateStrategy = FieldStrategy.IGNORED) private String email; }
從不處理-NEVER(標(biāo)識指定字段從來不更新)
@TableName(value ="user") @Data public class User implements Serializable { @TableId private Long id; private String name; private Integer age; @TableField(updateStrategy = FieldStrategy.NEVER) private String email; }
說明策略FieldStrategy.NEVER不但會忽略字段值的空值判斷,而且不管標(biāo)識的字段是否有值,都不會進(jìn)行更新操作。
字符不為空-NOT_EMPTY
- 策略FieldStrategy.NOT_EMPTY表示需要對字符串進(jìn)行空值判斷,只有非空字符串的字段才會參與數(shù)據(jù)處理。
- 相當(dāng)于mybatis的xml文件中的if判定條件判斷:name != null and name != ‘’
跟隨全局-DEFAULT
- 策略FieldStrategy.DEFAULT表示追隨全局配置的字段策略,這也是字段級別的默認(rèn)策略。
- 而全局的字段策略,默認(rèn)是FieldStrategy.NOT_NULL。
mybatis
mybatis 不會出現(xiàn)這個問題,因為在xml文件中有if標(biāo)簽判斷,如果不需要判斷刪除判斷即可
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Netty分布式pipeline管道Handler的刪除邏輯操作
這篇文章主要為大家介紹了Netty分布式pipeline管道Handler的刪除邏輯操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式
本文主要介紹了一招教你使用Java執(zhí)行g(shù)roovy腳本的兩種方式,一種是通過腳本引擎ScriptEngine提供的eval(String)方法執(zhí)行腳本內(nèi)容,一種是執(zhí)行g(shù)roovy腳本,感興趣的可以了解一下2023-09-09Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法實例分析
這篇文章主要介紹了Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法,結(jié)合實例形式分析了Java流程控制中判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下2020-04-04無感NullPointerException的值相等判斷方法
當(dāng)我們需要去判斷一個?入?yún)?查庫?返回的開關(guān)變量(通常是個Integer類型的)時,常常會寫如下的if-else判斷語句。但又會為在生產(chǎn)環(huán)境看到的「NullPointerException」感到困擾,遇到這個問題如何處理呢,下面小編通過本文給大家詳細(xì)講解,需要的朋友參考下吧2023-02-02出現(xiàn)java.lang.UnsupportedClassVersionError錯誤的原因以及解決方法
這篇文章主要給大家介紹了關(guān)于出現(xiàn)java.lang.UnsupportedClassVersionError錯誤的原因以及解決方法,文中通過圖文以及代碼示例將這個錯誤介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05