Mybatis实现物理删除和逻辑删除。

教程目录:
教程一: Mybatis-plus使用教程
教程二:mybatis-plus的字段自动填充
教程三:Mybatis实现物理删除和逻辑删除
教程四:Mybatis-plus实现乐观锁
教程五:Mybatis-plus实现条件查询

扫码关注公众号,更多资料尽在掌握。
在这里插入图片描述

1.首先明白什么是物理删除,什么是逻辑删除?
什么是物理删除呢?就是直接干掉数据库的数据,无法再恢复回来。但在当今的企业级项目中,物理删除已经非常少见,而是使用逻辑删除。所谓逻辑删除本质上是个update操作,通过一个标记字段来识别某个数据是否被隐藏起来,但是对于用户来说看不到了自然以为就是删除了。
我们分别来看看mybatis-plus的物理删除和逻辑删除。

项目的创建就不详细说明了,我们直接再之前的表上操作。
我们先来看看物理删除,写一个删除方法吧!
物理删除方法有几种,我们来看看常用的:
第一种、deleteById()方法,仅需传入你要删除数据的id即可。注意看控制台,这里执行的是delete语句。真正实现物理删除,数据表中的信息不存在了。
在这里插入图片描述
第二种、deleteBatchIds方法,批量删除,也是传入id即可。
第三种、deleteByMap方法,条件删除。
这些方法都是物理删除,底层执行的是delete语句。在这里插入图片描述

逻辑删除:
所谓逻辑删除本质上是个update操作,通过一个标记字段来识别某个数据是否被隐藏起来,假设在表中设置一个deleted字段,已删除用1表示,未删除用0表示,这样以后在每次查询数据时候,都会添加一个条件 where deleted = 0,这样就永远不会查出delete= 1 的数据了。
接下来试试看吧!
第一步、打开数据表,添加一个deleted字段,用来表示逻辑删除位。
在这里插入图片描述

我们先看一下表中的数据,所有deleted都是0表示,代表所有数据都在。
在这里插入图片描述

第二步、接下来在实体类中,添加该字段,并加上注解@TableLogic,该注解就表示逻辑删除位。

import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.ID_WORKER)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    //create_time
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private  Date updateTime;
    @TableLogic
    private  Integer deleted;
}

在这里插入图片描述

第三步、我们需要写一个配置类来开启mybatis-plus的逻辑删除。
MybatisConfig.java

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisConfig {
    //逻辑删除
    @Bean
    public ISqlInjector iSqlInjector(){
        return new LogicSqlInjector();
    }

}

在这里插入图片描述

到这里逻辑删除配置成功,来测试一下吧。
我们用deleteById()方法测试。
在这里插入图片描述

我们来看看控制台的输出:

在这里插入图片描述

看到了吗,现在底层并不在执行delete了,而是执行update语句把delete字段改变下。这样就实现了逻辑删除,

我们再来看看数据表中数据。
在这里插入图片描述

这样逻辑删除就成功了。
这里你执行一下查询所有方法也不会查到该条数据,因为查询语句后面会跟一个 where delete = 0的条件!

项目源码:

github地址

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐