本文是系列文章,目录:
一、MybatisPlus-基本使用
二、MybatisPlus-进阶使用-条件构造器
三、MybatisPlus-进阶使用-自定义sql
四、MybatisPlus-进阶使用-Service接口(1)-基本使用
五、MybatisPlus-进阶使用-Service接口(2)-自定义service
六、MybatisPlus-进阶使用-Service接口(3)- 批量新增
七、MybatisPlus-进阶使用-逻辑删除
八、MybatisPlus-进阶使用-枚举处理器
九、MybatisPlus-进阶使用-JSON类型处理器
十、MybatisPlus-进阶使用-配置文件加密
十一、MybatisPlus-插件功能-分页插件(1)
十二、MybatisPlus-插件功能-分页插件(2)-通用分页封装
十三、MybatisPlus-插件功能-乐观锁插件
十四、MybatisPlus-插件功能-sql性能分析
十五、MybatisPlus-自动填充字段
MybatisPlus-问题汇总
一、什么是逻辑删除
逻辑删除是一种优雅的数据管理策略,它通过在数据库中标记记录为“已删除”而非物理删除,来保留数据的历史痕迹,同时确保查询结果的整洁性。MyBatis-Plus 提供了便捷的逻辑删除支持,使得这一策略的实施变得简单高效。
二、逻辑删除的实现
全局配置逻辑删除字段
mp提供的逻辑删除实现起来非常简单
只需要在application.yml
中进行逻辑删除的相关配置即可
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名
logic-delete-value: 1 # 逻辑已删除值(默认为1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为0)
# 若逻辑已删除和未删除的值和默认值一样,则可以不配置这2项
测试代码
package com.pino.demo;
import com.pino.demo.service.IAddressService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* 逻辑删除
*/
@SpringBootTest
public class I_Delete_Logic {
@Autowired
private IAddressService addressService;
@Test
void testDeleteLogic() {
addressService.removeById(70L);
}
}
执行结果:
可以看到,发出的SQL不再是DELETE
,而是UPDATE
执行查询语句:
@Test
void testDeleteLogicQuery() {
// 执行查询语句
addressService.list().forEach(System.out::println);
}
执行结果:
可以看到,发出的SQL语句,会自动在WHERE后面拼接逻辑未删除的条件。查询出来的结果中,没有了id为70的数据。
若想要SELECT的列,不包括逻辑删除的那一列,则可以在实体类中通过@TableField
进行配置
@TableField(select = false)
private Integer deleted;
单独表配置逻辑删除字段
前面在application.yml中做的配置,是全局的。通常来说,对于多个表,我们也会统一逻辑删除字段的名称,统一逻辑已删除和未删除的值,所以全局配置即可。
若要对某些表进行单独配置,在实体类的对应字段上使用@TableLogic即可
@TableLogic(value = "0", delval = "1")
private Integer deleted;
小结
开启mp的逻辑删除后,会对SQL产生如下的影响
- INSERT语句:没有影响
- SELECT语句:追加WHERE条件,过滤掉已删除的数据
- UPDATE语句:追加WHERE条件,防止更新到已删除的数据
- DELETE语句:转变为UPDATE语句
注意,上述的影响,只针对mp自动注入的SQL生效。如果是自己手动添加的自定义SQL,则不会生效。
比如
public interface AddressMapper extends BaseMapper<Address> {
@Select("select * from address")
List<Address> selectRows();
}
调用这个selectRaw
,则mp的逻辑删除不会生效。