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
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
MybatisPlus中的删除操作分为物理删除逻辑删除物理删除是指将对应的数据从数据库中彻底删除,即该数据在数据库中将不再存在。而逻辑删除是指在数据库中将该数据的状态标记为已删除,但实际上数据仍然存在于数据库中,只是被标记为不可见。 对于MybatisPlus,逻辑删除需要在实体类中添加一个逻辑删除的属性,通常使用注解@TableLogic来标识该属性。在逻辑删除时,将该属性的值设置为一个表示已删除状态的值。 逻辑删除的好处是可以保留数据的完整性,而不会真正删除数据。这在一些需要保留历史记录或数据追溯的场景中非常有用。但需要注意的是,在进行查询操作时,需要过滤掉已被逻辑删除的数据,以确保查询结果的准确性。 物理删除则是直接从数据库删除数据,对应的数据将不再存在,无法进行任何恢复。物理删除在一些情况下可能会更加高效,但也会造成数据丢失的风险,需要谨慎使用。 总结来说,MybatisPlus中的物理删除将数据从数据库中彻底删除,而逻辑删除仅将数据的状态标记为已删除。选择哪种删除方式应根据具体的业务需求和数据保留策略来决定。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MybatisPlus中的删除逻辑删除及区别介绍](https://download.csdn.net/download/weixin_38696336/12821065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MyBatisPlus入门宝典(四)MyBatisPlus插件 & 逻辑删除](https://blog.csdn.net/weixin_44593822/article/details/127190880)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MybatisPlus实现物理删除逻辑删除重点逻辑删除)](https://blog.csdn.net/YyjYsj/article/details/112383993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值