MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇

news2024/10/3 20:29:27

历史文章(文章累计490+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

MyBatis-Plus通用Service快速实现赠三改查[MyBatis-Plus系列] - 第489篇

SpringBoot集成MyBatis-Plus + MyBatis-Plus代码生成器[MP系列] - 第490篇

MyBatis-Plus主键生成策略[MyBatis-Plus系列] - 第491篇

悟纤:师傅,你说有些时候,莫名其妙就会emo了,你说这是怎么一回事?

师傅:那是心里有什么事情想不明白了。

悟纤:那为什么问TA有什么事情没有?TA说没有。

师傅:有些时候,有些场景,有些话,在这个时候不适合说而已。

师傅:没有无缘无故emo的,也没有无缘无故的happy,所有的一切一切都是心里藏着事情,此时此刻无法想明白。

悟纤:那师傅要是自己好长时间想不明白,持续emo怎么办?

师傅:首先,需要认识自己的情绪。emo情绪包括忧愁、孤独、不安、沮丧等,当你感到这些情绪时,应该及时意识到并分析原因。可能是因为生活中的问题、工作上的压力、人际关系等问题导致的。了解自己的情绪,对于调整自己的心态非常重要。

师傅:寻找支持和安慰,当你感到心情低落时,不要独自承受,可以寻找支持和安慰。可以找家人、朋友或者专业心理咨询师聊天,倾诉自己的心声,分享自己的情绪。他们可以帮助你排解负面情绪,找到解决问题的方法。

师傅:寻找适合自己的发泄方式,当你感到愤怒、失落时,可以寻找适合自己的发泄方式。可以去健身房、跑步、听音乐、画画等方式释放负面情绪。找到适合自己的发泄方式,可以缓解自己的压力和情绪。

师傅:所有的事情都是心里过不了自己心里这一关。很多时候,让人感到痛苦的,并不是事情本身,而是你对这个事情的执念

悟纤:师傅,我要努力让自己开开心心的~,心情不好也不学会自己排解自己的情绪。

师傅:徒儿,加油~学习专业能力的同时,也需要提高自己的综合素质能力。

悟纤:徒儿明白了,我要开开心心的过好每天,强大自己~

导读

Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。

在实际的项目中,在删除数据的时候,我们并不想真正的把数据删除掉,而是修改一个状态中,不查询出来而已,这个就是逻辑删除。

在MP中要实现逻辑删除,非常easy,只需要简单的配置即可。接下来就带大家实践一下。

一、逻辑删除和物理删除

物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。如果在数据库中直接使用delete、drop删除了表数据,如果没有备份的话,数据就很难恢复了。

逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个deleted字段标示行记录是不是被删除,比如该数据有一个字段deleted,当其值为0表示未删除,值为1表示删除。那么逻辑删除就是将0变成1。在逻辑上是数据是被删除的,但数据本身是依然存在的。

两者的优劣:

物理删除一定程度上删除了“无用”的数据,降低了表的数据量,对性能肯定是有好处的;但是如果没有备份的话,数据很难恢复。也无法对历史数据进行数据分析。

逻辑删除恢复的话只要修改deleted等类似的状态标示字段就可以了,但是表的数据量肯定会比物理删除增加了,并且查询时经常要考虑到deleted字段,对索引都会有影响。

所以一张表的数据是否采用逻辑删除,还要根据数据的重要性数据量查询性能以及业务需求等因素综合判断。

二、逻辑删除实现

接下来看下使用MP逻辑删除的实现。

2.1 表添加字段

首先为需要逻辑删除的表增加一个deleted字段作为逻辑删除字段,并且设置其默认值为0,如下:

CREATE TABLE photo  (    `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键.',    `name` varchar(255) NULL COMMENT '名称',    `path` varchar(255) NULL COMMENT '地址',    `deleted` bit NULL DEFAULT 0 COMMENT '是否删除,0:未删除;1:删除',    PRIMARY KEY (`id`));

2.2字段上加上@TableLogic注解

给数据库表对应的实体类字段上加上@TableLogic注解:

/** * author:悟纤「公众号SpringBoot」 * date:2023/9/8 */@Datapublic class Photo {    @TableId(type = IdType.AUTO)    private Long id;//主键.    private String name;//名称    private String path;//地址.    @TableLogic //全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置)    private Boolean deleted;//是否删除,0:未删除;1:删除}

2.3 全局配置

全局配置该字段的各个状态的值:

#全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置@TableLogic)mybatis-plus.global-config.db-config.logic-delete-field=deleted#逻辑已删除值(默认为 1)mybatis-plus.global-config.db-config.logic-delete-value=1#逻辑未删除值(默认为 0)mybatis-plus.global-config.db-config.logic-not-delete-value=0

当然这个全局不配置的话,也可以通过注解@TableLogic进行配置:

@TableLogic(value = "0",delval = "1") private Boolean deleted;//是否删除,0:未删除;1:删除

但这个不好的地方,就是每个实体类都要进行配置,所以还是建议全局配置的方式。

2.4 定义Mapper

定义Photo的Mapper,这个就是正常编写即可:

public interface PhotoMapper extends BaseMapper<Photo> {}

2.5 测试

插入数据:

@Testpublic void testSave(){    Photo photo = new Photo();    photo.setName("初中的照片");    photo.setPath("/img/1.png");    photoMapper.insert(photo);}

说明:在插入数据的时候,这里并没有指定字段deleted,因为在建表的时候设置了默认值,所以默认值为0。

删除数据:

@Testpublic void testDelete(){    Photo photo = new Photo();    photo.setId(1L);    photoMapper.deleteById(photo);}

说明:这里执行MP的deleteById,但实际执行的SQL是update语句,修改了字段deleted的状态。

二次执行删除:

说明:当二次执行删除的时候,就修改失败了,因为这里在修改的时候,有一个条件deleted=0。

修改操作:

@Testpublic void testUpdate(){    Photo photo = new Photo();    photo.setId(1L);    photo.setName("高中的照片");    photoMapper.updateById(photo);}

说明:由于数据逻辑删除了,所以修改数据失败。

查询操作:

@Testpublic void testSelect(){    Photo photo = photoMapper.selectById(1);    System.out.println(photo);}

说明:由于数据逻辑删除了,所以无法查询到数据。

三、逻辑删除其它说明

对于数据的增删改查:

(1)插入: 不作限制。

(2)查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段。

(3)更新: 追加 where 条件防止更新到已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段。

(4)删除: 转变为 更新

字段类型支持说明:

(1)支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)

(2)如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()

其它说明:

(1)逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。

(2)如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。

小结

本小节带大家使用MP实现了逻辑删除,最后对于本文的重点做个小结:

(1)在MP中实现逻辑删除有两种方式:其一就是使用注解@TableLogic;其二就是在配置文件中全局配置(实际项目中推荐这种方式)。

(2)字段类型:支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)

 点赞、转发、评论,伸出你的双手666…

 你就是你,不一样的小蚂蚁!

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟纤学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

ShardingJDBC分库分表:http://t.cn/A6ZarrqS

分布式事务解决方案:http://t.cn/A6ZaBnIr

JVM内存模型调优实战:http://t.cn/A6wWMVqG

Spring入门到精通:https://t.cn/A6bFcDh4

大话设计模式之爱你:https://dwz.cn/wqO0MAy7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125179.html

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

相关文章

[Spring] SpringBoot2 简介(二)—— 高级配置

目录 一、Conditional 注解 1、SpringBoot 如何获取 Bean 对象 2、SpringBoot 创建 Condition 类 3、切换内置 web 服务器 二、EnableXXX 注解 1、SpringBoot 不能直接获取其他 jar 包/工程中的 Bean 2、原因分析 3、封装 Import 4、Import 注解 5、SpringBoot 自动配…

前端领域的插件式设计

插件&#xff0c;是一个常见的概念。 例如&#xff0c;当我们需要把我们前端代码中的 css 样式提取打包&#xff0c;我们可以用 webpack 的 mini-css-extract-plugin&#xff0c;或者你如果用 rollup 的话&#xff0c;可以选择 rollup-plugin-postcss。 再比如我们可以给 bab…

Python 数组和列表:创建、访问、添加和删除数组元素

Python 没有内置支持数组&#xff0c;但可以使用 Python 列表来代替。 数组 本页将向您展示如何使用列表作为数组&#xff0c;但要在 Python 中使用数组&#xff0c;您需要导入一个库&#xff0c;比如 NumPy 库。数组用于在一个变量中存储多个值&#xff1a; 示例&#xff0…

VSCode 开发 Vue 语法提示

一. 打开应用商店&#xff0c;搜索 vetur &#xff0c;选择第一个&#xff0c;点击安装。 二. 安装完成后&#xff0c;还可以下载 Vue Language Features 解决代码警告的问题。 最后重启 VSCode 就可以使用啦。另外输入 按回车键还可以自动生成 vue 代码格式哦。 原创作者&…

GPT-3 内幕机制可视化解析

GPT-3 内幕机制可视化解析 GPT-3是一个基于Transformer的语言模型,通过不同的层次提取语言不同层面的特性,构建整个语言的语义信息,它学习的过程跟人类正常学习的过程是类似的,开始的时候是一个无监督预训练,如图5-5所示,GPT-3模型可以将网络上的所有文档下载下来,包含 …

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

Sui提供dApp Kit 助力快速构建React Apps和dApps

近日&#xff0c;Mysten Labs推出了dApp Kit&#xff0c;这是一个全新的解决方案&#xff0c;可用于在Sui上开发React应用程序和去中心化应用程序&#xff08;dApps&#xff09;。mysten/dapp-kit是专门为React定制的全新SDK&#xff0c;旨在简化诸如连接钱包、签署交易和从RPC…

Python生成词云

成品&#xff1a; 代码&#xff1a; import os# 下面的两个包大家注意别导错了 from imageio.v2 import imread from wordcloud import wordcloud# mytext文本是字符串类型的 mytext str() # os.getcwd()是获得当前目录的路径&#xff0c;好像没啥用 读取 with open(os.getcw…

35岁运维工程师到底该何去何从?

你是否经常在网上看到类似的帖子&#xff1a; “运维35岁被裁”、“35岁运维找不到工作”&#xff0c;这样的字眼频频出现在新闻中。如何度过35岁职场危机呢&#xff0c;不妨看看这篇文章&#xff0c;或许对你有启发&#xff01; 一、35岁被称为运维半衰期&#xff0c;究竟为何…

性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…

【算法练习Day26】分发饼干摆动序列 最大子数组和

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 分发饼干摆动序列最大子数组…

金蝶云星空企业版v8.0内网穿透配置详解:实现便捷的异地远程访问

文章目录 前言1. 金蝶云星空企业版v8.0安装下载1.1 登录金蝶官网下载安装包1.2 常见的安装下载问题 2. 金蝶云星空配置SQL Sever数据库2.1 创建数据管理中心2.2 创建完成后在服务器登录管理站点 3. 下载安装注册cpolar3.1 公网访问测试 4. 固定连接公网地址 前言 金蝶云星空专注…

关于AES加密输出密文不为128位的倍数的原因

今天尝试用AES-256-OFB加密一个flag结果输出的密文是43字节&#xff0c;不是128位&#xff08;16字节&#xff09;的倍数&#xff0c;代码如下&#xff1a; import os from Crypto.Cipher import AES databflag{a7ba7128-3917-4551-8260-b3499e9dd7b12} aes AES.new(os.urand…

如何用Pytest做性能测试?5个步骤轻松学会!

Pytest其实也是可以做性能测试或者基准测试的。是非常方便的。 可以考虑使用Pytest-benchmark类库进行。 安装pytest-benchmark 首先&#xff0c;确保已经安装了pytest和pytest-benchmark插件。可以使用以下命令安装插件&#xff1a; pip install pytest pytest-benchmark …

Apollo生态系统探索:更多工具与框架的介绍

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

选择合适的软件管理视频制作排期

如果你是一名专业的视频创作者&#xff0c;那么你一定知道一个清晰、高效的项目管理对于视频制作的重要性。那么如何使用Zoho Projects项目管理软件来管理的视频制作项目&#xff0c;以便更好地规划和执行每一个细节呢&#xff1f; 这款项目管理软件具有丰富的自定义字段功能&a…

【Java集合类面试十三】、HashMap如何实现线程安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap如何实现线程安全…

【EtherCAT】二、下载并使用TwinCAT

下载并使用TwinCAT 引言介绍下载安装TwinCAT使用 更多精彩&#xff0c;欢迎关注 引言 TwinCAT是一款由德国Beckhoff Automation开发的工业自动化控制软件。它被广泛用于工厂自动化、过程控制、机器控制以及其他自动化领域。 而这里我们主要使用TwinCAT模拟ECAT主站。本文将介绍…

【蓝桥杯001】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

golang 工程组件:grpc-gateway 环境安装+默认网关测试

grpc-gateway grpc-gateway 顾名思义是专门是grpc的网关。也是一个protobuf的编译器&#xff0c;是一个proto的插件。 grpc-gateway就是将http请求处理后转发到对应grpc服务上。很多浏览器&#xff0c;或者客户端开箱不支持grpc&#xff0c;只支持传统的restful API。 grpc网关…