mybatisplus逻辑删除基本实现和坑点解决
作者:你懂的哈 发布时间:2021-05-24 11:35:50
当你在使用Mybatis 时进行配置的时候有这样几个坑一定要注意下。
mybatisplus中逻辑删除通俗说为了在数据库中保留数据,但是又不想进行其他一些sql语句时有他(刚刚通过逻辑删除了的)的存在。
就是在数据库中添加一字段,通过数值内容来说明那些是指删除了的即可
mp逻辑删除的基本实现
步骤一(添加数据库对应字段)
首先数据库中添加对应字段(此处通过deleted字段代表逻辑删除字段,即0为未被删除,1为已删除)
步骤二(逻辑删除的实现)
1.方法一(单表注解设置)
在数据表对象层中对应对类的对应字段中通过注解实现(@TableLogic(),这里value和delval就是mp给我们定义的是否删除的标记,数值由开发者设定)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private Long id;
private String type;
private String name;
private String description;
//逻辑删除(就是在delete字段做标记,不是真正意义上的删除)
@TableLogic(value = "0",delval = "1")
private Integer deleted;
}
2.方法二(全局配置文件设置)
通过配置实现。这样实现的就比较全局,没有指定那个指定数据表对象层中对应对类的对应字段实现逻辑删除这个功能,只要拥有全局设置一样的字段即可。
(这使用springboot框架的application.yml配置为例,其中logic-delete-field是指要指定字段名,logic-delete-value:是删除后设置成的值,logic-not-delete-value是未删除的值是什么)
# mp日志
mybatis-plus:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
步骤三(测试)
在测试类中测试并查看数据库对应表的对应测试数据有什么变化。
在此测试中发现,数据库表对应的数据并没有真正意义上的删除,只是在对应字段做好了设定好的标记。
而且在其他mp操作此表时并没有这条数据的参与,即实现开发者想删除某条数据,但又想数据库能保留这个数据记录。
1.测试类进行逻辑删除测试代码
这是通过id实现逻辑删除
@Autowired
private BookDao bookDao;
@Test
public void deleteById(){
int i = bookDao.deleteById(12L);
System.out.println("影响行数为:"+i+"条");
}
2.删除后数据表对应数据变化
id为12数据对应的deleted已经变成了1
3.测试其他mp操作是否有对标记删除了的数据有“参与”
此处是对上面操作完成后进行的mp操作(查询表中所有数据所有)
@Autowired
private BookDao bookDao;
@Test
void findAll() {
List<Book> books = bookDao.selectList(null);
for (Book book :books) {
System.out.println(book);
}
}
结果如下(显然,id为12的数据并没有查询出来,但是数据库还是存在此条数据。)
mp逻辑删除不生效
我这总结了几个可能遇到的一些仅仅关于mp逻辑删除本身可能出现的问题解决参考(排除一些其他因素,单纯讲讲mp逻辑删除本身的坑点)
坑点一
报错点: Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘deleted’ in ‘where clause’
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column ‘deleted’ in ‘where clause’:
原因解释就跳过了,解决方法其实就是只要把设定的删除字段设置为“deleted”即可(也多注意逻辑删除需要添加的数据库字段得用“deleted”命名,不然可能就会报上面这个报错点了)。
坑点二
报错点:就是在多个表使用mp操作的时候,注意一些全局设置和局部设置区别。
例如这篇所说的mp逻辑删除内容,实现有两个方法,分别是数据表对象层中对应对类的对应字段中通过注解实现@TableLogic()和全局变量配置中设置。
注意如果设置成了局部,那么就只是针对设置了的实现,如果设置了全局,则所有设置了逻辑删除字段(deleted)在进行mp删除操作时,都是进行逻辑删除操作。
解决方法就是根据实际开发需求,实际操作设置即可。
来源:https://blog.csdn.net/m0_56151588/article/details/125566195


猜你喜欢
- 冒泡排序在八大排序中,冒泡排序是最为出名的排序算法之一!冒泡排序的代码还是相当简单的,两层循环,外层是冒泡轮数,里层是依次比较,这个算法的时
- java继承1.Object类的常用方法方 * 能public Boolean equals(Object obj)判断两个对象变量所指向的是
- yml 文件规则yml文件的好处,天然的树状结构,一目了然,实质上跟properties是差不多的。不支持tab缩进可以使用 "-
- 前言Flutter (Channel stable, 2.10.3, on Microsoft Windows [Version 10.0.
- 在上篇文章给大家介绍了Android开发之开发者头条(一)启动页实现,感兴趣的朋友可以参考下。title: 带你实现开发者头条(二) 实现左
- package com.cjonline.foundation.evisa;import java.io.BufferedReader;im
- 双亲委派模型类加载这个概念应该算是Java语言的一种创新,目的是为了将类的加载过程与虚拟机解耦,达到”通过类的全限定名来获取描述此类的二进制
- 根据公司产品的要求,app要实现全屏模式,也就是4.4以后的所谓的沉浸式。在values-v19和values-v21的styles里添加以
- 简介使用RecyclerView实现网格布局,实现手机界面应用列表 效果效果如下图: 详细代码XML布局文件在布局中使用
- 首先对图片进行UUID 防止图片被覆盖以及爬图UUID的生成规则:日期时间,MAC地址,HashCode,随机数(多种之一)开发上传接口,两
- 今天给大家介绍一下SpringBoot中JPA的一些常用操作,例如:增删改查、分页、排序、事务操作等功能。下面先来介绍一下JPA中一些常用的
- 本文实例讲述了C#线性渐变画刷LinearGradientBrush用法。分享给大家供大家参考。具体如下:using System;usin
- 废话不多说,直接上代码package com.ietree.basicskill.socket.basic.nio;import java.
- 一、使用Json.NetJson.Net是支持序列化和反序列化DataTable、DataSet、Entity Framework和Enti
- Unity 有点击屏幕进行移动操作,通过Input.GetMouseButtonDown(0)。如果点击到了一些UI上面会触发点击屏幕事件。
- String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。如:String gr
- 前言前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一
- Android读取资源文件的方法1、放入到资源文件夹里面,也就是所创建android工程的res下面。
- 现在面试,基本上都是面试造火箭🚀,工作拧螺丝🔩。而且是喜欢问一些 Spring 相关的知识点,比如 @Autowired 和 @Resour
- 一、尽量不要使用e.printStackTrace(),而是使用log打印。反例:try{ // do what you want }cat