MyBatis-Plus实现逻辑删除功能解析

 更新时间:2023年11月20日 08:59:37   作者:西瓜游侠  
这篇文章主要介绍了MyBatis-Plus实现逻辑删除功能解析,有时候并不需要真正的删除数据,而是想逻辑删除,方便数据恢复,MyBatis-Plus可以很方便的实现逻辑删除的功能,需要的朋友可以参考下

前言

有时候并不需要真正的删除数据,而是想逻辑删除,方便数据恢复。

MyBatis-Plus可以很方便的实现逻辑删除的功能。

Entity类

首先,数据库表添加一个表示逻辑删除的字段delete_flag:

CREATE TABLE `tb_user` (
  `id` bigint NOT NULL COMMENT '主键ID',
  `name` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',
  `create_time` timestamp NOT NULL COMMENT '创建时间',
  `update_time` timestamp NOT NULL COMMENT '更新时间',
  `delete_flag` tinyint(1) NOT NULL COMMENT '逻辑删除,0 - 未删除;-1 - 已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

对应的UserEntity实体类:

@Data
@TableName("tb_user")
public class UserEntity {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    private Integer deleteFlag;
}

配置

首先,需要在UserEntity实体类中的deleteFlag字段上进行注解配置:

@TableLogic(value = "0", delval = "-1")配置逻辑删除字段的值,value的值表示未删除的时候的值,delval的值表示已删除时候的值;

@TableField(value = "delete_flag", fill = FieldFill.INSERT)配置deleteFlag字段的自动填充规则。

@Data
@TableName("tb_user")
public class UserEntity {
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @TableLogic(value = "0", delval = "-1")
    @TableField(value = "delete_flag", fill = FieldFill.INSERT)
    private Integer deleteFlag;
}

可以配置deleteFlag在insert数据的时候,默认填充0:

/**
 * 自动填充字段值得配置
 */
@Component
public class AutoFillFieldValueConfig implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject, "deleteFlag", Integer.class, 0);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
    }
}

测试一下

下面来测试一下。

首先,添加一个新的用户:

    @Test
    public void testLogicDelete() {
        // 插入一个新的用户
        UserEntity newUser = new UserEntity();
        newUser.setId(11L);
        newUser.setName("Kevin");
        newUser.setAge(25);
        newUser.setEmail("kevin@163.com");
        userMapper.insert(newUser);
    }

控制台日志:

==>  Preparing: INSERT INTO tb_user ( id, name, age, email, create_time, update_time, delete_flag ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
==> Parameters: 11(Long), Kevin(String), 25(Integer), kevin@163.com(String), 2021-09-20 21:29:37.232(Timestamp), 2021-09-20 21:29:37.234(Timestamp), 0(Integer)
<==    Updates: 1

数据库数据:

在这里插入图片描述

可以看到,delete_flag默认填充了0。

下面,来测试一下逻辑删除(现在调用所有的删除方法,都是逻辑删除):

    @Test
    public void testLogicDelete() {
        // 插入一个新的用户
//        UserEntity newUser = new UserEntity();
//        newUser.setId(11L);
//        newUser.setName("Kevin");
//        newUser.setAge(25);
//        newUser.setEmail("kevin@163.com");
//        userMapper.insert(newUser);

        // 逻辑删除
        userMapper.deleteById(11L);
    }

控制台日志:

==>  Preparing: UPDATE tb_user SET delete_flag=-1 WHERE id=? AND delete_flag=0
==> Parameters: 11(Long)
<==    Updates: 1

可以看到,删除方法并没有执行DELETE语句,而是执行的UPDATE语句,更新了delete_flag字段的值。

数据库数据:

在这里插入图片描述

到此这篇关于MyBatis-Plus实现逻辑删除功能解析的文章就介绍到这了,更多相关MyBatis-Plus逻辑删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java编程中线程同步以及定时启动线程的方法

    详解Java编程中线程同步以及定时启动线程的方法

    这篇文章主要介绍了详解Java编程中线程同步以及定时启动线程的方法, 讲到了wait()与notify()方法以及阻塞队列等知识,需要的朋友可以参考下
    2016-01-01
  • arthas排查jvm中CPU占用过高问题解决

    arthas排查jvm中CPU占用过高问题解决

    这篇文章主要介绍了arthas排查jvm中CPU占用过高问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Spring Cloud Ribbon负载均衡器处理方法

    Spring Cloud Ribbon负载均衡器处理方法

    这篇文章主要介绍了Spring Cloud Ribbon负载均衡器处理方法,看看是如何获取服务实例,获取以后做了哪些处理,处理后又是如何选取服务实例的,需要的朋友可以参考下
    2018-02-02
  • Java使用POI库快速生成Word文档的方法详解

    Java使用POI库快速生成Word文档的方法详解

    这篇文章主要介绍了Java使用POI库快速生成Word文档的方法,Java POI库是一个开源的Java库,能够用来读写Microsoft Office格式的文件,尤其在处理文档和电子表格方面功能强大,需要的朋友可以参考下
    2025-10-10
  • SpringBoot开发中使用DTO层的方法示例

    SpringBoot开发中使用DTO层的方法示例

    DTO层是在应用程序的业务逻辑层和数据访问层之间引入的一个中间层,用于在不同层之间传输数据,本文主要介绍了SpringBoot开发中使用DTO层,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot基于Actuator远程关闭服务

    SpringBoot基于Actuator远程关闭服务

    这篇文章主要介绍了SpringBoot基于Actuator远程关闭服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot2.x使用POI实现导入数据到Excel

    SpringBoot2.x使用POI实现导入数据到Excel

    这篇文章主要为大家详细介绍了SpringBoot2.x如何使用POI实现导入数据到Excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • java数据结构与算法之快速排序详解

    java数据结构与算法之快速排序详解

    这篇文章主要介绍了java数据结构与算法之快速排序,结合实例形式详细分析了快速排序的原理、实现步骤、相关操作技巧与注意事项,需要的朋友可以参考下
    2017-05-05
  • Java基础-封装和继承

    Java基础-封装和继承

    这篇文章主要介绍了Java面向对象编程(封装/继承/多态)实例解析的相关内容,具有一定参考价值,需要的朋友可以了解下希望可以帮助到你
    2021-07-07
  • SpringBoot应用中PDF添加水印的五种实现方案对比

    SpringBoot应用中PDF添加水印的五种实现方案对比

    在 Spring Boot 应用中实现 PDF 添加水印,这篇文章为大家整理了五种常见方案及详细实现步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-08-08

最新评论