项目场景:
最近在做一个需求的时候需要把数据库中的某个字段设置为空
问题描述:
在代码中通过set方法对一个字段设置成null,发现并没有起作用
原因分析:
经过查询是因为mybatis-plus 默认的更新策略设置的问题,mybatis-plus中FieldStrategy 有三种策略:
- IGNORED:忽略。不管有没有有设置属性,所有的字段都会设置到insert语句中,如果没设置值会更新为null;
- NOT_NULL:非 NULL,默认策略。也就是忽略null的字段,不忽略"";
- NOT_EMPTY:非空。为null,为空串的忽略,就是如果设置值为null,"",不会插入数据库;
默认的是NOT_NULL
,也就是忽略null字段,所以更新不成功。
解决方案:
需对 FieldStrategy 策略进行调整,有如下三种方式:
方式一:调整全局的验证策略,如下:
mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml typeAliasesPackage: com.test.application.test.admin.entity global-config: #主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; id-type: 0 #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" field-strategy: 0 #驼峰下划线转换 db-column-underline: true #刷新mapper 调试神器 refresh-mapper: true #数据库大写下划线转换 #capital-mode: true configuration: map-underscore-to-camel-case: true cache-enabled: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
方式二:【推荐】调整字段验证注解
根据具体情况,在需要更新的字段中调整验证注解,如验证非空:
@TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED) private LocalDate birthday;
方式三:使用 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) );
参考: