详细讲解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.mzph.cn/news/612247.shtml

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

相关文章

借助Gitee将typora图片上传CSDN

概述 前面已经发了一个如何借助Github将typora上的图片上传到csdn上&#xff0c;但这有个缺陷&#xff1a;需要科学上网才能加速查看已经上传到github上的图片&#xff0c;否则就会出现已经上传的图片&#xff0c;无法正常查看的问题 如何解决&#xff1f; 那就可以使用Gite…

wpf的资源路径

1、手动命名空间 xmlns:share"clr-namespace:***;assembly**" 2、资源文件 Pack URI 编译到本地程序集内的资源文件的 pack URI 使用以下授权和路径&#xff1a; 授权&#xff1a;application:///。 路径&#xff1a;资源文件的名称&#xff0c;包括其相对于本地…

坑记(HttpInputMessage)

一、背景知识 public interface HttpInputMessage extends HttpMessage Represents an HTTP input message, consisting of headers and a readable body.Typically implemented by an HTTP request on the server-side, or a response on the client-side.Since: 3.0 Author:…

dotJS 2018 - Anders Hejlsberg - TypeScript: JavaScript的静态类型

如何为像JavaScript这样的动态语言定义和实现静态类型系统&#xff0c;为什么要这样做呢? Anders Hejlsberg探讨了TypeScript是如何产生的&#xff0c;它与经典类型系统有何不同&#xff0c;以及即使你不喜欢类型&#xff0c;它也能给你带来好处。 视频地址&#xff1a; http…

Web端3D渲染引擎HOOPS SDK助力打造创新型3D测量软件

HOOPS SDK是全球领先的3D领域开发工具提供商Tech Soft 3D 打造的控件产品&#xff0c;HOOPS SDK包括4款3D软件开发工具&#xff0c;其中HOOPS Exchange是一款CAD数据转换工具&#xff0c;可读取和导入30多种CAD文件格式&#xff1b;HOOPS Communicator是一款专注于Web端工程图形…

NPS配置https访问web管理页面

因为NPS默认也支持http的访问&#xff0c;所以在部署完后就一直没在意这个事情。 因为服务器是暴露在公网内的&#xff0c;所以还是要安全一点才行。不然一旦远控的机器被破解了就很危险了 一、使用nginx反向代理访问 1、首先在nps的配置文件里关闭使用https选项&#xff0c;…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

Retrofit2 + Hilt + MVVM + 协程 + Paging3 + SmartRefreshLayout 整合 使用

前言 Kotlin Android 框架 Jetpack相关库 MVVM 整合 使用。 1、Retrofit2 Hilt MVVM 2、Retrofit2 Hilt MVVM 协程 3、Retrofit2 Hilt MVVM 协程 Paging3 SmartRefreshLayout 效果图 源码地址 GitHub - LanSeLianMa/Retrofit2HiltMVVMCoroutine: Kotlin Andro…

jmeter监控服务器资源使用情况

GitHub - undera/perfmon-agent: Server metrics fetching agent, based on SIGAR 下载安装包&#xff1a;ServerAgent-2.2.3.zip 解压先 启动&#xff0c;如果是windows运行startAgent.bat&#xff0c;如果是linux运行startAgent.sh 注意&#xff1a;linux上注意权限的问题…

STM32蓝牙小车、红外循迹小车、超声波避障小车项目设计

一、前言 本文旨在分享我学习STM32的过程中&#xff0c;为了强化学习成果&#xff0c;试着制作一些实训项目。最开始做的就是STM32蓝牙小车、STM32红外循迹小车、STM32超声波避障小车。 相信看完本文的你&#xff0c;一定可以亲手制作一辆属于自己的智能小车&#xff01; 注&am…

03 - 系统调用

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. 系统调用基本概念1.1 一个系统调用的例子1.2 什么是系统调用&#xff1f;软件复用的角度 2. 软中断&#xff1a;系统调用的入口2.1 权限管理2.2 系统调用号2.4 man 2 syscall2.5 实验&am…

优化 ParamValidator,让编辑器Pycharm智能提示校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 基于 Valid…

基于JavaWeb+BS架构+SpringBoot+Vue基于web的多媒体素材管理系统的设计和实现

基于JavaWebBS架构SpringBootVue基于web的多媒体素材管理系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 绪 论 1 1.1选题背景与意义 1 1.1 研究背景 1 1.2 研究意义…

网络安全工具:通过监控分析日志数据保护企业网络

由于混合工作模式的兴起以及业务运营向云环境的迁移&#xff0c;企业网络变得更加分散和复杂&#xff0c;仅安装外围安全解决方案只会创建一个基本的防御层&#xff0c;系统、服务器和其他网络实体会生成记录所有网络活动的日志。集中式日志管理系统可以帮助管理员自动监控网络…

手机直连卫星及NTN简介

一、手机直连卫星的发展现状 近日&#xff0c;华为推出了支持北斗卫星短报文的Mate 50旗舰机、P60系列&#xff0c;苹果也跟Globalstar&#xff08;全球星&#xff09;合作推出了支持卫星求救的iPhone14&#xff0c;最亮眼的还是华为的。这几款产品揭开了卫星通信探索消费领域…

Spring MVC 参数传递和JSON数据处理

参数传递 ModelAndView传递 编写controller Controller RequestMapping("/account") public class AccountController { ​//也可以不创建ModelAndView&#xff0c;直接在参数中指定RequestMapping(value "/findAccount9")public ModelAndView findAccou…

美国证券交易委员会 X 账户被黑,引发比特币市场震荡

Bleeping Computer 网站消息&#xff0c;威胁攻击者成功“占领”了美国证券交易委员会的 X 账户&#xff0c;并发布一条关于批准比特币 ETF 在证券交易所上市的虚假公告。 帖子原文&#xff1a;今天&#xff0c;美国证券交易委员会批准比特币 ETF 在注册的国家证券交易所上市&a…

MySQL:索引失效场景总结

1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…

Map与JSONObject区别

相同点&#xff1a; 都可以存key-value&#xff1b;key是唯一的,如果key重复了会覆盖前面的 不同点&#xff1a; &#xff08;1&#xff09;JSONObject 不可以存空&#xff0c;Map可以存空。 &#xff08;2&#xff09;Map由jdk提供&#xff0c;JsonObject需要第三方jar包提供。…

XUbuntu22.04之快速复制绝对路径(二百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…