ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
![](https://cdn.zimug.com/wx-zimug.png) 本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下: * [小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac1%e7%af%87-%e6%95%b4%e5%90%88springboot%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b%e5%a2%9e%e5%88%a0%e6%94%b9%e6%9f%a5/.html) * [小书MybatisPlus第2篇-条件构造器的应用及总结](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac2%e7%af%87-%e6%9d%a1%e4%bb%b6%e6%9e%84%e9%80%a0%e5%99%a8%e7%9a%84%e5%ba%94%e7%94%a8%e5%8f%8a%e6%80%bb%e7%bb%93/.html) * [小书MybatisPlus第3篇-自定义SQL](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac3%e7%af%87-%e8%87%aa%e5%ae%9a%e4%b9%89sql/.html) * [小书MybatisPlus第4篇-表格分页与下拉分页查询](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac3%e7%af%87-%e8%a1%a8%e6%a0%bc%e5%88%86%e9%a1%b5%e4%b8%8e%e4%b8%8b%e6%8b%89%e5%88%86%e9%a1%b5%e6%9f%a5%e8%af%a2/.html) * [小书MybatisPlus第5篇-Active Record模式精讲](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac5%e7%af%87-active-record%e6%a8%a1%e5%bc%8f%e7%b2%be%e8%ae%b2/.html) * [小书MybatisPlus第6篇-主键生成策略精讲](http://www.zimug.com/other/springboot/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac6%e7%af%87-%e4%b8%bb%e9%94%ae%e7%94%9f%e6%88%90%e7%ad%96%e7%95%a5%e7%b2%be%e8%ae%b2/.html) * [小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法](http://www.zimug.com/other/java/%e5%b0%8f%e4%b9%a6mybatisplus%e7%ac%ac7%e7%af%87-%e4%bb%a3%e7%a0%81%e7%94%9f%e6%88%90%e5%99%a8%e7%9a%84%e5%8e%9f%e7%90%86%e7%b2%be%e8%ae%b2%e5%8f%8a%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/.html) ## 一、物理删除与逻辑删除 * 物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。如果在数据库中直接使用delete、drop删除了表数据,如果没有备份的话,数据就很难恢复了。 * 逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个deleted字段标示行记录是不是被删除,比如该数据有一个字段deleted,当其值为0表示未删除,值为1表示删除。那么逻辑删除就是将0变成1。在逻辑上是数据是被删除的,但数据本身是依然存在的。 两者的优劣: * 物理删除一定程度上删除了“无用”的数据,降低了表的数据量,对性能肯定是有好处的;但是如果没有备份的话,数据很难恢复。也无法对历史数据进行数据分析。 * 逻辑删除恢复的话只要修改ideleted等类似的状态标示字段就可以了,但是表的数据量肯定会比物理删除增加了,并且查询时经常要考虑到deleted字段,对索引都会有影响。 所以一张表的数据是否采用逻辑删除,还要根据数据的重要性、数据量、查询性能以及业务需求等因素综合判断。 ## 二、逻辑删除实现 * 首先为需要逻辑删除的表增加一个deleted字段作为逻辑删除字段,并且设置其默认值为0,如下: ~~~ CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL COMMENT '主键ID', `name` VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', `age` INT(11) NULL DEFAULT NULL COMMENT '年龄', `email` VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱', `deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记', PRIMARY KEY (`id`) ); ~~~ * 给数据库表对应的实体类字段上加上@TableLogic注解: ![](https://img.kancloud.cn/cd/a4/cda4c8856e6175dbdfbe0d2ec3c269fc_1056x413.png) ## 三、API使用方法 ### 3.1.插入一条数据 插入数据的时候,不需要为deleted字段赋值 ~~~ @Test public void testInsert() { User user = new User(); user.setName("字母哥"); user.setAge(18); int row = userMapper.insert(user); } ~~~ deleted采用默认值0(未删除),新插入的数据都是未删除的数据 ![](https://img.kancloud.cn/1a/8a/1a8a56b6ad4f7646deb2d5eaafe892f1_568x143.png) ### 3.2.删除一条记录: 执行如下Mybatis Plus API删除操作 ~~~ userMapper.deleteById(1286797255805796354L); ~~~ ![](https://img.kancloud.cn/ba/de/badea951813687cf485c8f73101a2acb_504x133.png) 查看数据库可以发现这条数据仍然存在,只不过逻辑删除字段值被设置为1: ~~~ UPDATE user SET deleted=1 WHERE id=? AND deleted=0 ~~~ ### 3.3.查询一条记录 * 当我们使用MP逻辑删除的功能之后,比如执行查询、修改的方法,MP会为我们自动加上未删除的条件。 是不会查到被逻辑删除的记录: ~~~ userMapper.selectList(null); ~~~ 会自动添加过滤条件`WHERE deleted=0 ` ~~~ SELECT id,name,age,email,deleted FROM user WHERE deleted=0 ~~~ * 当我们查询数据时,查询结果不希望包含逻辑删除字段,可以加如下的注解 ~~~ @TableLogic @TableField(select = false) private Integer deleted; ~~~ 执行的SQL如下(注意查询结果不包含deleted字段): ~~~ SELECT id,name,age,email FROM user WHERE deleted=0 ~~~ ## 四、全局配置参数 通常在一个比较正规的管理项目中,逻辑删除字段不允许随意命名,所有表的逻辑删除字段使用相同的名称(比如:deleted)。我们可以在application.yml中添加全局配置,这样就不需要在每一个实体类上面都添加 @TableLogic注解了: > 注意:当全局配置和`@TableLogic`局部配置同时存在,则以实体上注解为准,优先级更高。 ~~~ #全局逻辑删除字段值 mybatis-plus: global-config: db-config: logic-delete-field: deleted ~~~ 默认情况下,逻辑已删除值为1,逻辑未删除值为0。我们也可以在application.yml中进行修改: ~~~ #逻辑已删除值(默认为 1) #逻辑未删除值(默认为 0) mybatis-plus: global-config: db-config: logic-delete-value: 1 logic-not-delete-value: 0 ~~~