前言
最近在项目中遇到一个问题,就是在实体MyBatis Plus updateById(xxx)的时候,如果将某个字段设置为null,是更新不了字符串为null的, 本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决。
MyBatis Plus更新策略
在实际项目中,我们再很多场景下需要将某些字段设置更新为null, 但是当你使用updateById()方法的时候,会发现根本不生效。这其实是MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进行了不是全量更新的策略:
mybatis-plus:
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 1
这个字段验证策略默认是1, 即NOT NULL,更新的时候做了null判断,默认不更新为null的传参。
field-strategy字段更新插入策略属性说明:
IGNORED(0): "忽略判断", 所有字段都更新和插入
NOT_NULL(1): "非 NULL 判断", 只更新和插入非NULL值
NOT_EMPTY(2): "非空判断", 只更新和插入非NULL值且非空字符串
DEFAULT:默认NOT_NULL
解决方法
第一种方法:全局配置方式
在MyBatis-Plus配置文件中修改field-strategy字段验证的值为0,即忽略判断(null值或非null值都更新)。
#mybatis plus 设置
mybatis-plus:
mapper-locations: classpath*:org/jeecg/modules/**/xml/*Mapper.xml
global-config:
# 关闭MP3.0自带的banner
banner: false
# 字段更新策略0:"忽略判断",1:"非NULL判断",2:"非空判断"
field_strategy: 0
db-config:
#主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)";
id-type: ASSIGN_ID
# 默认数据库表下划线命名
table-underline: true
logic-delete-field: deleted # 全局逻辑删除的实体字段名
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
configuration:
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 返回类型为Map,显示null对应的字段
call-setters-on-nulls: true
第二种方法:在需要设置的字段指定对应的更新策略
这样就可以成功更新为null或者空字符串''的值了~