由于数据库实训的课程设计,在做项目过程中,需要使项目更加规范的结构和各层间责任分离。无疑地,分页器是其中之一。
1. 本文仅陈述分页器如何实现,关于分页器的其他概念,请自行搜索其他网络资源。
2. 关于如何在各层使用使用PageBean,见本文引用文献3
一、设计实现
/**
* 分页器
* @author Zen Johnny
* @date 2017年11月11日 下午1:19:32
* @notice sql demo:SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
*/
package com.cpms.entity.vo;
import java.util.Collections;
import java.util.List;
public class Pager {
/**
* 存放当前页的数据
*/
private List entitys;
/**
* 每页行数(记录数),默认为10
*/
private int pageSize;
/**
* 默认的每页记录数为10(用于缺省构造器,无set方法)
*/
private static final int DEFAULT_PAGE_SIZE = 10;
/**
* 总行数(总记录数)
*/
private int totalRows;
/**
* 总页数
*/
private int totalPage;
/**
* 当前页数,默认为第一页
*/
private int curPage = 1;
/**
* 前一页
*/
private int prePage;
/**
* 后一页
*/
private int nextPage;
/**
* 数据库开始的指针
* limit begin,offset 中 的m
*/
private int beginCursor;
/**
* 数据库查询记录时候的偏移量
* limit begin,offset 中 的 offset
*/
private int offsetCursor;
/**
* constructor
*/
public Pager() {
this(0, DEFAULT_PAGE_SIZE, 0, Collections.EMPTY_LIST);
}
/**
* constructor
*/
public Pager(int curPage, int pageSize, int totalRows,List entitys) {
this.entitys = entitys;
//↓先得设置总记录和每个页面的记录数,才有办法知道【总页数】等属性
this.totalRows = totalRows;
setPageSize(pageSize);
//↓注意:1.条件:总记录数totalRows和每页记录数pageSize 2.此处计算非常容易产生精度损失
setTotalPage();
//↓条件:总页数totalPage
setCurPage(curPage);
//↓条件:当前页码curPage和每页记录数pageSize
setBeginCursor();
//↓条件:每页记录数pageSize
setOffsetCursor();
//↓条件:当前页页码curPage
setPrePage();
//↓条件:当前页页码curPage和总页数totalPage
setNextPage();
}
public List getEntitys() {
return entitys;
}
/**
* 设置当前页面数据对象,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setEntitys(List entitys) {
this.entitys = entitys;
}
public int getPageSize() {
return pageSize;
}
/**
* 设置页面大小,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setPageSize(int pageSize) {
if(pageSize < 1) {
pageSize = DEFAULT_PAGE_SIZE;
}else {
this.pageSize = pageSize;
}
}
public static int getDefaultPageSize() {
return DEFAULT_PAGE_SIZE;
}
public int getTotalRows() {
return totalRows;
}
/**
* 设置页总记录数,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setTotalRows(int totalRows) {
if(totalRows < 1)
this.totalRows = 0;
else
this.totalRows = totalRows;
}
public int getTotalPage() {
return totalPage;
}
/**
* 设置总页面数,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setTotalPage() {
this.totalPage = (int) Math.ceil((double)totalRows/pageSize);
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
if(curPage < 1)
this.curPage = 1;
else if(curPage > totalPage)
this.curPage = totalPage;
else
this.curPage = curPage;
}
public int getPrePage() {
return prePage;
}
private void setPrePage() {
this.prePage = curPage - 1;
if(this.prePage < 1) //注意:this.prePage[当前]
this.prePage = 1;
}
public int getNextPage() {
return nextPage;
}
/**
* 设置下一页页码,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setNextPage() {
this.nextPage = curPage + 1;
if(this.nextPage > totalPage)//注意:this.nextPage[当前]
this.nextPage = totalPage;
}
public int getBeginCursor() {
return beginCursor;
}
/**
*设置数据库查询记录时的起始游标,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setBeginCursor() {
this.beginCursor = (curPage - 1) * pageSize;
}
public int getOffsetCursor() {
return offsetCursor;
}
/**
*设置数据库查询记录时的游标偏移量,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setOffsetCursor() {
this.offsetCursor = pageSize;
}
/**
* 是否还有上一页
*/
public boolean hasPrePage() {
if(this.prePage == 1) {
return false;
}
return true;
}
/**
* 是否还有下一页
*/
public boolean hasNextPage() {
if(this.nextPage == this.totalPage) {
return false;
}
return true;
}
@Override
public String toString() {
return "Pager [entitys=" + entitys + ", pageSize=" + pageSize + ", totalRows=" + totalRows + ", totalPage="
+ totalPage + ", curPage=" + curPage + ", prePage=" + prePage + ", nextPage=" + nextPage
+ ", beginCursor=" + beginCursor + ", offsetCursor=" + offsetCursor + "]";
}
}