当前位置:网站首页>开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握
开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握
2022-08-04 09:06:00 【InfoQ】
作者:知识浅谈,CSDN签约讲师,后端领域优质创作者,阿里云社区技术博主,热爱分享创作 公众号:知识浅谈
擅长领域:全栈工程师、爬虫、ACM算法
联系方式vx:zsqtcc
分页的出现
- 由于前端在页面显示数据时,希望每个页面只显示指定条数的数据,由于数据量较大,不能够一次性展示,所以就通过限制每个页面固定的条数进行展示。
- 如果数据量较大的话,页面也不一定加载完全,所以造成效率比较差,所以解决方案分页查询就可以很好的解决这个问题了,通过把庞大的数据按照固定的数目显示,在通过上一页或下一页的按钮显示其它的数据。
Mybatis常用四种分页方法总结
limit的传统方式
最常用的mysql分页是使用limit,limit 子句可以被用于强制 select 语句返回指定范围和大小的记录数。limit 接受一个或两个数字参数。参数必须是一个整数常量。
- 如果是一个参数,如limit 10,则表示默认从开始位置开始获取10条数据。
- 如果是两个参数,第一个参数指定的是返回行数的开始位置,第二个参数指定的是返回记录行的数目。Eg: select * from user limit 0,10表示从第0个位置开始获取10条数据。
PageHelper插件的方式
这个的使用方法是在查询数据之前设置一个pageHelper,当进行查询的时候会对查询语句进行拦截,然后在对应的查询语句上添加limit a,b这个分页的语句。
使用方法如下:
- 引入依赖
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
- 使用代码注意
PageHelper.startPage(pageNo, pageSize)
PageResult<List<Employee>> result = new PageResult<>();
//就是下边的这个地方,使用了 pageNo是offset就是开始位置的偏移量,第二个参数pageSize是查询返回的数据的条数
PageHelper.startPage(pageNo, pageSize);
try {
List<Employee> employeeList = employeeService.findAll();
PageInfo<Employee> pageInfo = new PageInfo<>(employeeList);
log.info(String.valueOf(employeeList));
result.setTotal(pageInfo.getTotal());
result.setPages(pageInfo.getPages());
result.setCurrent(pageInfo.getPageNum());
result.setSize(pageInfo.getPageSize());
result.setResult(employeeList);
result.success("查询成功!");
}
- 查询结果
自定义Interceptor的方式
类似于PageHelper,只不过这个是需要自己写Interceptor拦截器的,对于相应的查询进行。有人可能会说:有了PageHelper,为什么还要自定义Inteceptor?
使用分页插件的时候再dao层使用了@Param注解导致了分页失效
像是上边的这种情况,我们只能自定拦截器拦截对应的查询语句得到正确的结果。
RowsBounds方式
相比上边的三中方法是物理分页,这个RowsBounds是逻辑分页,之所以这么说是因为这个是把所有数据查出来之后,然后再取出对应位置的记录。
RowBounds中有2个参数offset和limit。使用这种方式获取所有的ResultSet,从ResultSet中的offset位置开始获取limit个记录。
但这并不意味着JDBC驱动器会将所有的ResultSet存放在内存,实际上只加载小部分数据到内存,如果需要,再加载部分数据到内存
。
代码:
service层:
RowBounds rowbounds = new RowBounds(offset, Integer.parseInt(pageSize));
//用户数据集合
List<Map<String, Object>> userList = userDao.queryUserList(rowbounds);
Dao层:
public List<Map<String, Object>> queryUserList(RowBounds rowbounds);
mapperxml层:
<!-- 查询用户列表 -->
<select id="queryUserList" resultType="java.util.Map">
select * from user
</select>
总结
总的四种方法,前三种属于物理分页,最后一种属于逻辑分页。
边栏推荐
- ShowMeAI —— Show u 三连
- ps抠图怎么抠出来,自学ps软件photoshop2022,ps怎么抠出想要的部分-笔记记录
- Shared_preload_libraries cause many syntaxes not supported
- Anton Paar安东帕密度计比重计维修DMA35性能参数
- Post-94 Byte P7 posted the salary slip: It's really good to make up for this...
- 抬升市场投资情绪,若羽臣是否还需“自身硬”?
- 基于cRIO-904X搭建Simulink与Labview环境
- 三层交换机配置MSTP协议详解【华为eNSP实验】
- Shared_preload_libraries导致很多语法不支持
- 四大网络攻击常见手段及防护
猜你喜欢
随机推荐
leetcode二叉树系列(二叉搜索树篇)
MindSpore:model.train中的dataset_sink_mode该如何理解?
继承和static关键字
C# DirectoryInfo类
记录十条工作中便利的API小技巧
学会 Arthas,让你 3 年经验掌握 5 年功力
张朝阳对话俞敏洪:谈宇宙、谈焦虑、谈创业、谈退休、谈人生
Shell编程的条件语句
今日睡眠质量记录71分
Grafana9.0发布,Prometheus和Loki查询生成器、全新导航、热图面板等新功能!
递归思想
DeLighT:深度和轻量化的Transformer
RL学习笔记(一)
注意力机制
DNS 查询原理详解—— 阮一峰的网络日志
LVGL的多语言转换工具--字体设置的好助手
MindSpore:【mindinsight】【Profiler】用execution_time推导出来的训练耗时远小于真实的耗时
技术实现 | 图像检索及其在高德的应用
MindSpore:MindSpore GPU版本安装问题
MindSpore:损失函数问题










