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环境部署下载所需软件和依赖安装 jdk路径可选别的盘。但是指向时得注意我自己时装在 F 盘的,在f盘里新建文件夹 Java,Java
- sql中like通配符模糊匹配问题针对oracle数据库:将查询条件通过功能类处理/** * Desc
- 文件上传是开发中十分常见的功能,在servlet3.0之前,实现文件上传需要使用一些插件技术,比如:commons-fileuploadsm
- 什么是递归?用Java写一个简单的递归程序递归的定义递归(recursion):以此类推是递归的基本思想,将规模大的问题转化为规模小的问题来
- springboot使用mybatis一对多的关联查询由于刚开始写java不久,对sql语句的熟悉度还是不够熟练,虽然现在使用的mybati
- 简介Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。今天我们要讨论一下mvn命令之下的生命周期的构建
- 用Stream解决两层List属性求和假设一个人有很多个银行账户,每个银行账户中存有不同金额的存款,那么我们如何用Stream求一组人的所有
- 前言工作中使用mybatis时我们需要根据数据表字段创建pojo类、mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作
- public static string Replace(string source, string match, string repla
- 1、导入资源2、JSP代码<div class="page-container">  
- java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,
- 背景公司的一个服务需要做类似于分片的逻辑,一开始服务基于传统部署方式通过本地配置文件配置的方式就可以指定该机器服务的分片内容如:0,1,2,
- 上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待!这次我们说说垃圾收集器,又名gc,顾名思义,就是收集
- 我们深知在操作Java流对象后要将流关闭,但往往事情不尽人意,大致有以下几种不能一定将流关闭的写法:1.在try中关流,而没在finally
- 编写一个简单的mybatis进行插入数据的实例1 数据库建表 其中建表dob=Date of Birth 的意思create table s
- 通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置<TextView android:layout_widt
- 在项目中,分页是一个项目中必不可少的,它可以防止我们从数据库中进行大量数据查询时速度变慢,提高我们的查询效率。1、定义分页模型:PageMo
- 近来总是接触到 IoC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)等编
- 本文实例讲述了Java线程之守护线程(Daemon)用法。分享给大家供大家参考。具体如下:守护线程(Daemon)Java有两种Thread
- 1 前言到目前为止Java仍然是使用最多的编程语言,随着Java以及Java社区的不断壮大,Java也早已不再是简简单单的一门计算机语言了,