分页查询
分页查询将数据库中庞大的数据分段显示,每页显示用户自定义的行数,提高用户体验度,最主要的是如果一次性从服务器磁盘中读出全部数据到内存,有内存溢出的风险
真假分页
假分页: 其原理还是将所有的数据读到内存中,翻页从内存中读取数据, 优点: 实现简单,性能高 缺点:如果数据大容易造成内存溢出
真分页: 每次翻页从数据库查询数据(即磁盘) , 优点 : 不容易造成内存溢出 缺点: 实现复杂,性能相对低一些
分页效果
一般分页的功能包括: 首页 上一页 下一页 末页 当前是多少页 总共多少页 一共多少行数据 跳转到第几页 每页多少条数据 我们需要将这个数据查询出来封装到一个对象中,体现了封装思想,也节省了很多复杂代码
分页需要传递的参数
需要用户传入的参数:
currentPage: 当前页,跳转到第几页, 第一次访问,我们创建一个对象,默认值是1
pageSize: 每页显示多少行数据, 第一次我们也给个默认值 比如10条
分页需要展示的数据
- 当前页的货品信息
- 首页是第几页
- 上一页是第几页
- 下一页是第几页
- 一共有多少页,和末页的值是一样的
- 数据一共有多少条(行)
- 当前是第几页
- 每页显示多少条信息
分页需要展示的数据的来源
来源于用户上传: 当前页 , 每页显示多少条数据
来源于数据库查询 : 数据总条数 , 每一页需要展示的商品信息
来源于根据上面的已知信息计算 : 总页数 , 上一页 , 下一页
书写从数据库查询的sql语句
第一条sql 查询数据库中有多少条数据,COUNT后面不能有空格
SELECT COUNT(*) FROM 表名
第二条sql 根据传入的参数查询第几页,一页多少条数据的结果集
# 第一个 ?:从哪一个索引的数据开始查询(默认从 0 开始)
# 第二个 ?:查询多少条数据
SELECT * FROM 表名 LIMIT ?, ?
接下来分析第二条 SQL 中两个 取值来源:
假设 product 表中有 21 条数据,每页分 5 条数据:
查询第一页数据:SELECT * FROM product LIMIT 0, 5
查询第二页数据:SELECT * FROM product LIMIT 5, 5
查询第三页数据:SELECT * FROM product LIMIT 10, 5
查询第四页数据:SELECT * FROM product LIMIT 15, 5
通过寻找规律发现:第一个 取值来源于 (currentPage - 1) * pageSize;第二个 取值来源于
pageSize,即都来源于用户传递的分页参数。
总页数,上一页和下一页
// 优先计算总页数
int totalPage = rows % pageSize == 0 ? rows / pageSize : rows / pageSize + 1;
//上一页等于当前页-1,但不能超过1页界限
int prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
//下一页等于当前页+1,但不能超过总页数界限
int nextPage = currentPage + 1 <= totalPage ? currentPage + 1 : totalPage;
分页查询实现
访问流程:
封装需要展示的数据
如果不封装数据,每个数据都需要存到作用域中,数据太分散,不方便统一管理