# MyBatis-Plus逻辑删除与自动填充字段的交互问题

问题描述

在使用MyBatis-Plus进行逻辑删除操作时,遇到了一个问题:执行 xxxService.removeById(id) 方法进行逻辑删除时,发现控制台打印的SQL语句没有自动填充 updateTimeupdateBy 字段。

配置与实体类定义

配置文件

mybatis-plus:
  configuration:
    call-setters-on-nulls: true
  mapper-locations: classpath:mapper/*.xml,classpath*:mapper/*/*.xml
  global-config:
    db-config:
      logic-delete-field: is_deleted
      logic-delete-value: 1
      logic-not-delete-value: 0

实体类定义

public class SomeEntity {
    // ...其他字段...

    @TableLogic
    private int isDeleted;

    @TableField(fill = FieldFill.UPDATE, jdbcType = JdbcType.VARCHAR)
    private String updateTime;

    @TableField(fill = FieldFill.UPDATE, jdbcType = JdbcType.VARCHAR)
    private String updateBy;
}

问题分析与解决方案

使用场景

MyBatis-Plus的逻辑删除功能(@TableLogic 注解)适用于简单的逻辑删除操作,即仅需要修改 isDeleted 字段的情况。在这种场景下,使用MyBatis-Plus自带的逻辑删除功能是合适的,因为它简化了代码并直接支持逻辑删除。

自动填充失效问题

当需要在逻辑删除时同时更新其他字段(例如 updateTimeupdateBy)时,直接使用实体类更新方法无法触发 isDeleted 字段的更新,只会单独更新自动填充的updateTimeupdateBy字段:

public DataResult delete(@RequestParam String id){
    SewagePipelines sewagePipelines = new SewagePipelines();
    sewagePipelines.setId(id);
    sewagePipelines.setIsDeleted(1);
    sewagePipelinesService.updateById(sewagePipelines);
    return DataResult.success();
}

推荐的解决方法

为了确保 isDeleted 以及 updateTimeupdateBy 字段同时被更新,推荐使用 UpdateWrapper 方法:

UpdateWrapper<SewagePipelines> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id)
             .set("is_deleted", 1)
             .set("update_time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
sewagePipelinesService.update(updateWrapper);

结论

在使用MyBatis-Plus进行逻辑删除时,如果仅修改 isDeleted 字段,则使用框架自带的逻辑删除功能是合适的。然而,如果需要在逻辑删除时更新其他字段(如 updateTimeupdateBy),则建议手工维护删除和查询(即删除代码改写为update语句,查询代码指定isDeleted=0),避免依赖于可能不触发的自动填充功能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值