Mybatis-Plus 全局Update更新策略,和insert插入查詢策略

前言

最近在使用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添加值,如果我們欄位是空字元串就會進行添加值操作,

我們也可以指定其他策略進行添加操作