Mysql 分页

来源:互联网 发布:网络男歌手的伤感歌曲 编辑:程序博客网 时间:2024/06/05 23:22

分页其实很简单,无非就是根据sql语句,加上限制条件,显示从第几条数据,到第几条数据而已。
切入正题,先看一下下面的例子。

我有一张表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页
#第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) * 33 = (2-1) * 36 = (3-1) * 39 = (4-1) * 312= (5-1) * 315= (6-1) * 3


既然我们得到了这个规律,那么下面就容易多了。怎么把它整合到我们的项目当中去?

  1. 首先,我们见一个分页工具类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            //总页数}


所以分页查询还是很简单的。
希望给大家带来一点帮助。





0 0
原创粉丝点击