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

2023-10-24 04:04

本文主要是介绍MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

历史文章(文章累计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

这篇关于MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272566

相关文章

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoo WebFlux+MongoDB实现非阻塞API过程

《SpringBooWebFlux+MongoDB实现非阻塞API过程》本文介绍了如何使用SpringBootWebFlux和MongoDB实现非阻塞API,通过响应式编程提高系统的吞吐量和响应性能... 目录一、引言二、响应式编程基础2.1 响应式编程概念2.2 响应式编程的优势2.3 响应式编程相关技术

Mybatis对MySQL if 函数的不支持问题解读

《Mybatis对MySQLif函数的不支持问题解读》接手项目后,为了实现多租户功能,引入了Mybatis-plus,发现之前运行正常的SQL语句报错,原因是Mybatis不支持MySQL的if函... 目录MyBATis对mysql if 函数的不支持问题描述经过查询网上搜索资料找到原因解决方案总结Myb

C#实现将XML数据自动化地写入Excel文件

《C#实现将XML数据自动化地写入Excel文件》在现代企业级应用中,数据处理与报表生成是核心环节,本文将深入探讨如何利用C#和一款优秀的库,将XML数据自动化地写入Excel文件,有需要的小伙伴可以... 目录理解XML数据结构与Excel的对应关系引入高效工具:使用Spire.XLS for .NETC

Nginx更新SSL证书的实现步骤

《Nginx更新SSL证书的实现步骤》本文主要介绍了Nginx更新SSL证书的实现步骤,包括下载新证书、备份旧证书、配置新证书、验证配置及遇到问题时的解决方法,感兴趣的了解一下... 目录1 下载最新的SSL证书文件2 备份旧的SSL证书文件3 配置新证书4 验证配置5 遇到的http://www.cppc

Nginx之https证书配置实现

《Nginx之https证书配置实现》本文主要介绍了Nginx之https证书配置的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录背景介绍为什么不能部署在 IIS 或 NAT 设备上?具体实现证书获取nginx配置扩展结果验证