详细讲解MybatisPlus实现逻辑删除

news2025/1/12 1:44:01

目录

  • 前言
  • 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

    @TableLogic
    private 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 #默认deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
      id-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;
    // 其他字段...

    @TableLogic
    private 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> {
    // 这里可以自定义一些查询方法
}

核心测试功能如下

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

    @Test
    public 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);

    }

截图如下所示:

在这里插入图片描述

查看数据结果:

在这里插入图片描述


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

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

截图如下:

在这里插入图片描述

查看数据结果:

在这里插入图片描述

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

    @Test
    public 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.coloradmin.cn/o/1373256.html

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

相关文章

如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行、关键字断行等等内容格式整理

首先&#xff0c;需要用到的这个工具&#xff1a; 百度 密码&#xff1a;qwu2蓝奏云 密码&#xff1a;2r1z 打开工具&#xff0c;切换到“文章工作域”&#xff08;嗯...默认就是&#xff09; 找到这个&#xff0c;多内容断行分割 点击打开&#xff0c;出现如下窗口设置 相关的…

国产服务器 BIOS下组建RADI不同RAID卡-超详细

国产服务器 长城 组建Raid的方法 说明 大多数国产服务器通用型服务器进入BIOS的都是按DEL键。 9361RAID卡组建方法 在服务器启动过程中&#xff0c;按下DEL键进入BIOS界面。 进入设备管理器&#xff0c;选择AVAGO MegaRAID页签。 3. 进入RAID卡设备&#xff0c;选择Main Me…

软件测试|MySQL CROSS JOIN:交叉连接的详细解析

简介 在 MySQL 数据库中&#xff0c;CROSS JOIN 是一种用于生成两个或多个表的笛卡尔积的连接方法。CROSS JOIN 不需要任何连接条件&#xff0c;它将左表的每一行与右表的每一行进行组合&#xff0c;从而生成一个包含所有可能组合的结果集。本文将详细介绍 MySQL 中的 CROSS J…

Ubuntu 22.04.3 LTS arm64 aarch64 ISO jammy-desktop-arm64.iso 下载

Ubuntu 22.04.3 LTS (Jammy Jellyfish) Daily Build 参考 Are there official Ubuntu ARM / aarch64 desktop images? - Ask Ubuntu

Web组件的使用

文章目录 1 概述2 加载网页加载在线网页加载本地网页 3 网页缩放文本缩放 4 Web组件事件Web组件处理JS confirm事件 5 Web和JavaScript交互启用JavaScriptWeb组件调用JS方法JS调用Web组件方法 6 处理页面导航7 调试网络应用8 参考链接 1 概述 相信大家都遇到过这样的场景&…

强化学习求解TSP(六):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

最新版CleanMyMac X4.14.7智能清理mac磁盘垃圾工具

CleanMyMac X是一款专业的Mac清理软件&#xff0c;可智能清理mac磁盘垃圾和多余语言安装包&#xff0c;快速释放电脑内存&#xff0c;轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件&#xff0c;修复系统漏洞&#xff0c;一键扫描和优化Mac系统&#xff0c;…

竞赛保研 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …

MCU FT61F14x入门

目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断四、串口USART五、定时器六、ADC七、EEPROM 前言 FT61F14x是辉芒微电子的微控制器&#xff0c;是一…

【Python】AttributeError: module ‘torch.nn‘ has no attribute ‘HardSigmoid‘

AttributeError: module ‘torch.nn’ has no attribute ‘HardSigmoid’ 这个错误是因为PyTorch的torch.nn模块中并没有HardSigmoid这个函数。是拼写的大小写问题&#xff0c;换成nn.Hardsigmoid()即可。 如下述代码出错。 import torch import torch.nn as nn hard_sigmoid…

从0到1实现html文件转换为markdown文档(进度0.1)

Spider-Man 前言准备环境1、node.js2、git 执行指令顺序报错及其解决方案一、npm 错误&#xff01;可以在以下位置找到此运行的完整日志解决方案 二、没有修改权限解决方案&#xff1a; 注意事项总结 前言 当我们处理文档时&#xff0c;常常会遇到将HTML文档转换为Markdown文档…

Python-代码雨【附源码】

Python-代码雨 运行效果&#xff1a;实现的是动态的代码雨 import sys import random import pygame from pygame.locals import *# 屏幕大小 WIDTH 800 HEIGHT 600 # 下落速度范围 SPEED [15, 30] # 字母大小范围 SIZE [5, 30] # CODE长度范围 LEN [1, 8]# 随机生成一个…

国家发改委:《电能质量管理办法(暂行)》2024年4月1日起施行

中华人民共和国国家发展和改革委员会令 第8号 《电能质量管理办法(暂行)》已经2023年12月26日第7次委务会议审议通过,现予公布,自2024 年4月1日起施行。 主任 郑栅洁 2023年12月27日 电能质量管理办法&#xff08;暂行&#xff09; 第一章 总则 第一条 为加强电能质量管理&…

【GoLang入门教程】Go语言几种标准库介绍(六)

文章目录 前言几种库Net库 (网络库&#xff0c;支持 Socket、HTTP、邮件、RPC、SMTP 等)重要的子包和功能&#xff1a;示例 OS库&#xff08;操作系统平台不依赖平台操作封装&#xff09;主要功能&#xff1a;示例 path库(兼容各操作系统的路径操作实用函数)常用函数&#xff1…

中英双语8K向量大模型新鲜出炉,企业出海必备!

自从我们的 Embeddings V2 获得各界好评后&#xff0c;今日&#xff0c;我们推出了全新的中英双语文本向量大模型&#xff1a;jina-embeddings-v2-base-zh。此模型不仅继承了 V2 的全部优势&#xff0c;能够处理长达八千词元的文本&#xff0c;更能流畅应对中英文双语内容&…

Spring MVC 的RequestMapping注解

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以…

(详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models

Haoran Wei1∗, Lingyu Kong2∗, Jinyue Chen2, Liang Zhao1, Zheng Ge1†, Jinrong Yang3, Jianjian Sun1, Chunrui Han1, Xiangyu Zhang1 1MEGVII Technology 2University of Chinese Academy of Sciences 3Huazhong University of Science and Technology arXiv 2023.12.11 …

C语言初始化效率问题以及关键字解释

一、初始化效率 1、在静态变量的初始化中&#xff0c;我们可以把可执行程序文件想要初始化的值放在当程序执行时变量将会使用的位置。当可执行文件载入到内存时&#xff0c;这个已经保存了正确初始值的位置将赋值给那个变量&#xff0c;完成这个任务并不需要额外的时间&#xf…

Android 10.0 TvSettings系统设置wifi连接密码框点击Enter键失去焦点

1.前言 在10.0的box产品开发中,在TvSettings中,在wifi连接的时候,在用遥控器输入wifi密码框的时候,会发现在按遥控器Enter键的时候, 发现EditText焦点失去了,导致输入法消失了,为了解决这个问题就需要拦截Enter键保证正常输入wifi密码,接下来就来实现这个功能 如图: 2.…

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…