Mybatis-plus中更新date类型数据遇到的坑

在使用Mybatis-plus进行项目开发时,遇到更新包含date类型字段(如上市日期listingDate)为null的问题。当尝试更新为null时,Mybatis-plus可能因为空判断过滤掉该更新操作。解决方案包括在字段上添加注解避免空判断,或在配置文件中全局设置更新策略。选择前者可以避免因未全参数传递导致的数据错误。

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

最近一年的项目都是在使用Mybatis-plus,感觉挺好用的,也没遇到很多问题,但是在最近项目上线之后,遇到了一些新的需要,在进行新版本开发的时候就开始遇到坑了,今天来说一下更新数据中有date类型数据的时候会出现的问题。
实体类部分字段如下:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductPo implements Serializable {
	/**
     * 产品主键,自增
     */
    private Long prdId;
    /**
     * 名称
     */
    private String prdName;
    /**
     * 价格
     */
    private Bigdecimal prdPrice;
    /**
     * 上市日期
     */
    private LocalDate listingDate;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 修改时间
     */
    private LocalDateTime updateTime;
}

如果在更新的时候,将上市日期(listingDate)由之前的“2020-07-16”更新为null:

ProductPo po = ProductPo.builder.prdId(request.getPrdId).listingDate(null).updateTime(now(3)).build;

更新语句分为两种,第一种:

Integer rows = prdMapper.update(po, Wrappers.<ProductPo>lambdaUpdate().eq(ProductPo::getPrdId, request.getPrdId()));

第二种:

Integer rows = prdMapper.updateById(po);

这个时候你会发现,上市日期(listingDate)并没有被更新为空;有可能是因为在更新的时候,mybatis-plus将date类型为空的时候过滤掉了。
解决方法一:在字段上面加标签,不进行空判断过滤

    @TableField(strategy = FieldStrategy.IGNORED)
    private LocalDate listingDate;

解决方法二:在yml配置文件中进行全局配置

#mybatis-plus mapper包扫描地址
mybatis-plus:
  mapper-locations: classpath*:mapper/*/*.xml,classpath*:mapper/*.xml
  config-location: classpath:/mybatis-config.xml
  global-config:
    db-config:
      field-strategy: ignored

此处是对所有的操作都进行过滤,在官网上还有:insertStrategy,updateStrategy和selectStrategy,可以根据自己需要进行设置。
我个人还是选择了第一种解决方案,因为进行全局配置的时候,必须保证每次的传参都是全的,要不然会将数据置空或者没有将必填字段传值的时候会报错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值