详细讲解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.hqwc.cn/news/338717.html

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

相关文章

FineBI实战项目一(14):订单销售总额/总数分析开发

点击添加组件按钮&#xff0c;打开组件页面。 设置组件的属性&#xff0c;比如图标样式&#xff0c;指针值&#xff0c;目标值、颜色、大小、标签等。 点击下方切换到仪表盘。 点击仪表板中的左上方组件&#xff0c;添加组件到仪表盘。 编辑标题 第一个组件成功添加到仪表板。

高级分布式系统-第3讲 网络与网络互联

万维网的诞生 1957年10月4日&#xff0c; 苏联发射了人类第一颗人造卫星—斯普特尼克一号 美国政府震惊不已。 他们认为&#xff0c; 在日趋激烈的冷战对抗中&#xff0c; 自己已经全面落后于苏联。 为了扭转这一局面&#xff0c; 美国国防部很快于1958 年 2 月组建了一个神秘…

Magics 教程

文章目录 基本流程基本操作页面的介绍基本操作 基本流程 基本操作 页面的介绍 右侧是工具页&#xff0c;可以直接进行调整&#xff0c;也可以在选项&帮助->自定义用户界面 那里进行相关的调整 基本操作 直接拖动鼠标左键&#xff1a;选中物体鼠标右键&#xff1a; 长按…

解决JuPyter500:Internal Server Error问题

目录 一、问题描述 二、问题原因 三、解决方法 四、参考文章 一、问题描述 在启动Anaconda Prompt后&#xff0c;通过cd到项目文件夹启动Jupyter NoteBook点击.ipynb文件发生500报错。 二、问题原因 base环境下输入指令&#xff1a; jupyter --version 发现jupyter环境…

【数据库系统概论】期末复习2

系列文章 期末复习1 系列文章定义并理解下列术语&#xff0c;说明它们之间的联系与区别试述关系模型的完整性规则。在参照完整性中&#xff0c;什么情况下外码属性的值可以为空值&#xff1f;关系代数 定义并理解下列术语&#xff0c;说明它们之间的联系与区别 &#xff08;1…

设计模式篇章(3)——七种结构型模式

结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体&#xff0c;这个现在讲有点抽象&#xff0c;用大白话讲就是利用现有的对象进行组合或者配合&#xff0c;使得组合后的这个系统更加好。好是相对于不使用设计模式&#xff0c;按照自己的堆…

安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm

需要准备一个u盘&#xff0c;需要格式化&#xff0c;且内存不小于8g 1 下载ubuntu镜像 下载链接&#xff1a; https://cn.ubuntu.com/download/desktop 2下载rufus Rufus - 轻松创建 USB 启动盘Rufus: Create bootable USB drives the easy wayhttps://rufus.ie/zh/ 准备好这…

章鱼网络 2023 年全回顾|暨12月进展报告

2023年&#xff0c;章鱼网络轻装上阵&#xff0c;身处加密行业的低谷中砥砺前行。 12月17日&#xff0c;经过整整1年时间的开发和打磨&#xff0c;章鱼网络在重磅上线 Octopus 2.0&#xff0c;即 $NEAR Restaking 和 NEAR-IBC&#xff0c;获得了社区和市场的一致认可&#xff…

【论文综述】一篇关于GAN在计算机视觉邻域的综述

前言 这是一篇关于GAN在计算机视觉领域的综述。 正文 生成对抗网络是一种基于博弈论的生成模型&#xff0c;其中神经网络用于模拟数据分布。应用领域&#xff1a;语言生成、图像生成、图像到图像翻译、图像生成文本描述、视频生成。GAN模型能够复制数据分布并生成合成数据&a…

电子学会C/C++编程等级考试2023年09月(一级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:日期输出 给定两个整数,表示一个日期的月和日。请按照"MM-DD"的格式输出日期,即如果月和日不到2位时,填补0使得满足2位。 时间限制:10000 内存限制:65536 输入 2个整数m,d(0 < m <= 12, 0 < d <= 31)。…

React 基本使用

create-react-app 创建 react 项目的脚手架。 React 基本用法 jsx 语法 变量、表达式 import React from react;class JSXBaseDemo extends React.Component {constructor(props) {super(props);this.state {name: 章三};}render() {// 获取变量 插值const pElem <p&…

冲刺2024年AMC8模拟题:往年真题限时练一练和答案详解(4)

今天距离2024年AMC8正式比赛还有一周时间了&#xff0c;很多城市的中小学已经基本上放假了&#xff0c;所以参加AMC8竞赛的同学&#xff0c;可以在将更多的时间用在冲刺AMC8竞赛备考了&#xff0c;寒假作业的时间接下来几天可以少一点&#xff0c;AMC8结束后可以再多一点。 今…