逻辑删除是指表中数据仍然存在,但是在查询时将不会再查询到。可以通过添加标志位区分已删除元素和未删除元素,实现逻辑删除。逻辑删除可以恢复数据,相对于物理删除,应用的更为频繁。

  //物理删除
    @Test
    public void testDelete() {
        int result = this.userMapper.deleteById(1l);
        System.out.println(result);
    }
//批量删除
@Test
public void  testBatchDelete() {
    int result = this.userMapper.deleteBatchIds(Arrays.asList(2l, 3l));
    System.out.println(result);
}

逻辑删除的步骤是:

1.表中添加字段deleted(设置默认值为0),在实体类中添加属性。

图片说明

//注解表示其用于逻辑删除
@TableLogic
private Integer deleted;

2.配置逻辑删除插件

事实上,这里可以不要配置,默认会置删除为1,未删除为0,当然,也可以按照自己的规则进行配置。

#设置逻辑删除中删除与未删除的默认值
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

3.执行删除操作

执行一条新的insert语句(这个数据的deleted字段会被自动填充为0),此时再执行删除操作时底层的sql如下:

UPDATE user SET deleted=1 WHERE id=? AND deleted=0

查看表中数据,删除的数据还在,且deleted字段置为1了。

逻辑删除配置后对于操作的说明如下。

说明:

只对自动注入的sql起效:

插入: 不作限制
查找: 追加where条件过滤掉已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
更新: 追加where条件防止更新到已删除数据,且使用 wrapper.entity 生成的where条件会忽略该字段
删除: 转变为 更新
例如:

删除: update user set deleted=1 where id = 1 and deleted=0
查找: select id,name,deleted from user where deleted=0
字段类型支持说明:

支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()
附录:

逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。