Mybatis-Plus详解01-代码生成器&增删改查基本使用
上篇01记录了Mybatis-Plus的生成器和CRUD方法,本篇记录一些实用的扩展功能
逻辑删除:
区别于真正意义上的物理删除,通过逻辑删除的数据并没有真正的删除,这种删除方法通常是可逆的,为了防止数据被误删,一般通过逻辑删除删除的数据,都是可恢复的数据,只是暂时不可用。同时也弥补了物理删除的某些缺陷,例如,数据恢复难度大,会导致主键不连续,降低索引效率
实现方法
通常的做法是在设计数据库的时候,设计一个特殊的字段,用于记录当前行数据的可用状态,可用为0,不可用为1,在阿里巴巴开发规范手册里有相关规定
Mybatis-Plus帮我们实现了逻辑删除的功能,在查询时会自动带上相关的字段条件,删除时自动修改关键字段的值,而不执行物理删除。
首先在数据库添加标识字段
修改实体类属性,加上注解进行标注
在利用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的杨氏快马已经查不到了,实现了逻辑删除
自动填充一般都是对数据库中的创建时间create_time,和修改时间update_time字段进行填充,在阿里巴巴开发规范嵩山版的建表规范第9条有规定:
这两个字段的填充如果让我们手动实现确实会比较麻烦,mybatis-plus帮我们实现了这个功能
根据官网给出的使用步骤,(所有的操作都是在导入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);}
执行结果:
数据库:
乐观锁的概念就是,当一个线程去操作一个被加了乐观锁的数据时,它拿到这把锁,并不会将其他的线程挡在外边,它很乐观,认为它在操作数据的时候,没有其它的线程来影响它。乐观锁实现的原理是:采用一个版本号机制,如下图
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常用的功能