服务器端分页查询(转载并编辑)

 点击指定页数显示该页数据

 点击上一页显示上一页数据

 点击下一页显示下一页数据

 点击最后一页显示最后一页数据

 选择每页显示数据条数

 直接跳转至某页显示该页数据 

有一个隐藏的交互: 计算总页数, 即最后一页是第几页

 

这些交互的实现可以由前端来实现,后端只需提供充分的数据支持:比如:

{
    "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;
posted @ 2018-02-04 20:46  searain  阅读(355)  评论(0)    收藏  举报