MyBatis-Plus 分页插件

在开发中,逻辑删除是一种常见的需求。所谓逻辑删除,不是将数据从数据库中真正删除,而是通过标记(通常是某个字段,比如 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 注解来标记逻辑删除字段。

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 操作演示逻辑删除的使用。

插入数据
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 的条件。

// 查询所有未删除的用户
@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

// 删除用户(逻辑删除)
@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,从而实现恢复已删除记录的功能。

// 恢复被逻辑删除的用户
@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.xdnf.cn/news/148478.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

win系统接入google_auth实现动态密码,加强保护

开源代码地址&#xff1a;windows动态密码: 针对win服务器进行的动态密码管控&#xff0c;需要配合谷歌的身份认证APP使用 (gitee.com) 为什么要搞个动态密码呢&#xff1f; 首先云服务器启用了远程访问&#xff0c;虽然更换了端口以及初始用户名&#xff0c;不过还是是不是被…

核心复现—计及需求响应的区域综合能源系统双层优化调度策略

目录 一、主要内容&#xff1a; 二、摘要介绍&#xff1a; 三、综合能源系统结构&#xff1a; 四、实际仿真运行结果&#xff1a; 五、 代码及数据下载&#xff1a; 一、主要内容&#xff1a; 在模型构建部分&#xff1a;建立了一个综合能源系统双层优化调度模型&#xf…

南京服务器测评【浪浪云】

前言 优质的服务器对于企业来说无疑是一把快速实现科技化成长的利剑。而南京&#xff0c;作为中国科技龙头之一的城市&#xff0c;也对服务器的需求愈发旺盛。而作为国内领先的云服务商&#xff0c;浪浪云致力于用科技培植企业的成长&#xff0c;其在南京的服务器便是企业数字化…

计算机毕业设计springboot+vue项目分享在线服务平台

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

0基础跟德姆(dom)一起学AI 数据处理和统计分析07-分组和会员数据分析

向量化函数及Lambda表达式 * 分组操作相关 * 分组聚合 * 分组转换 * 分组过滤 * DataFrameGroupBy对象介绍 * 会员分析案例-数据透视表 --- 1.向量化函数 * 分析代码 python def avg_test2(x,y): if x20: return np.NaN else: retu…

【OSS安全最佳实践】对OSS内身份证图片中身份证号进行脱敏

为确保存储在私有OSS Bucket特定文件夹中包含中国内地身份证信息的PNG、JPG、JPEG、BMP或WEBP格式图片&#xff0c;在与其他用户共享时身份证信息不被泄露&#xff0c;可使用数据安全中心 DSC&#xff08;Data Security Center&#xff09;的图片脱敏功能。DSC目前仅支持对身份…

react hooks--useRef

基本用法 在类组件中获取一个dom元素实例&#xff0c;可以通过React.CreateRef或者回调函数的方式去获取。语法&#xff1a;const refContainer useRef(initialValue);使用场景&#xff1a;在 React 中进行 DOM 操作时&#xff0c;用来获取 DOM作用&#xff1a;返回一个带有 …

构建高可用和高防御力的云服务架构第五部分:PolarDB(5/5)

引言 云计算与数据库服务 云计算作为一种革命性的技术&#xff0c;已经深刻改变了信息技术行业的面貌。它通过提供按需分配的计算资源&#xff0c;使得数据存储、处理和分析变得更加灵活和高效。在云计算的众多服务中&#xff0c;数据库服务扮演着核心角色。数据库服务不仅负…

【C++高阶】深入理解C++ I/O流:标准库中的隐藏宝石

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 特殊类 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ C IO流 &#x1f4d2;1. C语言的输入…

Stable Diffusion 优秀博客转载

初版论文地址&#xff1a;https://arxiv.org/pdf/2112.10752 主要流程图&#xff1a; Latent Diffusion Models&#xff08;LDMs&#xff09; DDPM是"Denoising Diffusion Probabilistic Models"的缩写&#xff0c; 去噪扩散概率模型 博客&#xff1a; 【论文阅读…

单发超快光场成像技术研究进展

摘要&#xff1a;单发超快光场成像技术能够在更广泛的条件下表征瞬态事件&#xff0c;为探索不可重复和难以再现的超快现象打开了大门&#xff0c;是探索未知领域必不可少的工具&#xff0c;具有巨大的科学技术应用价值。介绍近年来单发超快光场成像技术的研究进展&#xff0c;…

【Finetune】(三)、transformers之P-Tuning微调

文章目录 0、P-Tuning基本原理1、代码实战1.1、导包1.2、加载数据集1.3、数据集预处理1.4、创建模型1.5、P-tuning*1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、模型推理 0、P-Tuning基本原理 P-Tuning的基本思想是在prompt-tuning的基…

预付费计量系统实体模型

1. 预付费计量系统实体模型 A generic entity model for electricity payment metering systems is shown in Figure 2. Although it provides a limited perspective, it does serve to convey certain essential concepts. 关于电子式预付费电表系统的实体模型见图 2…

如何选购笔记本电脑?要看哪些参数?

如何选购笔记本电脑&#xff1f;要看哪些参数&#xff1f; 文章目录 如何选购笔记本电脑&#xff1f;要看哪些参数&#xff1f;1、CPU&#xff08;中央处理器&#xff09;2、GPU&#xff08;显卡&#xff09;3、RAM&#xff08;内存&#xff09;4、硬盘5、屏幕6、散热7、接口8、…

前端工程化4:从0到1构建完整的前端监控平台

前言 一套完整的前端监控系统的主要部分&#xff1a; 数据上报方式数据上送时机性能数据采集错误数据采集用户行为采集定制化指标监控sdk 监控的目的&#xff1a; 一、数据上报方式 本文的方案是&#xff0c;优先navigator.sendBeacon&#xff0c;降级使用1x1像素gif图片…

Java | Leetcode Java题解之第417题太平洋大西洋水流问题

题目&#xff1a; 题解&#xff1a; class Solution {static int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int[][] heights;int m, n;public List<List<Integer>> pacificAtlantic(int[][] heights) {this.heights heights;this.m heights.length;this.n…

[数据结构与算法·C++] 笔记 2.1 线性表

线性结构 概念 二元组 B ( K , R ) B(K,R) B(K,R) K a 0 , a 1 , . . . , a n − 1 K{a_0,a_1,...,a_{n-1}} Ka0​,a1​,...,an−1​ ( R r R{r} Rr) 有一个唯一的开始结点&#xff0c;它没有前驱&#xff0c;有一个唯一的直接后继一个唯一的终止结点&#xff0c;它有一个…

了解你的GPU:深入探讨AMD SMI

Getting to Know Your GPU: A Deep Dive into AMD SMI — ROCm Blogs 2024年9月17日 作者&#xff1a;Matt Elliott 对于使用AMD硬件的系统管理员和高级用户来说&#xff0c;性能优化和高效的资源监控至关重要。AMD系统管理界面命令行工具amd-smi正是为了解决这些需求而设计的。…

uni-app功能 1. 实现点击置顶,滚动吸顶2.swiper一个轮播显示一个半内容且实现无缝滚动3.穿透修改uni-ui的样式

uni-app项目中遇到的功能 文章目录 uni-app项目中遇到的功能一、实现点击置顶&#xff0c;滚动吸顶、1.1、scroll-view设置不生效的原因和解决办法1.2 功能代码 二、swiper一个轮播显示一个半内容且实现无缝滚动三、穿透修改uni-ui的样式 一、实现点击置顶&#xff0c;滚动吸顶…

基于STM32残疾人辅助行走系统

要么是家人陪伴&#xff0c;要么是类似导盲犬的动物辅助&#xff0c;家人还有事要做&#xff0c;不一定实时在场&#xff0c;而动物辅助也可能会出现新的问题&#xff0c;威胁残疾人身体安全。因此利用现代计算机技术、传感器检测设备和物联网技术设计这一款辅助残疾人行走的智…