MyBatis-Plus 逻辑删除的实现示例

 更新时间:2026年01月26日 10:58:54   作者:Vintanz  
逻辑删除通过标记字段实现数据“假删除”,既保障了数据安全,又简化了恢复操作,是核心业务数据的最佳删除方案,下面就来介绍一下MyBatis-Plus逻辑删除的实现,感兴趣的可以了解一下

在实际开发中,直接从数据库删除数据(物理删除)存在误操作后难以恢复的风险。MyBatis-Plus 提供的逻辑删除功能通过标记字段标识数据状态,既保留了数据完整性,又实现了“删除”效果。

一、逻辑删除核心概念

逻辑删除并非真正从数据库中删除数据,而是通过一个标记字段(如 deleted)记录数据状态:

  • 未删除:标记字段值为 0(默认);
  • 已删除:标记字段值为 1(默认)。

执行“删除”操作时,实际执行的是更新标记字段的 SQL;查询数据时,自动过滤已删除的记录。这种方式既避免了数据丢失,又不影响业务查询逻辑。

二、逻辑删除实现步骤

1. 数据库表添加标记字段

在需要支持逻辑删除的表中添加 deleted 字段(名称可自定义),类型为整数,默认值设为 0(未删除):

-- 以 student 表为例
ALTER TABLE student ADD COLUMN deleted INT DEFAULT 0 COMMENT '逻辑删除标记(0-未删,1-已删)';

2. 实体类配置标记字段

在实体类中添加 deleted 字段,并通过 @TableLogic 注解标记为逻辑删除字段:

@Data
public class Student {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    private String gender;
    
    // 逻辑删除标记字段
    @TableLogic
    private Integer deleted;
}

@TableLogic 注解的作用是:告诉 MyBatis-Plus 该字段用于逻辑删除,自动参与 SQL 拼接。

3. 全局配置逻辑删除参数

application.yml 中配置逻辑删除的字段名、未删除值和已删除值(默认值可省略):

mybatis-plus:
  global-config:
    db-config:
      # 逻辑删除字段名(与实体类字段一致)
      logic-delete-field: deleted
      # 逻辑未删除值(默认0)
      logic-not-delete-value: 0
      # 逻辑已删除值(默认1)
      logic-delete-value: 1

通过全局配置,所有实体类的逻辑删除字段将统一遵循此规则。

三、逻辑删除操作案例

配置完成后,原有的 CRUD 方法会自动适配逻辑删除规则:

1. 删除操作(实际执行更新)

调用 deleteById 等删除方法时,MyBatis-Plus 会自动生成更新标记字段的 SQL:

@Test
public void testDelete() {
    // 调用删除方法(实际执行:UPDATE student SET deleted=1 WHERE id=1 AND deleted=0)
    studentMapper.deleteById(1);
}

执行后,id=1 的记录 deleted 字段变为 1,而非从表中删除。

2. 查询操作(自动过滤已删除数据)

执行查询时,MyBatis-Plus 会自动在 SQL 中添加 deleted=0 条件,过滤已删除数据:

@Test
public void testSelect() {
    // 查询所有未删除数据(自动添加条件:WHERE deleted=0)
    List<Student> students = studentMapper.selectList(null);
    
    // 根据ID查询(自动添加条件:WHERE id=1 AND deleted=0)
    Student student = studentMapper.selectById(1); 
    // 若id=1的记录已被逻辑删除,返回null
}

3. 更新操作(仅更新未删除数据)

更新操作会自动添加 deleted=0 条件,避免更新已删除的记录:

@Test
public void testUpdate() {
    Student student = new Student();
    student.setId(1);
    student.setName("更新测试");
    
    // 执行更新(自动添加条件:WHERE id=1 AND deleted=0)
    studentMapper.updateById(student);
    // 若记录已被逻辑删除,更新无效果
}

四、逻辑删除与物理删除的区别

操作类型物理删除(默认)逻辑删除
执行SQLDELETE FROM 表 WHERE id=?UPDATE 表 SET deleted=1 WHERE id=? AND deleted=0
数据状态从表中永久移除保留在表中,deleted 字段标记为1
恢复难度需从备份恢复,难度大直接将 deleted 改回0即可恢复
适用场景临时数据、无备份需求核心业务数据、需保留历史记录

五、建议

  1. 字段类型选择:逻辑删除字段建议使用 INT 类型,默认值 0(未删除),避免使用 BIT 类型(部分数据库兼容性差)。
  2. 索引优化:在 deleted 字段上建立索引,提升查询时的条件过滤效率。
  3. 配合自动填充:结合 MyBatis-Plus 的自动填充功能,在插入数据时自动为 deleted 字段赋值 0(未删除):
    @TableField(fill = FieldFill.INSERT)
    @TableLogic
    private Integer deleted;
    
    然后在填充类中设置默认值:
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("deleted", 0, metaObject);
    }
    

总结

逻辑删除通过标记字段实现数据“假删除”,既保障了数据安全,又简化了恢复操作,是核心业务数据的最佳删除方案。MyBatis-Plus 通过 @TableLogic 注解和全局配置,自动适配 CRUD 方法的 SQL 生成,无需手动编写特殊逻辑。

到此这篇关于MyBatis-Plus 逻辑删除的实现示例的文章就介绍到这了,更多相关MyBatis-Plus 逻辑删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java使用MulticastSocket实现多点广播

    java使用MulticastSocket实现多点广播

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现多点广播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Java AQS的实现原理详解

    Java AQS的实现原理详解

    这篇文章主要借助了ReentrantLock来带大家搞清楚AQS的实现原理,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-04-04
  • 基于Spring AOP proxyTargetClass的行为表现总结

    基于Spring AOP proxyTargetClass的行为表现总结

    这篇文章主要介绍了Spring AOP proxyTargetClass的行为表现总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解Java 中的 AutoCloseable 接口

    详解Java 中的 AutoCloseable 接口

    本文对 try-with-resources 语法进行了较为深入的剖析,验证了其为一种语法糖,同时给出了其实际的实现方式的反编译结果,相信你在看完本文后,关于 AutoCloseable 的使用你会有新的收获。
    2020-11-11
  • Java中如何正确定义字符串

    Java中如何正确定义字符串

    这篇文章主要给大家介绍了关于Java中如何正确定义字符串的相关资料,在Java中定义一个字符串最简单的方法是用双引号把它包围起来,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • 详解SpringBoot下文件上传与下载的实现

    详解SpringBoot下文件上传与下载的实现

    这篇文章主要介绍了SpringBoot下文件上传与下载的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java开发中最让人头疼的十个bug

    Java开发中最让人头疼的十个bug

    这篇文章主要给大家总结介绍了关于Java开发中最让人头疼的十个bug,同样的bug信息,可能背后有千万种原因,而我,永远都不知道到底是哪一个,努力通过代码积累尽可能多的bug,并将它们进行分类,可以帮你debug节省了时间,需要的朋友可以参考下
    2021-10-10
  • Java 事务详解及简单应用实例

    Java 事务详解及简单应用实例

    这篇文章主要介绍了Java 事务详解及简单应用实例的相关资料,java事务能够保证数据的完整性和一致性,当然这是书本上的知识,具体如何应用这里举例说明,需要的朋友可以参考下
    2016-12-12
  • Java中实现在一个方法中调用另一个方法

    Java中实现在一个方法中调用另一个方法

    下面小编就为大家分享一篇Java中实现在一个方法中调用另一个方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 关于Mybatis和JDBC的使用及区别

    关于Mybatis和JDBC的使用及区别

    这篇文章主要介绍了关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论