分页其实很简单,无非就是根据sql语句,加上限制条件,显示从第几条数据,到第几条数据而已。
切入正题,先看一下下面的例子。
我有一张表sjdr_product_detail
首先查询全部:
select * from sjdr_product_detail; //一共17条数据
- 1
分页,就是通过sql语句的limit关键字来限制条件。
select * from sjdr_product_detail limit #{start},#{pageSize};
- 1
start 和 pageSize 都用 #{ } 标注起来,是想让大家知道,这两个值是变量,即需要限制的条件。其实pageSize应该是可以固定的,比如每页显示3条,我们固定死。所以,下面主要的就是来得到这个start的值,那么到底这个值怎么得到呢?请看下面
实验,找出规律
首先,pageSize = 3 ,即每页显示条数为3条
- 查询第1页
#第1页
select * from sjdr_product_detail limit 0,3;
#第2页
select * from sjdr_product_detail limit 3,3;
#第3页
select * from sjdr_product_detail limit 6,3;
#第4页
select * from sjdr_product_detail limit 9,3;
#第5页
select * from sjdr_product_detail limit 12,3;
#第6页
select * from sjdr_product_detail limit 15,3;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
数据一目了然,那么我们来研究一下,页数、start、pageSize 之间的关系
当前页 | start | pageSize |
1 | 0 | 3 |
2 | 3 | 3 |
3 | 6 | 3 |
4 | 9 | 3 |
5 | 12 | 3 |
6 | 15 | 3 |
规律:从以上不难看出: start = (当前页-1)* pageSize
0 = (1-1) * 3
3 = (2-1) * 3
6 = (3-1) * 3
9 = (4-1) * 3
12= (5-1) * 3
15= (6-1) * 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
既然我们得到了这个规律,那么下面就容易多了。怎么把它整合到我们的项目当中去?
- 首先,我们见一个分页工具类PageUtil.class
package cn.sg.util;
/**
* @author ZSL
*/
import java.util.ArrayList;
import java.util.List;
public class PageUtil {
public PageUtil(int curr,int size,int total){
this.pageSize = size;
this.totalPage = total % size == 0 ? total/size : (total/size) + 1;
this.currPage = curr < 1 ? 1 : curr;
this.currPage = curr > this.totalPage ? this.totalPage : this.currPage;
skips = (this.currPage - 1) * this.pageSize;
this.totalCount = total;
}
private int currPage = 1; //当前页
private int pageSize = 10; //每页显示条数
private int totalPage = 0; //总页数
private int totalCount = 0; //总条数
private int skips = 0; //跳过的值,即sql中的start值
private List rows = new ArrayList(); //用来存放查询到的数据集合
//////////////////////////////////////////////////////
//getter、setter 方法
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
public int getSkips() {
return skips;
}
public void setSkips(int skips) {
this.skips = skips;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
2 我这里用的是mybatis
<!-- 查询数量 -->
<select id="getCount" resultType="java.lang.Integer">
select count(1) from sjdr_product_detail;
</select>
<!-- 分页查询 -->
<select id="queryByPage" resultType="Detail" resultMap="detail_resultMap">
select * from sjdr_product_detail order by P_ID DESC
limit #{skips},#{pageSize};
</select>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3 Controller
@RequestMapping("detail_page.htm")
public void queryByPage(HttpServletRequest req, Model model){
//当前页
int curr = Integer.valueOf(req.getParameter("curr"));
//每页显示条数
int size = Integer.parseInt(req.getParameter("size"));
//查询数量
int total = this.detailService.getCount();
PageUtil page = new PageUtil(curr, size, total);
List<Detail> detailList = this.detailService.queryByPage(page);
page.setRows(detailList);
//转成json格式
WriteResponseUtil util = new WriteResponseUtil();
util.writeResponse(JsonUtil.toJSONString(page), res);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
所以分页查询的时候,只要传递页数和每页显示条数即可。我这边是倒叙查询
查询结果:
detail_page.htm?curr=1&size=3
{
"currPage": 1, //第一页
"pageSize": 3, //每页显示条数
"rows": [ //查询数据集合
{
"p_ID": "17",
"p_PIC": "17777"
},
{
"p_ID": "16",
"p_PIC": "16666"
},
{
"p_ID": "15",
"p_PIC": "15555"
}
],
"skips": 0, //相当于sql中的start
"totalCount": 17, //总条数
"totalPage": 6 //总页数
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
所以分页查询还是很简单的。
希望给大家带来一点帮助。