逻辑删除

(1)简介  

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

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

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

给数据表增加一个字段:delete_flag,用于表示该数据是否被逻辑删除。

CREATE TABLE test_mybatis_plus_users
(
    id BIGINT NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    create_time timestamp NULL DEFAULT NULL COMMENT '创建时间',
    update_time timestamp NULL DEFAULT NULL COMMENT '最后修改时间', 
    delete_flag tinyint(1) NULL DEFAULT NULL COMMENT '逻辑删除(0 未删除、1 删除)',
    PRIMARY KEY (id)
);

(2)使用逻辑删除。  

可以定义一个自动填充规则,初始值为 0。0 表示未删除, 1 表示删除。

/**
 * 逻辑删除(0 未删除、1 删除)
 */
@TableLogic(value = "0", delval = "1")
@TableField(fill = FieldFill.INSERT)
private Integer deleteFlag;
​

 在创建 handler 包并创建 MyMetaObjectHandler 

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
           this.strictInsertFill(metaObject, "deleteFlag", Integer.class, 0);

    }

    @Override
    public void updateFill(MetaObject metaObject) {

    }
}

(3)简单测试  使用 mybatis-plus 封装好的方法时,会自动添加逻辑删除的功能。  若是自定义的 sql 语句,需要手动添加逻辑。

 //逻辑删除
    @Test
    public void testDelete() {
        if (usersService.removeById(1444840211061186561L)) {
            System.out.println("删除数据成功");
            usersService.list().forEach(System.out::println);
        } else {
            System.out.println("删除数据失败");
        }
    }

若去除 TableLogic 注解,再执行 testDelete 时进行物理删除,直接删除这条数据。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐