服务器端分页查询(转载并编辑)
点击指定页数显示该页数据
点击上一页显示上一页数据
点击下一页显示下一页数据
点击最后一页显示最后一页数据
选择每页显示数据条数
直接跳转至某页显示该页数据
有一个隐藏的交互: 计算总页数, 即最后一页是第几页
这些交互的实现可以由前端来实现,后端只需提供充分的数据支持:比如:
{
"info": {
"total": 100,
"pageSize": 10,
"pageNum": 1
},
"data": [{
......
}]
}
服务端的不同策略
对于分页来说,服务端需要返回的结果,除了该页的数据外,还有该分页的元数据,包括页码(pageNum)、该页数据条数(pageSize)、以及数据总数(total)
对于每页的数据来说,SQL的扩展版已经可以完整的实现了
SELECT * FROM T_Test LIMIT ${OFFSET}, ${SIZE}
只需做一些逻辑上的转换
int offset = (pageNum - 1) * pageSize;
int size = pageSize;
但是total值的获取却有不同的策略
每次点击页码均计算total
这种策略就是在点击某页页码,执行获取该页数据请求的时候,都附加一条计算总数的SQL:
SELECT COUNT(1) FROM T_Test
将该值赋予total返回
打开第一页的时候就请求total
顾名思义,进入列表页面的时候,前端发送请求获取total
之后相关的获取分页数据的操作都不再执行计算总数的操作
这对后端来说需要增加一个单独的接口来计算总条数,然后载入列表页的时候,前端发送两个请求
服务端一次把数据全部查询出来
这种策略,对服务端来说,就不需要用到SQL本身的分页扩展特性
可以使用一个List容器,通过一次查询,装载List请求的所有数据
之后的分页操作则只简单的转化为List的集合操作
这种策略的弊端在于,如果全量数据非常大的话,服务端的内存可能会hold不住这样的量
此处以mysql为例,但是我相信物以变通在oracle上也一定适用
1、下面是几种limit的方法:原则看看下面几个例子应该就懂了
在数据库中很多地方都会用到,比如当你数据库查询记录有几万、几十万时使用limit查询效率非常快,只需要查询出你需要的数据就可以了·再也不用全表查询导致查询数据库崩溃的情况。
select * from Customer LIMIT 10;--检索前10行数据,显示1-10条数据
select * from Customer LIMIT 1,10;--检索从第2行开始,累加10条id记录,共显示id为2....11
select * from Customer limit 5,10;--检索从第6行开始向前加10条数据,共显示id为6,7....15
select * from Customer limit 6,10;--检索从第7行开始向前加10条记录,显示id为7,8...16
LIMIT是MySQL内置函数,其作用是用于限制查询结果的条数。
1)其语法格式如下:
LIMIT[位置偏移量,]行数
其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依此类推...,第二个参数为“行数”即指示返回的记录条数。
位置偏移量可以理解为跳过前xx条记录(元组).
2)基本用法
|
1
2
3
4
5
6
|
/*当没有指定位置偏移量时,只取4条时,可以这样写*/SELECT * FROM YourTableName LIMIT 4;/*当指定了位置偏移量时,从第3条起取4条时,可以这样写*//*因为索引是从0开始计数的,所以第3条对应的索引就是2*/SELECT * FROM YourTableName LIMIT 2,4; |
3)应用场合:分页
|
1
2
3
4
|
// 后台计算出页码、页数(页大小) int curPage = 2; int pageSize = 10; int startRow = (curPage - 1) * pageSize; |
|
1
|
SELECT * FROM YourTableName LIMIT startRow,pageSize; |
浙公网安备 33010602011771号