MybatisPlus------插件(分页、乐观锁)(九)
MybatisPlus自带分页插件,只要简单的配置就可以实现分页功能。
分页插件
创建分页插件拦截器
// 配置类
@Configuration
// 扫描mapper接口所在的包
@MapperScan("com/example/demo/mapper")
public class MyBatisPlusConfig {
//MybatisPlusInterceptor mybatisPlus的拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 配置数据库类型
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
测试结果:
@Test
public void testSelectList(){
// 设置当前页,以及页面显示条数
Page<BaseProcedure> page = new Page<>(1,3);
LambdaQueryWrapper<BaseProcedure> wrapper = new LambdaQueryWrapper<>();
wrapper.select(BaseProcedure::getProcedureName,BaseProcedure::getProcedureCode);
Page<BaseProcedure> page1 = baseProcedureMapper.selectPage(page, wrapper);
// 获取查找结果
List<BaseProcedure> records = page1.getRecords();
System.out.println(records);
// 获取总页数
System.out.println(page1.getPages());
// 获取总记录数
System.out.println(page1.getTotal());
//是否有下一页
System.out.println(page1.hasNext());
//是否有上一页
System.out.println(page1.hasPrevious());
}
自定义分页功能
自定义分页时,需要注意:
@param page Mybatis-Plus所提供的分页对象,必须位于第一个参数的位置。
在具体的sql实现中,不需要编写对Page的处理,会通过分页拦截器自动处理。
测试类:
@Test
public void testSelectList2(){
// 设置当前页,以及页面显示条数
Page<BaseProcedure> page = new Page<>(1,3);
Page<BaseProcedureDto> page1 = baseProcedureMapper
.selcetPage2(page, "测试哈哈哈哈");
// 获取查找结果
List<BaseProcedureDto> records = page1.getRecords();
System.out.println(records);
// 获取总页数
System.out.println(page1.getPages());
// 获取总记录数
System.out.println(page1.getTotal());
//是否有下一页
System.out.println(page1.hasNext());
//是否有上一页
System.out.println(page1.hasPrevious());
}
自定义分页方法:
//自定义分页sql
// 通过name查询信息,并分页
// @param page Mybatis-Plus所提供的分页对象,必须位于第一个参数的位置
// @param procedureName
Page<BaseProcedureDto> selcetPage2(@Param("page")Page page,@Param("procedureName") String procedureName);
}
自定义分页方法实现:
<select id="selcetPage2" resultType="com.example.demo.pojo.BaseProcedureDto">
select procedure_name,procedure_code
FROM base_procedure
<where>
procedure_name = #{procedureName}
</where>
</select>
当传入的size参数为-1时,MybatisPlus会进行全量查询
乐观锁插件
乐观锁:在保存前,检查该变量是否被修改过,如果修改过,则重新取出被修改的后的变量,进行操作。(一般通过version版本号实现,更新时会将版本号和变量同时更新)
悲观锁:同一时刻只允许一个线程操作该变量,其他线程若想使用,则阻塞排队。
实现流程
数据库中添加version字段,取出记录时,获取当前version。
更新语句,更新时:如果where语句中的version版本不对,则更新失败。
UPDATE item_t SET code ='1022'
WHERE code ='1023' AND VERSION = '13'
实体类中新增@Version注解
@Version // 表示乐观锁版本号
private Integer version;
配置乐观锁插件
// 配置类
@Configuration
// 扫描mapper接口所在的包
@MapperScan("com/example/demo/mapper")
public class MyBatisPlusConfig {
//MybatisPlusInterceptor mybatisPlus的拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 配置数据库类型
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
// 添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
在SQL操作时,就不需要对version进行条件判断,和赋值要求。这个字段就和active以及id一样,不需要额外操作。
通用枚举类
创建枚举类,@EnumValue注解
@Getter
public enum SexEnum {
MALE(1,"男"),
FEMALE(2,"女");
@EnumValue //将注解所标识的属性的值存储到数据库中
private Integer sex;
private String sexName;
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getSexName() {
return sexName;
}
public void setSexName(String sexName) {
this.sexName = sexName;
}
}
对象的sex属性
private SexEnum sex
配置文件新增配置:扫描通用枚举类
mybatis-plus:
## 设置log打印执行的SQL语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
## 设置mybatisplus的全局配置
# global-config:
# db-config:
## 设置实体类所对应的表的统一前缀
# table-prefix: base_
## 设置全局id生成策略
## id-type: assign_id
## id-type: assign_uuid
## id-type: auto
## id-type: input
## id-type: none
# 配置类型别名所对应的包
type-aliases-package: com.example.demo.pojo
# 配置扫描通用包
type-enums-package: com.example.demo.enums