前言
最近在使用mybatis-plus
做專案的時候,發現使用updatById
方法的時候,更新某個欄位時候出現了問題,一般業務操作都是更新不為空的欄位,結果發現更新了所有欄位,這是由於mybatis-plus全域性的更新策略導致的,我們可以通過相應全域性配置來解決
看官方文件可知,資料庫全域性配置策略有三種,分別是查詢策略,更新策略,和新增策略
點選這裡進入官方文件
全域性資料庫策略配置
- 配置
#全域性策略
mybatis-plus.global-config.db-config.update-strategy=not_empty
mybatis-plus.global-config.db-config.insert-strategy=not_empty
mybatis-plus.global-config.db-config.select-strategy=not_empty
可選的配置值,看原始碼如下
package com.baomidou.mybatisplus.annotation;
public enum FieldStrategy {
IGNORED,
NOT_NULL,
NOT_EMPTY,
DEFAULT,
NEVER;
private FieldStrategy() {
}
}
- IGNORED 忽略判斷,所有欄位都進行更新和插入
- NOT_NULL只更新和插入非NULL值
- NOT_EMPTY 只更新和插入非NULL值且非空字串
- NEVER 永遠不進行更新和插入
- DEFAULT 預設NOT_NULL
預設取值,看原始碼可知
public static class DbConfig {
private IdType idType;
private String tablePrefix;
private String schema;
private String columnFormat;
private String propertyFormat;
private boolean tableUnderline;
private boolean capitalMode;
private IKeyGenerator keyGenerator;
private String logicDeleteField;
private String logicDeleteValue;
private String logicNotDeleteValue;
private FieldStrategy insertStrategy;
private FieldStrategy updateStrategy;
private FieldStrategy selectStrategy;
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.selectStrategy = FieldStrategy.NOT_NULL;
}
預設取值配置都是NOT_NULL
更新策略配置
也就是我們在使用updateById()
方法時候,在沒有指定更新策略時候使用預設策略,為NOT_NULL
,
也就是說當物件欄位是NULL
的時候不會進行set更新,如果我們欄位是空字串就會進行set更新操作,
所以我們可以更改我們全域性配置不為空not_empty
時候才更新
mybatis-plus.global-config.db-config.update-strategy=not_empty
也可以在需要的欄位中單獨指定欄位更新策略
/**
* 使用者型別
*/
@TableField(value = "ADMIN_TYPE_ID",updateStrategy = FieldStrategy.NOT_EMPTY)
private String userType;
或者可以使用UpdateWrapper
方式替換updateById
新增策略
同理我們在進行inser
或者save
,方法時候,在沒有指定更新策略時候使用預設策略,為NOT_NULL
,
也就是說當物件欄位是NULL
的時候不會進行ins新增值,如果我們欄位是空字串就會進行新增值操作,
我們也可以指定其他策略進行新增操作