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)

实体类

在实体类中,添加删除字段 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;
}

数据库

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

测试类

新增

代码

    @Test
    public void insert() {
    
    
        User user = new User();
        user.setId(9L);
        user.setName("赵一");
        user.setAge(25);
        user.setEmail("[email protected]");

        userMapper.insert(user);
    }

在这里插入图片描述

注意

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

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

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

在这里插入图片描述

在这里插入图片描述

  1. 没配置默认值,新增

在这里插入图片描述

删除

    @Test
    public void deleteById() {
    
    
        userMapper.deleteById(9);
    }

逻辑删除,将 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);
    }

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

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

分页查询

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

    /**
     * 分页查询用户列表。
     * <br>
     * 查询条件:查询第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());
    }

在这里插入图片描述

统计

    @Test
    void count() {
    
    
        Long count = userMapper.selectCount(null);
        log.info("count:{}", count);
    }

在这里插入图片描述

更新

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

    @Test
    public void updateById() {
    
    
        User user = new User();
        user.setId(9L);
        user.setAge(50);
        user.setEmail("[email protected]");

        userMapper.updateById(user);
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sgx1825192/article/details/133691323