• 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

    在这里插入图片描述

  • 相关阅读:
    链表 | 双指针法 | 删除链表的倒数第 N 个结点 | leecode刷题笔记
    Redis快速上手篇五(持久化)
    封装一个中间大两头小的轮播图(vue-awesome-swiper、vue2)
    CSS的弹性布局
    VSCode『SSH』连接服务器『GUI界面』传输
    petite-vue源码剖析-优化手段template详解
    两年Java开发工作经验面试总结
    C语言基础知识 -- 初识结构体
    python基础知识整理 04-文件、函数
    浙江大学机器学习(胡浩基)学习笔记二:人工神经网络、深度学习
  • 原文地址:https://blog.csdn.net/sgx1825192/article/details/133691323