Mybatis-Plus更新對象時字段更新為空值的策略
測試提了個很突然的bug,將某些字段值置為 空/null,提交保存,再次查看還是保留原來的值,第一反應不應該,基本操作系統(tǒng)用的是mybatis-plus,要錯錯就早出錯的怎么會等到現(xiàn)在呢?奇怪了!發(fā)現(xiàn)了,就看看吧!
通過排查代碼是沒什么問題!
那就是肯能是mybatis-plus有什么特殊的地方
通過了解 com.baomidou.mybatisplus.annotation.TableField
//version 3.4.1
public @interface TableField {
? ?FieldStrategy insertStrategy() default FieldStrategy.DEFAULT;
? ?FieldStrategy updateStrategy() default FieldStrategy.DEFAULT;
? ?FieldStrategy whereStrategy() default FieldStrategy.DEFAULT;
? ?FieldFill fill() default FieldFill.DEFAULT;
}
有幾個默認執(zhí)行策略
FieldFill
值描述DEFAULT默認不處理INSERT插入時填充字段UPDATE更新時填充字段INSERT_UPDATE插入和更新時填充字段
FieldStrategy
值描述IGNORED忽略該字段,不管是插入還是更新操作,都不會涉及到該字段NOT_NULL當進行插入和更新操作時,如果該字段為 null
,則會拋出異常NOT_EMPTY當進行插入和更新操作時,如果該字段為 null
或者空字符串,則會拋出異常DEFAULT當進行插入操作時,如果該字段為 null
,則使用數(shù)據(jù)庫中的默認值(如數(shù)據(jù)庫字段設置了默認值);當進行更新操作時,如果該字段為 null
,則保持原有值不變NEVER永遠不處理該字段,無論是插入還是更新操作,都不會涉及到該字段
注意
3.1.2
版本后 strategy
方法被棄用,更新為 insertStrategy
、updateStrategy
和 whereStrategy
/** * 字段驗證策略 * <p>默認追隨全局配置</p> * * @deprecated 3.1.2 , to use {@link #insertStrategy} and {@link #updateStrategy} and {@link #whereStrategy} */ @Deprecated FieldStrategy strategy() default FieldStrategy.DEFAULT;
通過上面可以參照以下方案處理 mp 執(zhí)行更新操作空值的情況
方案一
單字段配置
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String nickName;
單個字段比較靈活,但需要制定的很多,一般結合默認配置使用
方案二
全局配置
# yml 配置:
mybatis-plus:
?global-config:
? ?db-config:
? ? ?update-strategy: IGNORED
全局性配置會對所有的字段都忽略判斷,如果有特殊字段處理,可以單獨配置,修改字段的策略。
方案三
UpdateWrapper (3.x)
/**
* 根據(jù) whereEntity 條件,更新記錄
*
* @param entity ? ? ? ?實體對象 (set 條件值,可以為 null)
* @param updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句)
*/
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
User user = new User("id", "")
mapper.update(
? Wrappers.<User>lambdaUpdate()
? ? ? ? ? .set(User::getNickName, user.getNickName())
? ? ? ? ? .eq(User::getId, user.getId())
);
跟新指定字段
一個小建議
@Tablefield 注解中有屬性:fill
正常情況下每一張表格都有幾個固定的值,如create_time (創(chuàng)建時間)和 update_time(更新時間),在處理這些數(shù)據(jù)的時候,每次都要手動去設置比較煩
就可以采取fill
自動填充
@TableField(value = "create_time",fill = FieldFill.INSERT)
private Date createTime;
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private Date updateTime;