• MyBatisPlus(十六)逻辑删除


    说明

    实际生产中的数据,一般不采用物理删除,而采用逻辑删除,也就是将一条记录的状态改为已删除

    逻辑删除,本质上是更新操作

    MyBatis Plus 框架,提供了逻辑删除功能。在配置了逻辑删除后,增删改查和统计等功能,都会使用逻辑删除字段来做相应的处理。比如,查询时会只查出未删除的数据。

    使用方法

    全局配置

    推荐在配置文件(application.yml)中,统一配置逻辑删除的字段删除/未删除状态对应的

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: deleted # 全局逻辑删除的实体字段名
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实体类

    在实体类中,添加删除字段 deleted.

    package com.example.web.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
        private Long id;
        private String name;
        private Integer age;
        private String email;
        private Integer deleted;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    数据库

    数据库添加删除字段。
    在这里插入图片描述

    测试类

    新增

    代码

        @Test
        public void insert() {
            User user = new User();
            user.setId(9L);
            user.setName("赵一");
            user.setAge(25);
            user.setEmail("zhaoyi@example.com");
    
            userMapper.insert(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    注意

    MySQL的deleted字段配置了默认值:0,则新增的数据会自动填充默认值。
    如果MySQL没有配置默认值,则新增时,deleted字段为 NULL

    官方推荐:在数据库定义默认值。
    在这里插入图片描述

    1. 配置了默认值 0,新增

    在这里插入图片描述

    在这里插入图片描述

    1. 没配置默认值,新增

    在这里插入图片描述

    删除

        @Test
        public void deleteById() {
            userMapper.deleteById(9);
        }
    
    • 1
    • 2
    • 3
    • 4

    逻辑删除,将 deleted 字段的值改为 1
    在这里插入图片描述

    数据库中的数据还在,deleted的值更新了。
    在这里插入图片描述

    查询

    按照 id 查询和查询全部数据,查出来的都是逻辑未删除的数据。已删除的数据是不会被查询出来的。

        @Test
        public void selectById() {
            User user = userMapper.selectById(9);
            log.info("user:{}", user);
        }
    
    
        @Test
        void selectList() {
            List<User> users = userMapper.selectList(null);
            log.info("users:{}", users);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    查询已经删除的数据,查询结果是不存在的。
    在查询的SQL语句中,已经自动拼接了(deleted=0),确保数据是未被删除的。
    在这里插入图片描述

    查询全部数据,查询出来的,也是没有删除的数据。
    在这里插入图片描述

    分页查询

    分页查询,也是查询出未逻辑删除的数据。

        /**
         * 分页查询用户列表。
         * 
    * 查询条件:查询第1页的数据,每页10条数据。 */
    @Test void selectPage() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); IPage<User> pageQuery = new Page<>(1, 10); IPage<User> page = userMapper.selectPage(pageQuery, wrapper); log.info("当前页码:{}", page.getCurrent()); log.info("每 1 页的数据量:{}", page.getSize()); log.info("总数据量:{}", page.getTotal()); log.info("总页数:{}", page.getPages()); log.info("数据列表:{}", page.getRecords()); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    统计

        @Test
        void count() {
            Long count = userMapper.selectCount(null);
            log.info("count:{}", count);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    更新

    更新数据的时候,同样会进行数据是否已经删除的判断;已经删除的数据,就不会更新了。

        @Test
        public void updateById() {
            User user = new User();
            user.setId(9L);
            user.setAge(50);
            user.setEmail("zhaoyi50@example.com");
    
            userMapper.updateById(user);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

  • 相关阅读:
    数据结构——常见的十种排序算法
    认识C#.
    【实践成果】Splunk 9.0 Configuration Change Tracking
    Mininet玩转流表
    2022科大讯飞A.I.开发者大赛 柑橘花果梢识别挑战赛冠军方案
    C语言学习笔记
    Spring学习|Bean的作用域、自动装配Bean、注解实现自动装配、Spring注解开发
    基于jsp+ssm的家庭理财系统
    python通过生成器实现协程-生产消费者模型
    秒验:可以自定义UI的一键登录服务
  • 原文地址:https://blog.csdn.net/sgx1825192/article/details/133691323