Mysql 分页
2015-08-13 16:04
676 查看
分页其实很简单,无非就是根据sql语句,加上限制条件,显示从第几条数据,到第几条数据而已。
切入正题,先看一下下面的例子。
我有一张表sjdr_product_detail
首先查询全部:
分页,就是通过sql语句的limit关键字来限制条件。
start 和 pageSize 都用 #{ } 标注起来,是想让大家知道,这两个值是变量,即需要限制的条件。其实pageSize应该是可以固定的,比如每页显示3条,我们固定死。所以,下面主要的就是来得到这个start的值,那么到底这个值怎么得到呢?请看下面
数据一目了然,那么我们来研究一下,页数、start、pageSize 之间的关系
既然我们得到了这个规律,那么下面就容易多了。怎么把它整合到我们的项目当中去?
首先,我们见一个分页工具类PageUtil.class
2 我这里用的是mybatis
3 Controller
所以分页查询的时候,只要传递页数和每页显示条数即可。我这边是倒叙查询
查询结果:
detail_page.htm?curr=1&size=3
所以分页查询还是很简单的。
希望给大家带来一点帮助。
切入正题,先看一下下面的例子。
我有一张表sjdr_product_detail
首先查询全部:
select * from sjdr_product_detail; //一共17条数据
分页,就是通过sql语句的limit关键字来限制条件。
select * from sjdr_product_detail limit #{start},#{pageSize};
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;
数据一目了然,那么我们来研究一下,页数、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
既然我们得到了这个规律,那么下面就容易多了。怎么把它整合到我们的项目当中去?
首先,我们见一个分页工具类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; } }
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>
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); }
所以分页查询的时候,只要传递页数和每页显示条数即可。我这边是倒叙查询
查询结果:
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 //总页数 }
所以分页查询还是很简单的。
希望给大家带来一点帮助。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 我是运营,我没有假期
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜