MyBatis Plus 逻辑删除

Posted 我有一只肥螳螂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis Plus 逻辑删除相关的知识,希望对你有一定的参考价值。

何为逻辑删除

  1. 删除数据,可以通过物理删除,也可以通过逻辑删除。

  2. 物理删除指的是直接将数据从数据库中删除,不保留。

  3. 逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数据)。

方案

给数据表增加一个字段:is_del,用于表示该数据是否被逻辑删除,初始值为 0。0 表示未删除, 1 表示删除。
 

方法一

实体类字段上加上注解

  • value = “未删除的值,默认值为0”;若设置为2,则查询时 where 后面自动拼接 is_del = 2
  • delval = “删除后的值,默认值为1”
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("是否删除标识 0:未删除  1:删除")
@TableLogic(value = "0",delval = "1")
private int isDel;

执行删除,原 deleteById 会物理删除,现在实现逻辑删除

testMapper.deleteById(id);

执行删除后,id 对应行数据的 is_del 字段会变成 1

由于 isDel 添加了 @TableLogic 注解,MyBatis Plus 做所有查询操作时,自动会在 where 条件后面拼上 is_del = 0,所以 is_del 置一后,实现了逻辑删除

思考:一般情况下,我们表设计会有两个时间字段,一个时创建时间,另一个是最后更新时间;通过最后更新时间我们可以知道该数据被删除的时间,那么方法一 deleteById 后,同时更新最后修改时间吗?

:不可以,如需改变最后修改时间,请选择方法二
 

方法二

思路就是通过 update 方法来把 is_del 从 0 更新为 1,通过 MyBatis Plus 提供的自动填充功能,可以自动更新最后修改时间和最后修改人

配置自动填充

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class MyObjectHandler implements MetaObjectHandler 

    @Override
    public void updateFill(MetaObject metaObject) 
        this.strictInsertFill(metaObject, "mender", () -> this.getUserName(), String.class);
        this.strictInsertFill(metaObject, "menderId", () -> this.getUserId(), Long.class);
        this.strictInsertFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
    

    private String getUserName() 
        return "username";
    

    private Long getUserId() 
        return -1L;
    

service 层执行,找出 id 对应的一行,然后把 is_del 字段更新成 1


    public void deleteById(Long id) 
        LambdaUpdateWrapper<TestPO> updateWrapper = new UpdateWrapper<TestPO>().lambda();
        updateWrapper.set(TestPO::getIsDel, 1).eq(TestPO::getId, id);
        baseMapper.update(new TestPO(), updateWrapper);
    

此时最后修改人和最后修改时间等于删除人和删除时间,完美

MyBatis-Plus逻辑删除

MyBatis-Plus逻辑删除指,在数据库中删除数据时,并没有真正的删除,而是更改指定字段的值,这个字段的值可以为0或1,0代表未删除,1代表已删除,所以delete操作实际上是update操作,查询操作也是要加where条件过滤掉已删除的数据

MyBatis-Plus配置逻辑删除:

1.#MyBatisPlus全局配置
global-config:
  db-config:
 
    #全局配置逻辑删除字段名
    logic-delete-field: deleted
    #逻辑已删除值(默认1)
    logic-delete-value: 1
    #逻辑未删除值(默认0)
    logic-not-delete-value: 0
2.在实体类和表中添加对应属性,并在属性上方添加@TableLogic注解

调用删除方法时,底层的sql语句自动转为更新语句

以上是关于MyBatis Plus 逻辑删除的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis-Plus逻辑删除

mybatis-plus(3.0-RELEASE)逻辑删除的坑

#yyds干货盘点#mybatis-plus学习与实践逻辑删除

MyBatis Plus 逻辑删除

Mybatis-Plus:逻辑删除(@TableLogic 将数据标记为删除,而并非真正 的物理删除(非DELETE操作))

MyBatis Plus 快速入门(2021.07.16)