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 中文件的读取File、以及相对路径的问题

    浅谈java 中文件的读取File、以及相对路径的问题

    今天小编就为大家分享一篇浅谈java 中文件的读取File、以及相对路径的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 浅谈java中的移动位运算:,>>>

    浅谈java中的移动位运算:,>>>

    这篇文章主要介绍了java中的移动位运算:,>>>文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot高级配置之临时属性、配置文件、日志、多环境配置详解

    SpringBoot高级配置之临时属性、配置文件、日志、多环境配置详解

    这篇文章主要介绍了SpringBoot高级配置之临时属性、配置文件、日志、多环境配置,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • SpringBoot+WebMagic+MyBaties实现爬虫和数据入库的示例

    SpringBoot+WebMagic+MyBaties实现爬虫和数据入库的示例

    WebMagic是一个开源爬虫框架,本项目通过在SpringBoot项目中使用WebMagic去抓取数据,最后使用MyBatis将数据入库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 如何实现Java监听器详解

    如何实现Java监听器详解

    今天带大家了解Java监听器是如何实现的及实现原理是什么,文中有非常详细的说明,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • IDEA2022 提示更新 TKK失败请检查网络连接的问题

    IDEA2022 提示更新 TKK失败请检查网络连接的问题

    这篇文章主要介绍了IDEA2022 提示:更新 TKK 失败,请检查网络连接,本文给大家分享解决方案,对idea2022提示更新TKK失败感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • 重写equals的同时为何要重写hashCode?

    重写equals的同时为何要重写hashCode?

    这篇文章主要给大家介绍了关于重写equals的同时为何要重写hashCode的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java中判断集合是否相等的几种方法详解

    Java中判断集合是否相等的几种方法详解

    这篇文章主要介绍了Java中判断集合是否相等的几种方法详解,在平时的开发中,可能会遇到需要判断两个集合是否相等的需求,那么本文就来详细讲解一下几种实现方法,需要的朋友可以参考下
    2023-08-08
  • Java线程的并发工具类实现原理解析

    Java线程的并发工具类实现原理解析

    本文给大家讲解Java线程的并发工具类的一些知识,通过适用场景分析大数据量统计类任务的实现原理和封装,多个示例代码讲解的非常详细,对java线程并发工具类相关知识感兴趣的朋友一起学习下吧
    2021-06-06
  • Java生成验证码

    Java生成验证码

    本文介绍了Java生成验证码的流程与方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02

最新评论