系列文章目录
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常用的功能