mybatis-plus插入或更新时空值不操作
问题描述:
mybatis-plus插入或更新时,如果传过来空字符串(“”),mybatis-plus也会将其当作数值插入到数据库中,此时数据库中该字段的值就是“”,而不是NULL,当该字段是唯一值但又不是必须值时,下次再插入一个空值就会报错(提示重复值,无法插入),而且它的空值也会写入sql中,影响性能。
如何解决这个问题?
就是要更改字段插入或更新的策略,可以在配置文件中全局设置,也可以在实体类(只能是在实体类,不能在VO或其他类中设置)中单独设置,具体如下:
mybatis-plus插入或更新的字段有空字符串或者null
FieldStrategy 有三种策略:
- IGNORED:忽略 (不插入该字段)
- NOT_NULL:非 NULL,默认策略(无法判断空字符串"")
- NOT_EMPTY:非空(空字符串""也可判断)
- 还有两种是: DEFAULT(默认就是NOT_NULL)、NEVER(从不)
当用户有更新字段为 空字符串 或者 null 的需求时,需要对 FieldStrategy 策略进行调整:
方式一:调整全局的验证策略
注入配置 GlobalConfiguration 属性 fieldStrategy
mybatis-plus:
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
field-strategy: 0
新版看如下设置:
mybatis-plus:
global-config:
db-config:
id-type: auto #设置主键自增
# not_empty、not_null、default、ignored、never
insert-strategy: not_empty #插入策略
update-strategy: not_empty #更新策略
方式二:调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(strategy=FieldStrategy.NOT_EMPTY)
新版如下:
一定是在实体类中设置
@Data
@TableName("users")
@ApiModel(value="UsersEntity对象", description="用户表")
public class UsersEntity implements Serializable {
/**
* insertStrategy 是插入策略,updateStrategy是更新策略;NOT_EMPTY非空,可以检查空字符串""
*/
@TableField(insertStrategy = FieldStrategy.NOT_EMPTY,updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "手机")
private String phone;
}
方式三:使用 UpdateWrapper (3.x)
使用以下方法来进行更新或插入操作:
注:(暂未经过实际测试,自己摸索)
//updateAllColumnById(entity) // 全部字段更新: 3.0已经移除
mapper.update(
new User().setName("mp").setAge(3),
Wrappers.<User>lambdaUpdate()
.set(User::getEmail, null) //把email设置成null
.eq(User::getId, 2)
);
//也可以参考下面这种写法
mapper.update(
null,
Wrappers.<User>lambdaUpdate()
.set(User::getAge, 3)
.set(User::getName, "mp")
.set(User::getEmail, null) //把email设置成null
.eq(User::getId, 2)
);