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   1450811640  阅读(573)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示