# 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),避免依赖于可能不触发的自动填充功能。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis-Plus 是一个基于 MyBatis 的增强工具,提供了一些额外的功能和便利的配置。下面是一些常见的 MyBatis-Plus 配置: 1. 添加依赖:在项目的 `pom.xml` 文件中添加 MyBatis-Plus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>latest-version</version> </dependency> ``` 2. 配置数据源:在 Spring Boot 的配置文件(`application.properties` 或 `application.yml`)中配置数据源信息,例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/my_database username: root password: my_password driver-class-name: com.mysql.cj.jdbc.Driver ``` 3. 配置 MyBatis-Plus:创建一个配置类,用于配置 MyBatis-Plus 相关的配置项,例如: ```java @Configuration @MapperScan("com.example.mapper") // 指定 Mapper 类所在的包路径 public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } } ``` 4. 创建实体类和 Mapper 接口:创建与数据库表对应的实体类和对应的 Mapper 接口,使用 MyBatis-Plus 的注解进行配置。例如: ```java @Data @TableName("user") public class UserEntity { @TableId(type = IdType.AUTO) private Long id; private String username; private Integer age; // 省略 getter 和 setter } ``` ```java public interface UserMapper extends BaseMapper<UserEntity> { // 可以直接使用 MyBatis-Plus 提供的方法,也可以自定义 SQL 方法 } ``` 这些是 MyBatis-Plus 的基本配置,你还可以根据需求进行一些高级配置,例如分页插件、逻辑删除、多租户等。具体的配置和使用方法可以参考 MyBatis-Plus 的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值