Mybatis的PageHelper原理

1.PageHelper原理

PageHelper是mybatis的通用分页插件,通过mybatis的拦截器实现分页功能,拦截sql查询请求,添加分页语句,
最终实现分页查询功能。

在调用dao的service方法中设置分页参数:PageHelper.startPage(page, size),分页参数会设置在ThreadLocal中PageHelper在mybatis执行sql前进行拦截,从ThreadLocal取出分页参数,修改当前执行的sql语句,添加分页sql。最后执行添加了分页sql的sql语句,实现分页查询。

2.PageHelper的实战

# springboot项目

1.首先在pom文件里添加依赖

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper‐spring‐boot‐starter</artifactId>
<version>1.2.4</version>
</dependency>

2.在application.yml里面加入配置

# 配置数据库为mysql ,因为不同数据库,有不同的方言

pagehelper:
helper‐dialect: mysql

3.在mapper接口中定义一个接口

@Mapper
public interface CourseMapper {
//pagehelper测试
Page<CourseBase> findCourseBaseList();
}
返回值类型必须是com.github.pagehelper.Page

4.写个测试类

@Test
public void testPageHelper(){
//给pageHelper设置参数,到ThreadLocal
//pageNum是第几页 ,第1页开始 pageSize每页多少个
PageHelper.startPage(2,5);
Page<CourseBase> pageResult = courseMapper.findCourseBaseList();
List<CourseBase> result = pageResult.getResult() ;//获取结果集
long total = pageResult.getTotal(); //获取总记录数
System.out.println(result);
}
PageHelper.startPage(2,5);的作用就是把这两个分页参数放到ThreadLocal里去

 

这是存放ThreadLocal相关的代码

ThreadLocal就是线程相关的存放变量的地方。当一个请求进来,会开启一个新的线程,一个线程有它自己的ThreadLocal,在ThreadLocal里存放的变量,整个线程可以随时获取到。

随后Mybatis的拦截器会在执行sql之前从ThreadLocal获取分页信息,如果获取到,就会在后面拼接上limit

 

从日志上看,有两个sql执行了,一个查询总数量。

第二个查询从第5个开始查5个记录。也就是第二页。

 

 

 

 


————————————————
版权声明:本文为CSDN博主「-Cristiano-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37457564/article/details/104337081

posted on 2022-06-08 19:48  1450811640  阅读(503)  评论(0编辑  收藏  举报