本文出自 http://blog.csdn.net/tjpu_lin/article/details/41050475
最近在开发一个项目,项目中有很多数据展示的模块,所以要用到分页,网上搜了很多分页的例子,但是很多实现的方法和自身的代码实例耦合度太高,导致直接拿来用根本不行。
于是自己只能亲自上阵了,关于分页实现大体逻辑是前台需要和后台相互传递页面参数(例如当前页面,页面大小,总共页数等),后台主要接受前台穿过来的pageNum(当前页码),进行数据查询,然后查完数据后返回给前台的同时也要将页面返回给前台,好让前台结合CSS在分页样式中高亮显示出当前页。
步骤大体可以分为以下几步。
1.后台sql查询数据时(底层我用的是Mysql数据库)
前台只需要传递一个pageNum,然后后台定义个页面大小的常量吧,我是定义到Constant类里面,作为一个常量来使用的。
/**
* 分页页面参数
*/
public static final Integer PAGESIZE = 10;
使用的时候用Constant.PAGESIZE来调用。
这时候我们需要了解mysql分页的sql的实现是这样的:
在mysql中,我们用limit来实现分页数据的查询,limit A,B 表示从A开始,往后取B个数。
对于我们来说,第一页就是0-9这10条记录(mysql记录的索引是从0开始的),所以我们第一页取的数据对应的sql是 limit 0,10;以此类推第二页是 limit 10,10,第三页是 limit 20,10 ......
开始的索引值需要我们进行一个简单的计算,Integer startIndex = (pageNum-1)*10,,不理解的将pageNum值代入想一想就知道了。
limit startIndex ,PAGESIZE始终都是放在查询的最后面,即前面什么各种where ,group by, order by全部写好后再接limit
2.后台pageVo类的构建
因为前台需要后台的数据比较多,所以我们将它们封装到一个pageVo对象里面。
下面是我pageVo类的定义
package com.bada.core.vo;
import java.io.Serializable;
import java.util.Map;
/**
* @author Kevin
* 用于分页的类
*/
public class PageVo implements Serializable {
private int curPage;//当前页
private int pageSize;//每页的大小
private int totalRows;//总记录数
private int totalPages;//总页数
private String queryCondition; //查询条件(字符串),用户将查询条件穿到前台然后再传回来
private Map<String,Object> queryConditions; //查询条件,针对多条件
public Map<String, Object> getQueryConditions() {
return queryConditions;
}
public void setQueryConditions(Map<String, Object> queryConditions) {
this.queryConditions = queryConditions;
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRows() {
return totalRows;
}
public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
}
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public String getQueryCondition() {
return queryCondition;
}
public void setQueryCondition(String queryCondition) {
this.queryCondition = queryCondition;
}
@Override
public String toString() {
return "PageVo{" +
"curPage=" + curPage +
", pageSize=" + pageSize +
", totalRows=" + totalRows +
", totalPages=" + totalPages +
", queryCondition='" + queryCondition + '\'' +
", queryConditions=" + queryConditions +
'}';
}
}
其中加的queryCondition和queryConditions变量是关于带查询条件的页面分页时存入查询条件,传到前台,然后点击下一页时传到后台时不会因为缺失查询条件而加载出的数据位空了。
后台需要new一个PageVo的对象出来,然后set对应的参数值,curPage就是pageNum,pageSize是页面大小,这里要注意的事,在进行数据查询后,还需要对满足条件的所有记录做一个计数,去获取总数值。一般 select count(I