Mybatis-Plus实现逻辑删除

7 篇文章 0 订阅
5 篇文章 0 订阅

说明:
只对自动注入的 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的查询条件,因此经过逻辑删除的数据查询不出来了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值