Mybatis-Plus详解02-逻辑删除、自动填充、乐观锁
创始人
2025-05-30 07:31:44
0

系列文章目录

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


文章目录

  • 系列文章目录
  • 前言
  • 一、逻辑删除
    • 1、概念
    • 2、使用步骤
  • 二、自动填充
    • 1.使用场景
    • 2.使用步骤
  • 三、乐观锁
    • 1、概念
    • 2、使用步骤
  • 总结


前言

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


一、逻辑删除

1、概念

逻辑删除:

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

实现方法

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

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

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

2、使用步骤

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

在这里插入图片描述

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

在这里插入图片描述

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

 //测试逻辑删除,先查询,再调用删除的方法(则会执行修改的方法),再查询@Testpublic void test_list(){//可以添加多个条件进行查询List userList = service.list();System.out.println(userList);}@Testpublic 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 {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}

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

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

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

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

三、乐观锁

1、概念

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

在这里插入图片描述

2、使用步骤

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

在这里插入图片描述

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

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

 //测试乐观锁@Testpublic 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常用的功能

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...