目录:
乐观锁插件使用
第一:什么是乐观锁
第二:为什么需要锁(并发控制)
第三:乐观锁使用MyBatisPlus的解决方式
分页插件的使用
第一步:插件搞里头
第二步:new Page 搞里头
性能测试插件
第一:在MyBatisPlusConfig中设置
第二:在springboot的yml中设置当前环境
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题
针对一种问题的解决方案,为解决问题而生的。解决什么问题呢?主要是解决丢失更新问题如下图理解
为了解决这些并发带来的问题。 我们需要引入并发控制机制。
由于锁这个字眼我们需要在数据库加个字段“version”来控制版本
在类中加个属性
@Version //这就是控制版本的
@TableField(fill = FieldFill.INSERT) //这个方便在添加的时候设置版本初始为1
private Integer version; //版本的字段
下面这个也是MyBatisPlus的一个插件 只需要实现MetaObjectHandler就可以了
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
//这里的“version”就是指定的字段,设置初始值为1,之后每修改一次+1
this.setFieldValByName("version",1,metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
在MyBatis中存在一个乐观锁插件: OptimisticLockerInnerInterceptor
@Configuration
@MapperScan("com.lzz.mapper")
public class MyConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
接下来在做增加数据的时候,调用insert添加方法就可以了。
修改的时候呢,我们需要先查人后再做修改,因为我们为了防止问题的发生,需要先去查询版本号比对才进行后续操作!!
@Configuration
@MapperScan("com.lzz.mapper")
public class MyConfig {
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
@Test
public void testPage(){
Page page = new Page<>(1, 3);
userMapper.selectPage(page,null);
System.out.println(page.getCurrent()); //当前页
System.out.println(page.getRecords());//每页的List集合数据
System.out.println(page.getSize());//每页显示记录的数
System.out.println(page.getTotal()); //总页数
System.out.println(page.getPages());//总也是
System.out.println(page.hasNext()); //下一页.如果有下一页就true,反之false
System.out.println(page.hasPrevious()); //下一页.如果有上一页就true,反之false
}
根据这个插件能测试出自己的sql性能如何
// 性能测试插件
// 开发环境测试,线上不推荐,maxTime指的是 sql 执行最大时长
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor pi=new PerformanceInterceptor();
pi.setMaxTime(100); //最大毫秒数,超出此时间那么sql不执行
pi.setFormat(true);
return pi;
}
#环境设置:dev开发环境、test测试环境、prod生产环境
spring.profiles.active=dev