MybatisPlus设置某个字段值为null

今日份鸡汤:失去的东西,其实从来未曾真正地属于你,也不必惋惜~

今天同事给反馈一个问题,更新一个数据没生效,查了一下发现,是update的时候,要给表中一个字段设置为null,我使用的是默认MybatisPlus生成的sql
前提:数据库表对应字段允许为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,数据丢失;并且该方式是全局配置,对所有表的实体类所有字段都生效,危害会更严重;如果同时配置了第二种,那么优先第二种生效。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容