逻辑删除是指表中数据仍然存在,但是在查询时将不会再查询到。可以通过添加标志位区分已删除元素和未删除元素,实现逻辑删除。逻辑删除可以恢复数据,相对于物理删除,应用的更为频繁。
//物理删除 @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() 附录: 逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。 如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。