Mybatis-Plus系列---【解决null值字段不更新的问题】

解决null值字段不更新的问题

1.问题

我的MP版本是3.3.2,用Mybatis-Plus的updateById()来更新数据时,无法将字段设置为null值(更新后数据还是原来的值)。

2.分析

默认情况下,Mybatis-Plus在更新时会判断字段是否为null,如果是null,则不设值(不将这个字段拼接为SQL的SET语句)。

3.推荐的解决方案

updateById默认是不修改值为null的字段

update默认是修改值为null的字段,优点:可以用Wrappers构造指定按什么修改的修改条件,但缺点是按id修改时也得手动指定。

saveOrUpdate中的Update默认是修改值为null的字段的,优势:参数直接就是实体类本身,默认的修改条件就是根据id修改,不用再指定修改条件为id。如果是存在就更新,不存在就新增的场景建议用这个,因为这个的更新自带更新null值的字段。

建议用下面这种方案,不建议用全局设置的,或者在某个字段上加"@TableField(strategy = FieldStrategy.IGNORED)"注解的方案。

@Autowired
private UserService;
 
@ApiOperation("编辑")
@PostMapping("/update")
public void edit(Long id) {
  //构造需要修改的实体类 User user = new User(); user.setId(id); user.setName(null); userService.lambdaUpdate()
        //指定修改条件 .eq(User::getId, user.getId()) .update(user); }

//如果实体类字段少,也可以这样做
public boolean updateArticleById(Integer id) {
    Article article = Optional.ofNullable(articleMapper.selectById(id)).orElseThrow(RuntimeException:: new );

    boolean i =  articleService. lambdaUpdate()
      . set(Article::getOfflineTime, null );
       .set(Article::getContent, "try mybatis plus update null" );
       .set(Article::getPublishTime,LocalDateTime.now().plusHours( 8 ));
       .eq(Article::getId,article.getId())
       .update();
     return i ;
}

常见问题:

在使用Oracle数据库的时候,Mysql我没试,我遇到了一个问题:

Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: Invalid column type: 1111 

解决方案:

在yml文件中配置

mybatis-plus:
  configuration:
    jdbc-type-for-null: 'null'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值