详细讲解MybatisPlus实现逻辑删除

目录

  • 前言
  • 1. 基本知识
  • 2. 实战Demo
  • 3. 拓展

前言

对于MybatisPlus的相关知识可在我的博客进行搜索
对应的CRUD相关知识也可看我这篇文章:【Java项目】实战CRUD的功能整理(持续更新)

在讲述逻辑删除这个概念时,先引入另外一个概念,物理删除!!

逻辑删除和物理删除是两种不同的删除策略,各有其优劣势,选择取决于项目的需求和业务场景。

逻辑删除优势物理删除优势
1.数据保留完整性: 逻辑删除不会从数据库中移除数据,而是通过标记字段来表示数据的删除状态。这样做可以保留数据的完整性,使得可以在需要的时候进行数据恢复或审计。

2.历史数据追踪: 逻辑删除保留了被删除记录的历史状态,有助于追踪数据的变更历史。

3.避免误删: 逻辑删除可以防止意外的数据丢失,因为被删除的数据实际上并未真正删除。
1.节省存储空间: 物理删除直接从数据库中移除数据,可以减少数据库存储空间的占用。

2.查询性能: 由于物理删除会减少表中的数据量,一些查询操作可能更加高效。

3.选择逻辑删除还是物理删除通常取决于业务需求和对数据的处理方式。在需要保留数据完整性、历史追踪和防止误删的场景下,逻辑删除是一种更合适的选择。而在对存储空间和查询性能有较高要求的场景下,物理删除可能更合适。

直接设置一个列来代表删除与否,这其实就是逻辑删除的一种实现方式。

通过添加一个标记字段,可以更灵活地控制删除状态。物理删除和逻辑删除的选择取决于项目的具体需求和业务规范。

1. 基本知识

MyBatis Plus是一个基于MyBatis的增强工具库,它提供了一些方便的功能,包括逻辑删除。

在MyBatis Plus中实现逻辑删除通常涉及以下步骤:

  1. 实体类字段添加逻辑删除注解

在你的实体类中,你需要添加一个用于标识逻辑删除的字段,并使用@TableLogic注解进行标记。

import com.baomidou.mybatisplus.annotation.TableLogic;public class YourEntity {// other fields@TableLogicprivate Integer deleted;// getters and setters
}

这里的deleted字段是用于标识逻辑删除的字段,类型可以是int、Integer、short、Short、byte、Byte等。

  1. 配置逻辑删除的全局属性:
    在MyBatis Plus的配置文件中,需要配置逻辑删除的全局属性。
    application.ymlapplication.properties文件中添加如下配置:
mybatis-plus:global-config:db-config:logic-delete-value: 1   # 逻辑已删除值(默认为1)logic-not-delete-value: 0   # 逻辑未删除值(默认为0)

参数如下:

  • logic-delete-valuelogic-not-delete-value分别表示逻辑已删除和逻辑未删除的值。

本身全局配置还有另外一个默认字段值,也可使用这个默认字段值进行交互:

mybatis-plus:global-config:db-config:logic-delete-field: isDelete #默认deletedlogic-delete-value: 1logic-not-delete-value: 0id-type: auto
  1. 执行逻辑删除操作:
    在执行删除操作时,MyBatis Plus会自动将deleted字段的值设置为逻辑已删除值。
// 示例:使用MyBatis Plus的Service进行逻辑删除
yourEntityService.removeById(id);

在上述示例中,removeById方法执行后,会将对应id的实体的deleted字段设置为逻辑已删除值。

通过以上步骤,你就可以在MyBatis Plus中成功实现逻辑删除。

请注意,具体的配置和代码可能会根据你的项目结构和需求有所调整。

2. 实战Demo

设计一张表格如下:(由于个人实践总结,对于数据库名称以及实体类的名称还请注意驼峰原则)
在这里插入图片描述

为了照顾小白,对应的整体框架如下:

entity实体类:

package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("test_student")
public class student{@TableId(value = "id", type = IdType.AUTO)private int id;private String username;// 其他字段...@TableLogicprivate Integer deleteFlag;}

接口类:

package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.student;public interface StudentService extends IService<student> {// 这里可以自定义一些业务方法
}

接口实现类:

package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.student;
import com.example.demo.mapper.StudentMapper;
import com.example.demo.service.StudentService;
import org.springframework.stereotype.Service;@Service
public class StrudentServiceimpl extends ServiceImpl<StudentMapper, student> implements StudentService {// 这里可以实现自定义的业务方法
}

Mapper类:

package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.student;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface StudentMapper extends BaseMapper<student> {// 这里可以自定义一些查询方法
}

核心测试功能如下

对应的数据可以通过代码增加:

    @Testpublic void test1(){student student = new student();student.setId(1);student.setUsername("ceshi");student.setDeleteFlag(0);int insert = studentMapper.insert(student);System.out.println(insert);int id = student.getId();student = studentMapper.selectById(id);System.out.println(student);}

截图如下所示:

在这里插入图片描述

查看数据结果:

在这里插入图片描述


为了显示逻辑删除,对应代码如下:

    @Testpublic void test2(){QueryWrapper<student> wrapper = new QueryWrapper<student>();wrapper.eq("username","ceshi");int delete4 = studentMapper.delete(wrapper);// 删除了多少行System.out.println(delete4);}

截图如下:

在这里插入图片描述

查看数据结果:

在这里插入图片描述

为了验证查询的结果是否可行,再次增加一个查询的判断条件:

    @Testpublic void test3(){//根据querywrapper查询student student = studentMapper.selectOne(new QueryWrapper<student>().eq("username","ceshi"));System.out.println("根据querywrapper查询:");System.out.println(student);}

最终显示查询不到:

在这里插入图片描述

再次我们通过增加第二列的结果来判断是否只能查询到未被删除的列:(执行增加代码)

在这里插入图片描述

再次执行删除代码:

在这里插入图片描述

3. 拓展

对于MybatisPlus中如果Mapper或者IService中没有专门的Crud代码,对应在Mapper.xml的配置代码中需要增加一个删除条件的判断,类似如下代码:

以前是这样:

SELECT id,username,deleteFlag FROM student

现在是这样:

SELECT id,username,deleteFlag FROM student WHERE deleteFlag='0'

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

09.简单工厂模式与工厂方法模式

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动&#xff0c;我们在感慨SU7充满土豪气息的保时捷设计的同时&#xff0c;也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

2019年认证杯SPSSPRO杯数学建模B题(第一阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于方差分布的方法对未知语言文本中重复片段的自动搜索问题的研究 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但…

Phoenix基本使用

1、Phoenix简介 1.1 Phoenix定义 Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表&#xff0c;插入数据和查询HBase数据。 1.2 Phoenix特点 容易集成&#xff1a;如Spark&#xff0c;Hive&#xff0c;Pig&#xff0c;Flume和Map Reduce。性能…

golang并发安全-select

前面说了golang的channel&#xff0c; 今天我们看看golang select 是怎么实现的。 数据结构 type scase struct {c *hchan // chanelem unsafe.Pointer // 数据 } select 非默认的case 中都是处理channel 的 接受和发送&#xff0c;所有scase 结构体中c是用来存储…

C++模板——(4)C++泛型编程与标准模板库简介

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

海量数据处理数据结构之Hash与布隆过滤器

前言 随着网络和大数据时代的到来&#xff0c;我们如何从海量的数据中找到我们需要的数据就成为计算机技术中不可获取的一门技术&#xff0c;特别是近年来抖音&#xff0c;快手等热门短视频的兴起&#xff0c;我们如何设计算法来从大量的视频中获取当前最热门的视频信息呢&…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中&#xff0c;想要读取一个对象的“键—值”对&#xff08;值也是一个对象&#xff09;&#xff0c;数据格式如下&#xff1a; {1:{courseName: 课程1, study: 951526, visit: 3785553}&#xff0c;2:{courseName: 课程2, study: 181630, visit: 380830}&…

VCG 网格曲率计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Mesh曲率特征通常指的是在三维几何网格(Mesh)上计算的曲率相关的一系列特征,包括主曲率、高斯曲率、平均曲率等。这些曲率特征提供了对Mesh表面形状的详细描述,对于表面形状分析、形状比较和几何建模等领域非常…

【UML】第16篇 活动图

目录 一、什么是活动图 二、应用场景&#xff1a; 三、绘图符号的说明&#xff1a; 四、语法&#xff1a; 五、例图 六、建模的流程 6.1 对业务流程建模时 6.2 对用例进行活动图建模时 一、什么是活动图 活动图&#xff08;Activity Diagram&#xff09;是UML中用于描…

msckf-vio 跑Euroc数据集,并用evo进行评估

所需材料&#xff1a; Euroc数据集主页&#xff1a;https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码&#xff1a;https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码&#xff0c;可参考https://blog.csdn.ne…

网络安全复习--简答整理

-----------------------------------------------------教材如上图------------------------------------------------------------ 1.对称加密和非对称加密各有什么特点&#xff1f;加密解密过程中有什么区别&#xff1f;优点P38【考】 对称加密的特点&#xff1a;在针对同一…

JDBC多表联查

JDBC多表联查 在单一表进行查询时&#xff0c;只需要对表中的单个字段进行解析即可&#xff1b;例如下面代码&#xff1a; Overridepublic List<ClassBean> selectAllDao() {List list new ArrayList();try {String sql "select * from class";rs select(s…

Spring MVC 参数接收

参数接收 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换器…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域&#xff09;&#xff0c;LAN&#xff1a; Local Area NetworkWAN MAC&#xff0c; 用来连接上级网络&#xff0c; LAN MAC&#xff0c; 用于内部网路。 LAN & WAN 3.1&#xff0c;LAN表示子网&#xff0c;通过掩码来筛选子网内主机数量&…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

Vulnhub-VULNCMS: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、获取shell三、获取密码文件四、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0c;尽量的不饶弯路。具体有…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

邻接矩阵、可达性矩阵、完全关联矩阵、可达性矩阵的计算

邻接矩阵&#xff1a;很简单&#xff0c;就是两个点有关系就是1&#xff0c;没有关系就是0 可达性矩阵&#xff1a;非常简单&#xff0c;两点之间有路为1&#xff0c;没有路为0 可发行矩阵的计算&#xff1a;有n个元素&#xff0c;初始可达性矩阵为A&#xff0c;那么最终的矩阵…

K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用

最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…

使用numpy处理图片——滤镜

大纲 3维数组切分打平重组法深度切分法 3维数组堆叠 我们在用手机拍照片时&#xff0c;往往会对照片进行滤镜处理&#xff0c;从而让照片更加美观。本文我们将实现几种滤镜效果——去除所有像素中的某一种原色&#xff0c;形成只有红绿、红蓝和绿蓝原色的照片。 为了突出色彩丰…