mybatisplus逻辑删除基本实现和坑点解决
作者:你懂的哈
当你在使用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删除操作时,都是进行逻辑删除操作。
解决方法就是根据实际开发需求,实际操作设置即可。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。