文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mybatis-plus设置某个字段值为null的方法总结

2024-04-02 19:55

关注

前提:

数据库表对应字段允许为null

使用Mybatis-plus操作数据库时,如果未自己写sql而是采用Mybatis-plus的方法设置sql的情况下,默认Mybatis-plus生成sql时会将设置为null的字段忽略掉(不更新该字段);所以默认情况下,使用Mybatis-plus的方法操作数据库时没办法设置一个字段的值为null(除非该字段数据库表设置默认值就为null)。

Mybatis-plus设计如此很好理解,比如现在我们的系统中一般都是做逻辑删除即修改删除标记的字段为删除状态的值,此时执行update语句时,一般根据id作为条件只设置删除标记字段的值就行,其他字段值不做设置也就是为null,如果Mybatis-plus也将这些字段进行更新的话,那么其他字段全是null,这样会造成数据丢失,问题很大;如果每个字段全部设置成之前的值,需要先进行一次查询操作,以及设置每个字段的值的操作,比较麻烦一些,很明显没有必要;所以Mybatis-plus默认忽略字段值为null的字段不做更新。

处理方法:

1、自己写sql

在mapper.xml中写对应的sql语句(insert语句/update语句/where条件中设置对应字段的值为null即可)

但是如果一张表的字段太多,仅仅只是某几个字段需要设置为null的话,简便处理方式可以采用下面的第二种和第四种(这两种使用不当有数据丢失风险,慎用)。

2、实体类对应字段添加注解

@TableField(insertStrategy = FieldStrategy.IGNORED)   添加该注解值的字段在Mybatis-plus生成insert sql时会忽略该字段值的判断
@TableField(updateStrategy = FieldStrategy.IGNORED)   添加该注解值的字段在Mybatis-plus生成update sql时会忽略该字段值的判断
@TableField(whereStrategy = FieldStrategy.IGNORED)    添加该注解值的字段在Mybatis-plus生成sql时的where条件中会忽略该字段值的判断
@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)   前面三个的聚合

加上该注解之后,Mybatis-plus会在对应的情况下生成sql时忽略掉该字段值的判断;即该字段值不论是什么都会生成在sql中,就可以设置字段值为null了;但是这个是针对该字段生效,如果有些地方的操作,忘记设置该字段的值因为这个注解的原因,那么可能就会导致更新后,该字段为的值null,所以这种方式不推荐,推荐使用第一种自己写sql和第三种Mybatis-plus 3.x提供的新方法。

说明 FieldStrategy 的可选值:

FieldStrategy.NOT_NULL:不为null则更新,也就是字段值为null则不生成到sql中不更新该字段,如果字段值为""(空字符串)也是会更新的
FieldStrategy.NOT_EMPTY:不为空则更新,也就是该字段值为null或为""(空字符串)都不会更新
FieldStrategy.DEFAULT:默认值,和全局配置保持一致,也就是和下面的第四种方式中的配置保持一致
FieldStrategy.IGNORED:忽略判断,该字段值不论是什么,都进行更新
FieldStrategy.NEVER:不做更新操作,该字段值不论是什么,都不进行更新

3、使用Mybatis-plus 3.x版本提供的新方法

UpdateWrapper<TestIdcardEntity> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("name",null);
updateWrapper.eq("id",id);
testIdcardService.update(updateWrapper);

4、Mybatis-plus 全局参数配置(yaml方式配置如下)

全局配置的值可选项和第二种方式 FieldStrategy 的可选项一致,全局配置默认值为 not_null

mybatis-plus:
  global-config:
    db-config:
      insert-strategy: ignored
      update-strategy: ignored
      select-strategy: ignored

这种方式和第二种一样可能会使用不当导致字段值为null,数据丢失;并且该方式是全局配置,对所有表的实体类所有字段都生效,危害会更严重;如果同时配置了第二种,那么优先第二种生效。

总结:

第二种和第四种使用不当会有数据丢失的风险不建议使用,第一种和第三种推荐使用。

补充:解决MyBatis-Plus 更新字段为null 不生效

1.异常说明:

​ mapper.updateById()时, set为null 未生效,其他字段更新

                periodRecordOriginal.setSettleTime(null);
                periodRecordOriginal.setActualSettleTime(null);
                periodRecordOriginal.setSettleStatus(0);
                int i = periodRecordMapper.updateById(periodRecordOriginal);

2.原理:

MyBatis-Plus对字段的验证策略导致的,MyBatis-Plus默认进⾏了不是全量更新的策略,默认忽略为null 的字段的

3.解决办法:

​ 1)修改MyBatis-Plus 全局默认策略

​ 缺点:这样做会对所有的字段都忽略判断,如果一些字段不想要修改,但是传值的时候没有传递过来,就会被更新为null

mybatis-plus:
  global-config:
      #字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
    field-strategy: 0

​ 2)修改实体类注解,改变字段的忽略判断

​ 缺点:需要注意数据库字段是否设置为 非null ,如果为非null 也更新不成功

@TableField( updateStrategy = FieldStrategy.IGNORED)
    private Date settleTime;

到此这篇关于Mybatis-plus设置某个字段值为null的文章就介绍到这了,更多相关Mybatis-plus设置字段值null内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯