MyBatis-Plus 逻辑删除

server/2024/9/24 14:27:26/

在开发中,逻辑删除是一种常见的需求。所谓逻辑删除,不是将数据从数据库中真正删除,而是通过标记(通常是某个字段,比如 deletedis_deleted)将数据标记为已删除。在查询数据时,会自动过滤掉标记为删除的数据,从而保证查询结果不包含这些“已删除”的数据。

MyBatis-Plus 提供了对逻辑删除的良好支持,开发者只需要做少量配置,就可以轻松实现逻辑删除功能。

一、MyBatis-Plus 逻辑删除的实现原理

MyBatis-Plus 的逻辑删除通过在表中添加一个标记字段(通常是 deleted 字段),该字段用于表示一条记录是否被逻辑删除。当执行删除操作时,MyBatis-Plus 并不会真正执行 DELETE SQL,而是执行 UPDATE 操作,将记录的逻辑删除标记字段修改为指定的删除状态值。

同样,在查询时,MyBatis-Plus 会自动添加过滤条件,忽略掉那些逻辑删除标记为已删除的数据。

典型流程

  • 插入数据时,逻辑删除字段的默认值为未删除(如 0)。
  • 删除数据时,执行 UPDATE 操作,将逻辑删除字段的值修改为已删除(如 1)。
  • 查询数据时,自动加上 WHERE deleted = 0 的条件,过滤已删除的记录。

二、配置 MyBatis-Plus 的逻辑删除

1. 数据库表结构设计

在数据库表中,添加一个字段来表示逻辑删除状态。通常使用 deleted 字段,值为 0 表示未删除,值为 1 表示已删除。

假设我们有一个 User 表,结构如下:

CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(50),deleted TINYINT(1) DEFAULT 0 COMMENT '逻辑删除字段,0未删除,1已删除'
);

在这个表中,deleted 字段用来标记记录是否已被逻辑删除。

2. 实体类配置

在实体类中,我们使用 MyBatis-Plus 提供的 @TableLogic 注解来标记逻辑删除字段。

java">package com.example.demo.model;import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;@Data
public class User {private Long id;private String name;private String email;@TableLogic // 标记为逻辑删除字段private Integer deleted;
}

通过 @TableLogic 注解,MyBatis-Plus 会自动识别 deleted 字段为逻辑删除字段。

3. 配置文件

application.yml 中,可以配置 MyBatis-Plus 的全局逻辑删除策略,但通常情况下不需要额外配置,MyBatis-Plus 会自动处理逻辑删除字段。

默认情况下,0 代表未删除,1 代表已删除。如果想自定义逻辑删除的值,可以在 application.yml 中进行配置:

mybatis-plus:global-config:db-config:logic-not-delete-value: 0  # 未删除值logic-delete-value: 1      # 已删除值
  • logic-not-delete-value:标识未删除的值,默认是 0
  • logic-delete-value:标识已删除的值,默认是 1
4. 使用逻辑删除

现在,我们已经完成了逻辑删除的配置,下面通过 MyBatis-Plus 的 CRUD 操作演示逻辑删除的使用。

插入数据
java">package com.example.demo;import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;// 添加新用户@PostMappingpublic String addUser(@RequestBody User user) {userService.save(user);return "用户添加成功";}
}

插入操作不会影响 deleted 字段的值,默认插入的数据 deleted 字段为 0

查询数据(过滤已删除记录)

MyBatis-Plus 会自动在查询中过滤掉已删除的记录,执行查询时,自动添加 WHERE deleted = 0 的条件。

java">// 查询所有未删除的用户
@GetMapping
public List<User> getAllUsers() {return userService.list();
}

执行查询操作时,MyBatis-Plus 会生成类似如下的 SQL:

SELECT * FROM users WHERE deleted = 0;
执行逻辑删除

使用 MyBatis-Plus 提供的 removeByIdremove 方法进行删除时,MyBatis-Plus 并不会执行物理删除,而是执行 UPDATE 操作,将 deleted 字段的值设置为 1

java">// 删除用户(逻辑删除)
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable Long id) {userService.removeById(id); // 逻辑删除return "用户删除成功";
}

执行逻辑删除时,MyBatis-Plus 会生成如下 SQL:

UPDATE users SET deleted = 1 WHERE id = ?;
恢复被逻辑删除的数据

MyBatis-Plus 不提供直接恢复逻辑删除的 API,但我们可以通过 update 方法手动将 deleted 字段的值改回 0,从而实现恢复已删除记录的功能。

java">// 恢复被逻辑删除的用户
@PutMapping("/restore/{id}")
public String restoreUser(@PathVariable Long id) {User user = new User();user.setId(id);user.setDeleted(0); // 设置为未删除状态userService.updateById(user);return "用户恢复成功";
}

三、注意事项

  1. 物理删除与逻辑删除的区别

    • 物理删除是直接从数据库中删除记录,而逻辑删除是通过修改字段标记的方式将记录标记为已删除,但数据仍然保留在数据库中。
    • 如果需要执行物理删除,可以直接使用 MyBatis-Plus 提供的 delete 方法,这将真正删除数据而不是更新 deleted 字段。
  2. 逻辑删除与查询

    • 逻辑删除的记录在正常的查询中是不会被返回的,MyBatis-Plus 会自动在查询中加入 WHERE deleted = 0 的条件。
    • 如果你想查询包含已删除数据的记录,则需要手动编写 SQL 查询,忽略逻辑删除字段的条件。
  3. 逻辑删除的 SQL 优化

    • 对于大数据表,建议为逻辑删除字段 deleted 加索引,以提升查询效率,避免因为全表扫描导致性能下降。
    • 逻辑删除字段应该是简单的数值类型(如 TINYINT),避免使用字符串等复杂类型,这样可以提升查询和更新的性能。
  4. 自动填充逻辑删除字段

    • 在一些复杂场景下,可以结合 MyBatis-Plus 的自动填充功能,在删除或恢复记录时自动更新 deleted 字段,避免手动操作。

四、MyBatis-Plus 逻辑删除的优势

  1. 简化开发:MyBatis-Plus 通过注解和全局配置实现了对逻辑删除的自动支持,开发者无需手动写逻辑删除的 SQL 语句。
  2. 降低风险:逻辑删除避免了物理删除带来的数据丢失风险,数据仍然保留在数据库中,可以根据需要恢复。
  3. 自动过滤已删除数据:MyBatis-Plus 会在查询时自动过滤掉已删除的数据,开发者无需额外判断。

五、总结

MyBatis-Plus 的逻辑删除功能通过简单的配置和注解就能实现。在使用过程中,MyBatis-Plus 会自动将删除操作转换为 UPDATE 操作,并在查询时过滤已删除的数据。通过这种方式,开发者可以很方便地实现逻辑删除的需求,并在需要时恢复数据。

在大多数企业级应用中,逻辑删除是一种非常重要的策略,它能够确保数据的可追溯性和安全性,而 MyBatis-Plus 通过简化配置和操作,极大地方便了开发者的工作。


http://www.ppmy.cn/server/121387.html

相关文章

荣耀手机AI搜索革新体验:一键总结归纳,让信息获取更高效

在信息爆炸的时代&#xff0c;我们每天都被海量的数据包围&#xff0c;如何快速、准确地获取所需信息成为了现代人的一大挑战。 近日&#xff0c;荣耀手机宣布其AI搜索功能正式上线&#xff0c;这一创新举措不仅为使用者带来了前所未有的便捷体验&#xff0c;更在智能手机领域…

配置win10开电脑时显示可登录账号策略

有1台公用的windows10电脑&#xff0c;电脑上有N多用户&#xff0c;使用人员登录时选择相应的账号登录即可。但在某次使用脚本加固后&#xff0c;发现之前显示的用户都不能显示了。检查加固脚本&#xff0c;是脚本启用了“交互式登录&#xff1a;不显示上次登录”策略。因此&am…

【数据结构与算法】LeetCode:哈希表

文章目录 哈希表一般查找 (键查找)两数之和 (Hot 100)两个数组的交集快乐数环形链表 &#xff08;Hot 100&#xff09;环形链表 II &#xff08;Hot 100&#xff09;和为 K 的子数组 (Hot 100) 计数查找 (值查找)有效的字母异位词字符串中的第一个唯一字符只出现一次的数字 (Ho…

创建基于jwt的token认证

创建基于jwt的token认证 创建方法 官网OAuth2 实现密码哈希与 Bearer JWT 令牌验证 - FastAPI (tiangolo.com) 我个人习惯下面这种方式 0.安装并且导入相关的库和模块 shellpip install pyjwt,python-jose[cryptography],jose配置密钥&#xff0c;加密方法&#xff0c;过期…

学生宿舍管理:Spring Boot技术实现

第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0c;尤其是规模较大的企业和学校等…

触发器对象

触发器是什么&#xff1f; 触发器&#xff08;Triggers&#xff09;是数据库中的一种特殊对象&#xff0c;它们会在某些数据库事件发生时自动执行。触发器的主要作用是对表的操作&#xff08;如INSERT、UPDATE、DELETE&#xff09;做出响应&#xff0c;并执行特定的操作。 触…

【LLM多模态】Animatediff文生视频大模型

note AnimateDiff框架&#xff1a;核心是一个可插拔的运动模块&#xff0c;它可以从真实世界视频中学习通用的运动先验&#xff0c;并与任何基于相同基础T2I的个性化模型集成&#xff0c;以生成动画。训练策略&#xff1a;AnimateDiff的训练包括三个阶段&#xff1a; 领域适配…

Android 如何使用jdk命令给应用/APK重新签名。

写在前面&#xff1a;本篇文章介绍Windows命令行中&#xff0c;如何使用jdk命令给已经签过名的apk重新签名。 使用工具&#xff1a;jarsigner。jarsigner是jdk自带的工具&#xff0c;签名之前确保Windows电脑中已安装jdk。我的环境如下&#xff1a;   后续操作步骤如下&…