• mybatis-plus实现逻辑删除(详细!)


    什么是逻辑删除

    逻辑删除的本质是修改操作,并不是真正的删除,而是在表中将对应的是否删除标识(delete_flag)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。
    逻辑删除sql语句为:

    update user set deleted=1 where id = 1 and deleted=0
    
    • 1

    这种设计,后端每次向数据库查询数据时,只查deleted=0(未删除)的数据。拿上面sql举例,那么客户端进行查询id为1的信息,服务器就不会提供信息。
    查询sql为:

    select id,name,deleted from user where deleted=0
    
    • 1

    为什么用到逻辑删除?

    比如:在一家销售公司中,有两个员工在一月份离职了,后台管理人员在办离职时,如果直接将数据库中与这两个员工相关的信息删除了,那么当经理想要看一月份的销售记录的时候,只能看到部分销售记录,销售金额对不上。这种情况肯定是不允许发生的
    如下图:
    本来一月总共销售了17,000,00元,结果删除后只剩下了5,000,00。
    在这里插入图片描述
    只需要在员工工号后面加delete_flag字段,用于标记是否被删除即可。

    在springboot使用Mybatis-Plus提供的逻辑删除

    字段类型支持说明:
    支持所有数据类型(推荐使用 Integer,Boolean,LocalDateTime)
    如果数据库字段使用datetime,逻辑未删除值和已删除值支持配置为字符串null,另一个值支持配置为函数来获取值如now()

    1、在application.yml配置

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
          logic-delete-value: 1 # 逻辑已删除值(默认为 1)
          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、 实体类字段上加上@TableLogic注解

    @Data
    public class UserPO implements Serializable {
    
        @TableId(type = IdType.ASSIGN_ID)
        private Long id;
    
        private String userName;
    
        private String password;
    
        private String nickName;
    
        @TableLogic
        private int delFlag;
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    演示

    数据库t_user表中数据:
    在这里插入图片描述
    UserPOMapper:

    @Mapper
    public interface UserPOMapper extends BaseMapper<UserPO> {
    }
    
    
    • 1
    • 2
    • 3
    • 4

    IUserService:

    public interface IUserService extends IService<UserPO> {
    }
    
    • 1
    • 2

    IUserServiceImpl:

    @Service
    public class IUserServiceImpl extends ServiceImpl<UserPOMapper, UserPO> implements IUserService {
    }
    
    • 1
    • 2
    • 3

    Controller:

     @RequestMapping("/open/del")
        public ResultUtil del(UserParam userParam){
            UserPO one = iUserService.getOne(new LambdaQueryWrapper<UserPO>()
                    .eq(UserPO::getUserName, userParam.getUserName()));
            boolean b = iUserService.removeById(one);
            System.out.println(b);
            return ResultUtil.success(b);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ResultUtil:

    @Data
    public class ResultUtil {
    
        private String code;
    
        private String message;
    
        private  Object data;
        public static  ResultUtil success(Object data){
            ResultUtil resultUtil = new ResultUtil();
            resultUtil.setCode("200");
            resultUtil.setMessage("请求成功");
            resultUtil.setData(data);
            return resultUtil;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    浏览器请求:
    在这里插入图片描述
    数据库t_user表中数据:
    可以看到,加了@TableLogic注解的字段对应的数据库字段,由0(未删除)改为1(已删除)
    在这里插入图片描述

  • 相关阅读:
    python数据分析——数据可视化(图形绘制)
    【网络】对于我前面UDP博客的补充
    php案例:今天是星期几呢?
    c语言数据结构 排序(二)
    初学C语言,写给自己的第一个实用程序
    WSL安装异常:WslRegisterDistribution failed with error: 0xc03a001a
    APP采用原生开发还是混合开发好?
    计算机操作系统学习(七)作业管理
    C#when关键字
    list的模拟实现(万字解读+由浅入深)
  • 原文地址:https://blog.csdn.net/m0_51963973/article/details/130910991