其他分享
首页 > 其他分享> > 分页查询与显示

分页查询与显示

作者:互联网

分页查询与展示

在web项目中经常会有需要展示某个表中所有数据的需求,例如下面的场景:

image-20191219093548936

这个功能实现很简单,在MVC+DAO的结构下,为DAO增加一个查询所有的方法,执行select *from xxx就可以获取所有数据

问题

当表中数据很多时(成千上万),会不会有问题?

这个问题可以分阶段来思考:

  1. DAO层是否能够一次性从数据库查询出所有数据?
  2. 从数据库返回后,JVM内存是否能够保存这么多?

  3. View层是否能一次性显示全部?

image-20191219102405005

打开页面直接卡死了..

好吧,傻不拉几的测试过程结束了

最后的结论是客户端无法一次性展示过多数据,

另外即使一次性真的可以显示这么多,用户的使用体验其实也是很差的,眼花缭乱...

分页查询与展示

分页查询与展示就是用来解决上述问题

问题的根本原因就在于一次性展示的数据太多,那么解决方案也就是一次性显示一部分数据,这也是分页展示的本质

实现分页:

在MySQL中可以通过limit来对查询结果进行分段

SQL语法:

select *from tableName limit st,n;

参数解析:

st表示查询的起始位置,注意从0开始

n表示需要查询的记录条数

案例:

每页显示3条数据

image-20191219110223936

#如上述显示第一页的第1-3条数据,sql语句为:
select *from food limit 0,3;

#第二页第4-6条数据,sql语句为
select *from food limit 3,3;

#第三页第4-6条数据,sql语句为
select *from food limit 6,3;

计算起始位置:

可以发现n的值是固定的不会变,但是st的值一直变

开发中不可能在sql中把st的值写死,需要根据当前的页码(第几页)来进行计算,

公式:

#设当前页码为 p  每页条数为 n

st = (p-1) * n
#即当前页码减去1 乘以每页条数

计算总页数:

通常还需要显示页码进度当前页码/总页数

在计算总页数时必须先获取数据的总条数,借助聚合函数count来实现

sql语法:

select count(*) from tableName;

有了总条数后,就可以除以每页条数来得到总页数

公式:

#设总条数为 c 每页条数为 n 从页数为tp
tp = c / n

需要注意的是如果有小数,那么需要向上取整,例如总条数10 每页3条,10/3 = 3.3,意味着需要4页才能全部显示

ok到这里页面上所有需要的数据都准备好了

总结一下:

请求交互流程

不分离:
image-20191219144144600

需要注意的是由于请求对象是瞬时的,请求完成立即销毁,所以JSP中的所有参数也就没有了,我们必须维护当前的页码,在JSP和Servlet之间传递,这个问题在前后端分离时不存在,前端可以自己维护页码

分离:

image-20191219144144600

SQL脚本:

#库
create database db1 charset utf8;
#表
 CREATE TABLE `food` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(20) DEFAULT NULL,
  `price` float DEFAULT NULL,
  `unit` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
INSERT INTO `food` VALUES (1,'苹果',5.8,'500g'),(2,'香蕉',3,'1kg'),(3,'橘子',4,'1kg'),(4,'橙子',6,'500g'),(5,'哈密瓜',8.5,'500g'),(6,'榴莲',20,'500g'),(7,'雪莲',4.5,'500g'),(8,'黄瓜',3,'500g'),(9,'辣椒',5.5,'500g'),(10,'葡萄',7,'500g');

源码:

https://github.com/yangyuanhu/PagingShow.git

标签:显示,分页,数据,查询,条数,500g,每页,页码
来源: https://www.cnblogs.com/yangyuanhu/p/12067713.html