MybatisPlus实现物理删除和逻辑删除(重点:逻辑删除)

首先看一下数据库中表的数据:



物理删除:

真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

1、根据 ID 删除记录

//根据ID删除记录(物理删除)
@Test
public void testDeleteById(){
    int result = userMapper.deleteById(1L);
    System.out.println(result);
}

运行,看数据库中 user 表中 id 为 1 的数据是否被删除

2、批量删除

//批量删除(物理删除)
@Test
public void testDeleteBatchIds() {
    int result = userMapper.deleteBatchIds(Arrays.asList(2,3));
    System.out.println(result);
}

运行,看数据库中 user 表中 id 为 2和3 的数据是否被删除


逻辑删除:

假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

 1、向表中添加逻辑删除的字段

ALTER TABLE `user` ADD COLUMN `deleted` boolean

此时表结构为: 

2、向对应的实体类中添加 deleted 属性,并且在该属性上添加 @TableLogic 注解

//deleted
@TableLogic//用于逻辑删除
@TableField(fill = FieldFill.INSERT)//添加这个注解是为了在后面设置初始值,不加也可以
private Integer deleted;

3、元对象处理器接口添加 deleted 的 insert 默认值

package cn.henu.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理
public class MyMetaObjectHandler implements MetaObjectHandler {
    //使用mp实现添加的操作,这个方法就会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);

        //设置版本号version的初始值为1
        //不加这个也可以,version的默认值为null,加了就是设置version的值从1开始
        this.setFieldValByName("version",1,metaObject);

        //添加deleted的初始值为0,也就是默认值
        this.setFieldValByName("deleted", 0, metaObject);
    }

    //使用mp实现修改的操作,这个方法就会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

4、配置逻辑删除插件

package cn.henu.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//表示将这个类作为配置类
//@MapperScan("cn.henu.mapper"):在启动时扫描Mapper接口,找到里面的内容
@MapperScan("cn.henu.mapper")
public class MpConfig {
    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    //分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }
}

5、在 application.properties 中添加一个配置(如果删除为1,不删除为0,这一步就可以不用配置)

#该配置表示删除时为1,不删除时为0
#也可以不配置这两行,因为默认就是删除为1,不删除为0
#如果设置删除为111,不删除为000等配置时,就要加上这两行配置
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

6、先添加一条数据,看其 deleted 字段的值是否为 0

@Test
void addUser3(){
    User user = new User();
    user.setName("tainqi");
    user.setAge(20);
    user.setEmail("tianqi@qq.com");

    int insert = userMapper.insert(user);
    System.out.println("insert:"+insert);
}

7、运行,可以看到数据库中新添加的数据的 deleted 字段的值为 0(将其他数据的deleted字段手动设置为0,标志为未删除状态)

8、使用上面物理删除的代码执行一下,将刚刚添加的数据删除

//根据ID删除记录(物理删除)
@Test
public void testDeleteById(){
    int result = userMapper.deleteById(1347539342478635010L);
    System.out.println(result);
}

9、运行,可以看到,虽然使用的是物理删除的代码,但是数据库中 id 为 1347539342478635010 的记录还存在,只是其 deleted 字段的值由 0 变为了 1,也就是由未删除状态变为删除状态。

10、再执行查询语句,看刚刚逻辑删除的数据能不能被查询出来

//查询User表所有数据
@Test
void findAll() {
    List<User> users = userMapper.selectList(null);
    System.out.println(users);
}

运行,看控制台的打印情况:

可以看到刚刚逻辑删除的那条数据已经查询不到了,但是它并没有真的被删除,只是其 deleted 字段的值由0变为了1

如果想要查询那条被逻辑删除的数据,就需要自己手动编写SQL语句查询,MybatisPlus没有实现这个查询功能。 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值