前言
最近在使用mybatis-plus做项目的时候,发现使用updatById方法的时候,更新某个字段时候出现了问题,一般业务操作都是更新不为空的字段,结果发现更新了所有字段,这是由于mybatis-plus全局的更新策略导致的,我们可以通过相应全局配置来解决
看官方文档可知,数据库全局配置策略有三种,分别是查询策略,更新策略,和添加策略
点击这里进入官方文档
全局数据库策略配置
- 配置
1#全局策略 2mybatis-plus.global-config.db-config.update-strategy=not_empty 3mybatis-plus.global-config.db-config.insert-strategy=not_empty 4mybatis-plus.global-config.db-config.select-strategy=not_empty
可选的配置值,看源码如下
1package com.baomidou.mybatisplus.annotation; 2 3public enum FieldStrategy { 4 IGNORED, 5 NOT_NULL, 6 NOT_EMPTY, 7 DEFAULT, 8 NEVER; 9 10 private FieldStrategy() { 11 } 12}
- IGNORED 忽略判断,所有字段都进行更新和插入
- NOT_NULL只更新和插入非NULL值
- NOT_EMPTY 只更新和插入非NULL值且非空字符串
- NEVER 永远不进行更新和插入
- DEFAULT 默认NOT_NULL
默认取值,看源码可知
1public static class DbConfig { 2 private IdType idType; 3 private String tablePrefix; 4 private String schema; 5 private String columnFormat; 6 private String propertyFormat; 7 private boolean tableUnderline; 8 private boolean capitalMode; 9 private IKeyGenerator keyGenerator; 10 private String logicDeleteField; 11 private String logicDeleteValue; 12 private String logicNotDeleteValue; 13 private FieldStrategy insertStrategy; 14 private FieldStrategy updateStrategy; 15 private FieldStrategy selectStrategy; 16 17 public DbConfig() { 18 this.idType = IdType.ASSIGN_ID; 19 this.tableUnderline = true; 20 this.capitalMode = false; 21 this.logicDeleteValue = "1"; 22 this.logicNotDeleteValue = "0"; 23 this.insertStrategy = FieldStrategy.NOT_NULL; 24 this.updateStrategy = FieldStrategy.NOT_NULL; 25 this.selectStrategy = FieldStrategy.NOT_NULL; 26 }
默认取值配置都是NOT_NULL
更新策略配置
也就是我们在使用updateById()方法时候,在没有指定更新策略时候使用默认策略,为NOT_NULL,
也就是说当对象字段是NULL的时候不会进行set更新,如果我们字段是空字符串就会进行set更新操作,
所以我们可以更改我们全局配置不为空not_empty时候才更新
mybatis-plus.global-config.db-config.update-strategy=not_empty
也可以在需要的字段中单独指定字段更新策略
1/** 2 * 用户类型 3 */ 4 @TableField(value = "ADMIN_TYPE_ID",updateStrategy = FieldStrategy.NOT_EMPTY) 5 private String userType;
或者可以使用UpdateWrapper方式替换updateById

添加策略
同理我们在进行inser或者save,方法时候,在没有指定更新策略时候使用默认策略,为NOT_NULL,
也就是说当对象字段是NULL的时候不会进行ins添加值,如果我们字段是空字符串就会进行添加值操作,
我们也可以指定其他策略进行添加操作
