MyBatis-Plus 常用插件
一、MyBatis 插件
MyBatis插件就是对 Executor、StatementHandler、 ParameterHandler、ResultSetHandler 这四个接口上的方法进行拦截,利用JDK 动态代理机制,为这些接口的实现类创建代理对象, 在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑。
-
Executor
MyBatis 的内部执行器,它负责调用 StatementHandler 操作数据库,并把结果集通过 ResultSetHandler 进行自动映射
-
StatementHandler
MyBatis 直接让数据库执行 SQL 脚本的对象。
-
ParameterHandler
MyBatis 实现 SQL 入参设置的对象。
-
ResultSetHandler
MyBatis 把 ResultSet 集合映射成 POJO 的接口对象。
二、MyBatis-Plus 插件
MyBatis-Plus 依据 MyBatis 插件机制,为我们提供了一些开发中常用的插件,我们在开发中使用即可。常用插件如下:
- 自动分页插件:PaginationInnerInterceptor
- 防止全表更新与删除插件:BlockAttackInnerInterceptor
- 乐观锁插件:OptimisticLockerInnerInterceptor
这些插件都实现了 InnerInterceptor 接口
1. 分页插件
MyBatis-Plus 自带的分页插件,即为 BaseMapper 接口中的 selectPage() 方法,简单的配置就可以实现分页功能。
(1)首先需要在配置类或启动类中配置分页插件:
/**
* MybatisPlus 配置类
* 功能:加载分页插件
*/
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
* @return 分页插件bean
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
(2)测试分页查询
@Test
public void testPageSelect(){
//创建分页条件,参数为当前页的页码(current)、每页显示的条数(size),
Page<Student> page = new Page<>(1,3);
//分页查询,参数有两个,第一个是Page类型的(分页对象),第二个是queryWapper类型的。
IPage<Student> iPage = studentMapper.selectPage(page, null);
// 打印分页数据
System.out.println("结果集:"+iPage.getRecords());
System.out.println("总页数:"+iPage.getPages());
System.out.println("总条数:"+iPage.getTotal());
System.out.println("当前页:"+iPage.getCurrent());
System.out.println("每页条数:"+iPage.getSize());
}
2. 防止全表更新与删除插件
作用:分析删除/更新语句,防止小白或者恶意进行删除/更新全表操作。
注意:
- 该插件只支持 MySQL5.6.3 以上版本
- 该插件只建议在开发环境中使用,不建议在生产环境使用
在 MybatisPlus 配置类里面配置防止全表更新与删除插件
//防止全表更新与删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
在检测出来有全表更新或者删除的操作,MybatisPlus 会在服务启动时报异常。
3. 乐观锁插件
修改数据库中的数据时,为了避免同时被其他人修改,最好的办法就是对该数据进行加锁以防止并发。
锁的设计分为悲观锁和乐观锁:
- 悲观锁:悲观锁对数据被外界修改持保守态度。即在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制。
- 乐观锁:乐观锁在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。
MyBatisPlus 乐观锁插件实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
使用 MyBatisPlus 乐观锁插件的步骤:
(1)首先还是在 MybatisPlus 配置类里面配置乐观锁插件
// 乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
(2)修改实体类,添加 version 列并在该属性上面增加 @Version 注解
@Version
private Integer version;
(3)修改数据库表,添加一列整型 version 字段并设置默认值为 0
(4)测试乐观锁插件
@Test
public void testUpdate(){
Student student = Student.builder().id(1).name("李华").version(0).build();
//如果版本号和数据库一致更新成功,版本号+1,如果不一致更新失败
studentMapper.updateById(student);
}