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中的final关键字详细介绍

    Java中的final关键字详细介绍

    这篇文章主要介绍了Java中的final关键字,有需要的朋友可以参考一下
    2014-01-01
  • java的Arrays工具类实战

    java的Arrays工具类实战

    java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。Arrays作为一个工具类,能很好的操作数组。下面介绍主要使用的几个函数
    2016-12-12
  • java定义数组的三种类型总结

    java定义数组的三种类型总结

    下面小编就为大家带来一篇java定义数组的三种类型总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 一文彻底搞懂Java和JDK的版本命名问题

    一文彻底搞懂Java和JDK的版本命名问题

    今天通过本文给大家分享我对Java的版本号以及JDK的命名的了解,通过实例图文展示给大家介绍的非常详细,需要的朋友跟随小编一起看看吧
    2021-06-06
  • java9在interface中定义私有方法详解

    java9在interface中定义私有方法详解

    在本篇内容里小编给大家整理的是一篇关于java9在interface中定义私有方法,有兴趣的朋友们可以学习下。
    2020-10-10
  • Knife4j 3.0.3 整合SpringBoot 2.6.4的详细过程

    Knife4j 3.0.3 整合SpringBoot 2.6.4的详细过程

    本文要讲的是 Knife4j 3.0.3 整合SpringBoot 2.6.4,在SpringBoot 2.4以上的版本和之前的版本还是不一样的,这个也容易导致一些问题,本文就这两个版本的整合做一个实战介绍
    2022-09-09
  • SpringBoot实现快递物流查询功能(快递鸟)

    SpringBoot实现快递物流查询功能(快递鸟)

    本文将基于springboot2.4.0实现快递物流查询,物流信息的获取通过快递鸟第三方实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10
  • 11个值得借鉴的Java return写法分享

    11个值得借鉴的Java return写法分享

    return 这个关键字,相信大家每天都在用,它就像一把锤子,敲打着我们代码里的每一个出口,但扪心自问,我们真的把这把锤子用好了吗,下面小编就来和大家分享11个值得借鉴的Java return写法吧
    2025-04-04
  • 关于工厂方法模式的Java实现

    关于工厂方法模式的Java实现

    这篇文章主要介绍了关于工厂方法模式的Java实现讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring定时任务轮询本地数据库实现过程解析

    Spring定时任务轮询本地数据库实现过程解析

    这篇文章主要介绍了Spring定时任务轮询本地数据库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论