全栈工程师修炼指南
熊燚(四火)
Oracle 首席软件工程师
32206 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
全栈回顾 (1讲)
加餐 (1讲)
全栈工程师修炼指南
15
15
1.0x
00:00/00:00
登录|注册

38 | 分页的那些事儿

getData()
getLastPageNo()
getTotalPages()
getPageNo()
getPageSize()
Collection data
int pageSize
int totalCount
int pageNo
getPageNo()
hasPrevPage()
hasNextPage()
getEnd()
getStart()
setPageNo(int pageNo)
turnToPrevPage()
turnToNextPage()
int pageSize
int totalCount
select * from (select e.*, rownum r from TABLE_NAME e where rownum<=4) where r>=3
select * from TABLE_NAME limit 3, 4
Page
Paginatior
DynamoDB 的分页 API
Hibernate 分页查询
分页常见问题
分页设计
数据队列
独立的排序版本
结果过滤
数据本身变化
排序不稳定
Oracle
MySQL
ORM 框架的分页接口
充血模型
绑定查询结果的分页对象
单独的分页工具类
逻辑分页
物理分页
扩展阅读
总结思考
重复数据的问题
SQL 实现
其它方法
分页代码设计
分页
分页的那些事儿

该思维导图由 AI 生成,仅供参考

你好,我是四火。
分页是全栈开发中非常常见的一个功能,绝大多数网站都需要用到。这个功能可谓麻雀虽小五脏俱全,是从呈现层、控制器层、到模型层,并和数据存储密切相关的真正的“全栈”功能。有时候你能见到一些清晰、明确的分页,也就是说,你能看到某一个内容的呈现被分成若干页,而当前又是在第几页;而有时候这个功能则是部分模糊了的,比方说,能翻页,但是并不显示总共有多少页。那今天,就让我们来了解一些典型的分页方法,理解分页的一些常见问题和它们的解决方式。

物理分页和逻辑分页

物理分页一般指的就是数据库分页,而逻辑分页则是程序员口中的“内存分页”。前者是通过条件查询的方式,从数据库中取出特定的数据段来,而后者,则是在完整数据都加载在内存中的情况下,从中取出特定段的数据来。
显然我们一般情况下更关注物理分页,因为内存的大小总是更为有限,多数情况下我们希望通过条件查询的方式去数据库中取出特定页来。但是也有反例,比方说某些数据量不大,但是访问频率较高的数据,以“缓存”的形式预加载到内存中,再根据客户端的分页条件返回数据,这种方式一样可以遵循分页接口,但是由于被分页的数据是全部在内存中的,这样的数据一般需要遵循如下几个要求:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

全栈开发中常见的分页功能涉及物理分页和逻辑分页,以及两种分页代码设计方法。物理分页指数据库分页,逻辑分页是程序员口中的“内存分页”。文章介绍了分页设计中的两种实现方式:单独的分页工具类和绑定查询结果的分页对象。此外,还探讨了SQL实现中的细节和问题,如Oracle数据库中的行号问题。文章还讨论了分页中常见的问题——不同页之间的重复数据,并提出了可能的解决方案。总体而言,本文深入浅出地介绍了分页功能在全栈开发中的重要性和实现方式,对于开发人员具有一定的参考价值。文章内容涵盖了分页功能的设计、实现以及常见问题的分析,为读者提供了全面的技术视角。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《全栈工程师修炼指南》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • bob
    请问通常接口返回的“是否有下一页”是如何实现的呢?

    作者回复: 分页的时候,每一页都有一个返回数量的上限(pageSize),我们可以让这个pageSize设置为我们实际需要的数量+1,比如我们每页需要显示50条记录,每次返回最多51条。 这样的话,无论分页的查询是怎样实现的,如果该查询返回了51条记录,表示还有下一页;反之,如果小于51条记录,表示没有下一页了。

    2019-12-28
    1
  • springday
    解决了困扰了我多年的问题。

    作者回复: 😎

    2019-12-07
    1
  • 靠人品去赢
    刚想说重复数据的问题,就提了。 我们遇到情况就是,订单列表无所谓不是第一页,每次到页面触发按钮的时候直接请求最新的数据,量不多可以忽略。 但是首页的展示或者用的比较频繁就不能,这样看起来很怪,之前虎嗅的网页版具有类似的问题,下拉新的一页和上面的数据有相同的。我们的想法是,拿到前一页的最后一个id,作为参数请求下一页放进去控制。貌似有的分页插件有类似的功能,暂时还没研究。

    作者回复: "最后一个 id",就是文中我说的“数据队列”的方式。

    2019-12-06
  • 杜鑫
    请问老师,对于分页数据在redis中的缓存该怎么设计了,怎么保证mysql和redis数据一致性,谢谢老师~
    2020-12-25
    1
  • leslie
    数据库端做limit操作前端页面调用结果集这大概是最方面且最快捷的方式:调用的算法和数据结构同样简单;代价就是资源的消耗。无论是mysql还是sql server分页直接通过类似方式用的最多-时间代价相对小,擅长的东西做事擅长的事情。另外一种方式没尝试过。
    2019-12-06
    1
  • William Ning
    之前没有想过数据重复的问题,还需要阅读第二遍~
    2020-07-30
  • 许童童
    老师这一节讲的第三种方法,数据队列正是我在业务中使用到的,很精妙,很好的解决了问题
    2019-12-06
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部