添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
近视的豆浆  ·  java 数组过滤_java ...·  3 月前    · 
爱跑步的电池  ·  c# json array get ...·  1 年前    · 
阳刚的红茶  ·  How can I see 'git ...·  1 年前    · 
  • 小书MybatisPlus第5篇-Active Record模式精讲
  • 小书MybatisPlus第6篇-主键生成策略精讲
  • 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
  • 一、物理删除与逻辑删除

  • 物理删除:指文件存储所用到的磁存储区域被真正的擦除或清零,这样删除的文件是不可以恢复的,物理删除是计算机处理数据时的一个概念。如果在数据库中直接使用delete、drop删除了表数据,如果没有备份的话,数据就很难恢复了。
  • 逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个deleted字段标示行记录是不是被删除,比如该数据有一个字段deleted,当其值为0表示未删除,值为1表示删除。那么逻辑删除就是将0变成1。在逻辑上是数据是被删除的,但数据本身是依然存在的。
  • 两者的优劣:

  • 物理删除一定程度上删除了“无用”的数据,降低了表的数据量,对性能肯定是有好处的;但是如果没有备份的话,数据很难恢复。也无法对历史数据进行数据分析。
  • 逻辑删除恢复的话只要修改ideleted等类似的状态标示字段就可以了,但是表的数据量肯定会比物理删除增加了,并且查询时经常要考虑到deleted字段,对索引都会有影响。
  • 所以一张表的数据是否采用逻辑删除,还要根据数据的重要性、数据量、查询性能以及业务需求等因素综合判断。

    二、逻辑删除实现

  • 首先为需要逻辑删除的表增加一个deleted字段作为逻辑删除字段,并且设置其默认值为0,如下:
  • CREATE TABLE `user` (
        `id` BIGINT(20) 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 '邮箱',
        `deleted` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除标记',
        PRIMARY KEY (`id`)
    );复制代码
    • 给数据库表对应的实体类字段上加上@TableLogic注解:
    • 三、API使用方法

      3.1.插入一条数据

      插入数据的时候,不需要为deleted字段赋值

    @Test
    public void testInsert() {
      User user = new User();
      user.setName("字母哥");
      user.setAge(18);
      int row = userMapper.insert(user);
    }复制代码

    deleted采用默认值0(未删除),新插入的数据都是未删除的数据

    3.2.删除一条记录:

    执行如下Mybatis Plus API删除操作

    userMapper.deleteById(1286797255805796354L);复制代码

    mybatisplus-logicdelete-2

    查看数据库可以发现这条数据仍然存在,只不过逻辑删除字段值被设置为1:

    UPDATE user SET deleted=1 WHERE id=? AND deleted=0复制代码

    3.3.查询一条记录

  • 当我们使用MP逻辑删除的功能之后,比如执行查询、修改的方法,MP会为我们自动加上未删除的条件。是不会查到被逻辑删除的记录:
  • userMapper.selectList(null);复制代码

    会自动添加过滤条件 WHERE deleted=0

    SELECT id,name,age,email,deleted
    FROM user 
    WHERE deleted=0 复制代码
    • 当我们查询数据时,查询结果不希望包含逻辑删除字段,可以加如下的注解
    @TableLogic
    @TableField(select = false)
    private Integer deleted;复制代码

    执行的SQL如下(注意查询结果不包含deleted字段):

    SELECT id,name,age,email 
    FROM user 
    WHERE deleted=0复制代码

    四、全局配置参数

    通常在一个比较正规的管理项目中,逻辑删除字段不允许随意命名,所有表的逻辑删除字段使用相同的名称(比如:deleted)。我们可以在application.yml中添加全局配置,这样就不需要在每一个实体类上面都添加 @TableLogic注解了:

    注意:当全局配置和 @TableLogic 局部配置同时存在,则以实体上注解为准,优先级更高。

    #全局逻辑删除字段值
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: deleted复制代码

    默认情况下,逻辑已删除值为1,逻辑未删除值为0。我们也可以在application.yml中进行修改:

    #逻辑已删除值(默认为 1)
    #逻辑未删除值(默认为 0)
    mybatis-plus:
      global-config:
        db-config:
          logic-delete-value: 1
          logic-not-delete-value: 0复制代码

    欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字): 字母哥博客
  • 觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端分离RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》
  • 分类:
    后端
    标签: