详细讲解MybatisPlus实现逻辑删除

发布时间:2024年01月11日

前言

对于MybatisPlus的相关知识可在我的博客进行搜索
对应的CRUD相关知识也可看我这篇文章:【Java项目】实战CRUD的功能整理(持续更新)

在讲述逻辑删除这个概念时,先引入另外一个概念,物理删除!!

逻辑删除和物理删除是两种不同的删除策略,各有其优劣势,选择取决于项目的需求和业务场景。

逻辑删除优势物理删除优势
1.数据保留完整性: 逻辑删除不会从数据库中移除数据,而是通过标记字段来表示数据的删除状态。这样做可以保留数据的完整性,使得可以在需要的时候进行数据恢复或审计。

2.历史数据追踪: 逻辑删除保留了被删除记录的历史状态,有助于追踪数据的变更历史。

3.避免误删: 逻辑删除可以防止意外的数据丢失,因为被删除的数据实际上并未真正删除。
1.节省存储空间: 物理删除直接从数据库中移除数据,可以减少数据库存储空间的占用。

2.查询性能: 由于物理删除会减少表中的数据量,一些查询操作可能更加高效。

3.选择逻辑删除还是物理删除通常取决于业务需求和对数据的处理方式。在需要保留数据完整性、历史追踪和防止误删的场景下,逻辑删除是一种更合适的选择。而在对存储空间和查询性能有较高要求的场景下,物理删除可能更合适。

直接设置一个列来代表删除与否,这其实就是逻辑删除的一种实现方式。

通过添加一个标记字段,可以更灵活地控制删除状态。物理删除和逻辑删除的选择取决于项目的具体需求和业务规范。

1. 基本知识

MyBatis Plus是一个基于MyBatis的增强工具库,它提供了一些方便的功能,包括逻辑删除。

在MyBatis Plus中实现逻辑删除通常涉及以下步骤:

  1. 实体类字段添加逻辑删除注解

在你的实体类中,你需要添加一个用于标识逻辑删除的字段,并使用@TableLogic注解进行标记。

import com.baomidou.mybatisplus.annotation.TableLogic;

public class YourEntity {
    // other fields

    @TableLogic
    private Integer deleted;
    
    // getters and setters
}

这里的deleted字段是用于标识逻辑删除的字段,类型可以是int、Integer、short、Short、byte、Byte等。

  1. 配置逻辑删除的全局属性:
    在MyBatis Plus的配置文件中,需要配置逻辑删除的全局属性。
    application.ymlapplication.properties文件中添加如下配置:
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1   # 逻辑已删除值(默认为1)
      logic-not-delete-value: 0   # 逻辑未删除值(默认为0)

参数如下:

  • logic-delete-valuelogic-not-delete-value分别表示逻辑已删除和逻辑未删除的值。

本身全局配置还有另外一个默认字段值,也可使用这个默认字段值进行交互:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDelete #默认deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
      id-type: auto
  1. 执行逻辑删除操作:
    在执行删除操作时,MyBatis Plus会自动将deleted字段的值设置为逻辑已删除值。
// 示例:使用MyBatis Plus的Service进行逻辑删除
yourEntityService.removeById(id);

在上述示例中,removeById方法执行后,会将对应id的实体的deleted字段设置为逻辑已删除值。

通过以上步骤,你就可以在MyBatis Plus中成功实现逻辑删除。

请注意,具体的配置和代码可能会根据你的项目结构和需求有所调整。

2. 实战Demo

设计一张表格如下:(由于个人实践总结,对于数据库名称以及实体类的名称还请注意驼峰原则)
在这里插入图片描述

为了照顾小白,对应的整体框架如下:

entity实体类:

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("test_student")
public class student{

    @TableId(value = "id", type = IdType.AUTO)
    private int id;
    private String username;
    // 其他字段...

    @TableLogic
    private Integer deleteFlag;

}

接口类:

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.student;

public interface StudentService extends IService<student> {
    // 这里可以自定义一些业务方法
}

接口实现类:

package com.example.demo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.student;
import com.example.demo.mapper.StudentMapper;
import com.example.demo.service.StudentService;
import org.springframework.stereotype.Service;

@Service
public class StrudentServiceimpl extends ServiceImpl<StudentMapper, student> implements StudentService {
    // 这里可以实现自定义的业务方法
}

Mapper类:

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.student;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentMapper extends BaseMapper<student> {
    // 这里可以自定义一些查询方法
}

核心测试功能如下

对应的数据可以通过代码增加:

    @Test
    public void test1(){
        student student = new student();
        student.setId(1);
        student.setUsername("ceshi");
        student.setDeleteFlag(0);
        int insert = studentMapper.insert(student);
        System.out.println(insert);

        int id = student.getId();
        student = studentMapper.selectById(id);
        System.out.println(student);

    }

截图如下所示:

在这里插入图片描述

查看数据结果:

在这里插入图片描述


为了显示逻辑删除,对应代码如下:

    @Test
    public void test2(){
        QueryWrapper<student> wrapper = new QueryWrapper<student>();
        wrapper.eq("username","ceshi");
        int delete4 = studentMapper.delete(wrapper);
        // 删除了多少行
        System.out.println(delete4);
    }

截图如下:

在这里插入图片描述

查看数据结果:

在这里插入图片描述

为了验证查询的结果是否可行,再次增加一个查询的判断条件:

    @Test
    public void test3(){
        //根据querywrapper查询
        student student = studentMapper.selectOne(new QueryWrapper<student>().eq("username","ceshi"));
        System.out.println("根据querywrapper查询:");
        System.out.println(student);
    }

最终显示查询不到:

在这里插入图片描述

再次我们通过增加第二列的结果来判断是否只能查询到未被删除的列:(执行增加代码)

在这里插入图片描述

再次执行删除代码:

在这里插入图片描述

3. 拓展

对于MybatisPlus中如果Mapper或者IService中没有专门的Crud代码,对应在Mapper.xml的配置代码中需要增加一个删除条件的判断,类似如下代码:

以前是这样:

SELECT id,username,deleteFlag FROM student

现在是这样:

SELECT id,username,deleteFlag FROM student WHERE deleteFlag='0'
文章来源:https://blog.csdn.net/weixin_47872288/article/details/135491327
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。