说明:
只对自动注入的 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()
附录:
逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
首先我们在数据库表中添加一个表示是否删除状态的字段,这里我们字段名取为deleted,同时我们给该字段设置一个默认值为0(我们默认0代表未删除,1代表已删除)
同样,我们在实体类中添加deleted该属性。
/**
* @Author Kk
* @Date 2022/2/11 18:35
* @Description
*/
@Data
@Component
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
//逻辑删除
@TableLogic
private Integer deleted;
}
如上所示,我们还需要在该属性上添加一个@TableLogic注解来表明这个属性代表逻辑删除的标志状态。Mybatis-Plus 3以上的版本就不需要进行其他配置了,到此我们可以直接测试功能~
测试第一步,我们向数据库中添加一条数据
可以注意到,该条数据deleted字段的值为0。
然后我们测试将这条数据给删除掉
@Test
@DisplayName("测试逻辑删除")
void testLogicalDelete(){
userMapper.deleteById(1492495005970112513L);
// User user = userMapper.selectById(1492433687321886722L);
// System.out.println(user);
}
很显然,这里deleted字段的值变成了1,表示已被删除。但实际上此条数据仍然存在数据库中。
我们可以通过控制台打印输出的日志来进一步了解为什么会这样。
JDBC Connection [HikariProxyConnection@2113919627 wrapping com.mysql.cj.jdbc.ConnectionImpl@3d1f558a] will not be managed by Spring
==> Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 1492495005970112513(Long)
<== Updates: 1
可以发现,原本的删除语句在此变成了更新语句。
我们再来查找一下此条数据:
@Test
@DisplayName("测试逻辑删除")
void testLogicalDelete(){
// userMapper.deleteById(1492495005970112513L);
User user = userMapper.selectById(1492495005970112513L);
System.out.println(user);
}
控制台的输出如下:
JDBC Connection [HikariProxyConnection@394019287 wrapping com.mysql.cj.jdbc.ConnectionImpl@4f327096] will not be managed by Spring
==> Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE id=? AND deleted=0
==> Parameters: 1492495005970112513(Long)
<== Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@43d9f1a2]
null
Mybatis-Plus框架自动给我们加上了deleted必须为0的查询条件,因此经过逻辑删除的数据查询不出来了。