前言

最近在使用mybatis-plus做專案的時候,發現使用updatById方法的時候,更新某個欄位時候出現了問題,一般業務操作都是更新不為空的欄位,結果發現更新了所有欄位,這是由於mybatis-plus全域性的更新策略導致的,我們可以通過相應全域性配置來解決



看官方文件可知,資料庫全域性配置策略有三種,分別是查詢策略,更新策略,和新增策略

點選這裡進入官方文件

全域性資料庫策略配置

  1. 配置
#全域性策略
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() {
}
}
  1. IGNORED 忽略判斷,所有欄位都進行更新和插入
  2. NOT_NULL只更新和插入非NULL值
  3. NOT_EMPTY 只更新和插入非NULL值且非空字串
  4. NEVER 永遠不進行更新和插入
  5. 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新增值,如果我們欄位是空字串就會進行新增值操作,

我們也可以指定其他策略進行新增操作