Mybatis-Plus详解02-逻辑删除、自动填充、乐观锁

系列文章目录

Mybatis-Plus详解01-代码生成器&增删改查基本使用



前言

上篇01记录了Mybatis-Plus的生成器和CRUD方法,本篇记录一些实用的扩展功能


一、逻辑删除

1、概念

逻辑删除:

区别于真正意义上的物理删除,通过逻辑删除的数据并没有真正的删除,这种删除方法通常是可逆的,为了防止数据被误删,一般通过逻辑删除删除的数据,都是可恢复的数据,只是暂时不可用。同时也弥补了物理删除的某些缺陷,例如,数据恢复难度大,会导致主键不连续,降低索引效率

实现方法

通常的做法是在设计数据库的时候,设计一个特殊的字段,用于记录当前行数据的可用状态,可用为0,不可用为1,在阿里巴巴开发规范手册里有相关规定

在这里插入图片描述
在这里插入图片描述

Mybatis-Plus帮我们实现了逻辑删除的功能,在查询时会自动带上相关的字段条件,删除时自动修改关键字段的值,而不执行物理删除。

2、使用步骤

首先在数据库添加标识字段

在这里插入图片描述

修改实体类属性,加上注解进行标注

在这里插入图片描述

在利用Junit单元测试在test中测试,首先我们先执行查询方法,然后执行删除方法,最后再查一遍,
代码如下:

 //测试逻辑删除,先查询,再调用删除的方法(则会执行修改的方法),再查询
    @Test
    public void test_list(){
    
    
        //可以添加多个条件进行查询
        List<User> userList = service.list();
        System.out.println(userList);
    }
    @Test
    public void test_removeById(){
    
    
        //测试删除
        service.removeById(14);
    }

数据库的初始值:
在这里插入图片描述

执行查询:
在这里插入图片描述
可以看到,flag为1的数据默认是查不到的

执行删除:
在这里插入图片描述
虽然我们使用的是删除方法,mybatis-plus默认执行的是修改,查看数据库
在这里插入图片描述

再次查询:

在这里插入图片描述
没有加任何查询条件,id为14的杨氏快马已经查不到了,实现了逻辑删除

二、自动填充

1.使用场景

自动填充一般都是对数据库中的创建时间create_time,和修改时间update_time字段进行填充,在阿里巴巴开发规范嵩山版的建表规范第9条有规定:

在这里插入图片描述

这两个字段的填充如果让我们手动实现确实会比较麻烦,mybatis-plus帮我们实现了这个功能

2.使用步骤

根据官网给出的使用步骤,(所有的操作都是在导入baomidou依赖的基础上),我们需要在pojo实体类属性上添加注解标注,如下:

在这里插入图片描述
我的代码:
在这里插入图片描述

接着是配置自定义实现类,官网给出的代码如下:

在这里插入图片描述
我的代码:

package com.lzl.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
/**
 * --效率,是成功的核心关键--
 *
 * @Author lzl
 * @Date 2023/3/8 15:12
 */

/**
 * 自动填充
 */
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    

    @Override
    public void insertFill(MetaObject metaObject) {
    
    
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
    
    
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

分别对应,create_time,update_time,此处我数据库字段没有设计修改时间,所以只演示创建时间,原理都一样。下边是测试

//测试自动填充
    @Test
    public void test_save(){
    
    
        User user = new User(null,"管泽元","4568515",0,null,null);
        service.save(user);
    }

执行结果:
在这里插入图片描述

数据库:
在这里插入图片描述

三、乐观锁

1、概念

乐观锁的概念就是,当一个线程去操作一个被加了乐观锁的数据时,它拿到这把锁,并不会将其他的线程挡在外边,它很乐观,认为它在操作数据的时候,没有其它的线程来影响它。乐观锁实现的原理是:采用一个版本号机制,如下图

在这里插入图片描述

2、使用步骤

mybatis-plus帮我们实现了乐观锁

在这里插入图片描述

首先配置乐观锁插件,在实现分页插件的配置类中,加一行代码如下:

在这里插入图片描述
接着,需要去数据库新增一个version字段,这里不再演示,新增完之后,需要我们在实体类的属性上添加注解@Version
在这里插入图片描述
测试代码如下:

 //测试乐观锁
    @Test
    public void test_version(){
    
    
        //两个线程同时查询数据库
        User user1 = service.getById(12);
        User user2 = service.getById(12);

        user1.setPassword("yyyyyyy");
        user2.setPassword("xxxxxxx");

        //进行修改
        boolean bo1 = service.updateById(user1);
        boolean bo2 =service.updateById(user2);

        if(bo1){
    
    
            System.out.println("修改成功");
        }else {
    
    
            System.out.println("修改失败");
        }

        if(bo2){
    
    
            System.out.println("修改成功");
        }else {
    
    
            System.out.println("修改失败");
        }

    }

执行结果:
在这里插入图片描述
成功实现


总结

本篇记录了一些mybatis-plus常用的功能

猜你喜欢

转载自blog.csdn.net/l_zl2021/article/details/129628681