mybatis-plus @TableField策略

本文探讨了在使用Mybatis-Plus时,因同一实体类在不同业务中导致的问题。通过@TableField注解的updateStrategy属性,介绍了三种更新策略:ignored、not_null(默认)和not_empty,并提供了针对不同业务场景使用细分实体类的解决方案,以避免数据更新冲突。同时提到了DO、DTO和VO对象的区别,以及Mybatis-Plus策略的详细解析链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题产生的原因?
答:同一个实体类用在了两个业务当中,第一个业务是终端项目中的对工程开始和结束时间,数据从数据中心同步过来的时候,没有开始和结束时间为null,而业务中有开始和结束时间的值,可以通过前端展示和修改,由于每次更新会把开始时间和结束时间更新掉,就不符合业务了。
第二个业务是会定期从数据中心同步数据到项目中,由于更新用的是同一套实体类,所以对于已经存在项目中的数据更新,会把业务1中的数据更新为空。
2.如何解决的?
看了mybatis的官网,采用@TableField()字段的更新策略,

 @TableField(value = "name",updateStrategy = FieldStrategy.IGNORED)
    private String name;
    @TableField(updateStrategy = FieldStrategy.NOT_NULL)
    private String sex;
    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
    private String addr;

三种更新策略,如上
ignored 不管有没有有设置属性,所有的字段都会设置到insert语句中,如果没设置值,全为null,这种在update 操作中会有风险,把有值的更新为null ;
not_null,也是默认策略,也就是忽略null的字段,不忽略"";
not-empty 为null,为空串的忽略,就是如果设置值为null,“”,不会插入数据库。
这样给实体类的属性加上注解 @TableField(updateStrategy = FieldStrategy.NOT_EMPTY),每次同步数据的时候打开注解,就不会更新到为null的数据了,项目中在关闭注解。
3.虽然上面可以解决问题,但是需要频繁的操作,数据同步和项目中的使用,对于不知道原有的同事容易遗忘,不是个最好的解决方案。
所以采用了实体类的细分,两个实体类分别对应不同的业务,互不影响,项目中的实体类就是正常的实体类,修改成什么就是什么,同步数据的业务中实体类是not-empty为null和“”的时候不更新数据。
这也是用到了不同的实体类,do是数据库对象,dto是数据传输对象。这样两个业务互不干扰。
关于do,dto,vo的详细解释参考网站:
https://blog.youkuaiyun.com/uestcyms/article/details/80244407
https://www.cnblogs.com/jiading/articles/13384722.html
https://www.zhihu.com/question/39651928
mybatis-plus策略详解:
https://blog.youkuaiyun.com/zhangxingyu126/article/details/104843634

@TableFieldMyBatis-Plus框架中的注解,用于标识实体类中的字段与数据库表中的字段的映射关系。它提供了一些属性来控制字段的行为。 1. updateStrategy属性:用于控制在执行update操作时,是否将字段的值设置为NULL。默认情况下,updateStrategy属性的值为FieldStrategy.NOT_NULL,表示字段不能为空。如果想要将字段的值设置为NULL,可以将updateStrategy属性的值设置为FieldStrategy.IGNORED。例如: ```java @TableField(updateStrategy = FieldStrategy.IGNORED) private Integer disposalMode; ``` 2. insertStrategy属性:用于控制在执行insert操作时,是否将字段的值设置为NULL。默认情况下,insertStrategy属性的值为FieldStrategy.NOT_NULL,表示字段不能为空。如果想要将字段的值设置为NULL,可以将insertStrategy属性的值设置为FieldStrategy.IGNORED。例如: ```java @TableField(insertStrategy = FieldStrategy.IGNORED) private Integer disposalMode; ``` 3. exist属性:用于控制在执行insert操作时,是否需要将字段插入到数据库表中。默认情况下,exist属性的值为true,表示字段需要插入到数据库表中。如果不需要将字段插入到数据库表中,可以将exist属性的值设置为false。例如: ```java @TableField(exist = false) private Integer disposalMode; ``` 通过使用@TableField注解及其属性,可以灵活地控制实体类字段与数据库表字段的映射关系及其行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值