由于数据库实训的课程设计,在做项目过程中,需要使项目更加规范的结构和各层间责任分离。无疑地,分页器是其中之一。

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<Entity> { /**
* 存放当前页的数据
*/
private List<Entity> 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<Entity> 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<Entity> getEntitys() {
return entitys;
} /**
* 设置当前页面数据对象,私有,对外屏蔽,防止破坏分页器各属性的一致性
*/
private void setEntitys(List<Entity> 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 + "]";
} }

二、参考文献

  1.[强大的 java 分页器]http://blog.csdn.net/hcmdy/article/details/25251911

  2.[java--分页查询接口设计及分页器的实现]http://blog.csdn.net/u011659172/article/details/18231509

  3.[Java Web(十一) 分页功能的实现]https://www.cnblogs.com/whgk/p/6474396.html

Java EE之分页器设计的更多相关文章

  1. 轻量级Java EE开发框架设计系统应用架构

    首先来说一下Java EE 概述 其中常说的三大框架即是:ssh Spring:功能强大的组件粘合济,能够将你的所有的java功能模块用配置文件的方式组合起来(还让你感觉不到spring的存在)成为一 ...

  2. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  3. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  4. Spring 4 官方文档学习 Spring与Java EE技术的集成

    本部分覆盖了以下内容: Chapter 28, Remoting and web services using Spring -- 使用Spring进行远程和web服务 Chapter 29, Ent ...

  5. 影响Java EE性能的十大问题(转)

    本文作者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.他在性能优化和提升方面也有很深刻的见解,下面他将和大家分享一下常见的10个影响Java EE性能问题 ...

  6. JAVA EE Hibernate基础一之环境配置

    对于JAVA开发高级,hibernate是java三大框架之一,足以见得它的重要性,那么对于hibernate的使用大家有了解多少呢?从今天开始我将带领大家一道共同探讨一下hibernate的知识,h ...

  7. Java EE 学习总结

    1.Java EE WEB 工程项目文件结构 组成:静态HTML页.Servlet.JSP和其他相关的class: 每个组件在WEB应用中都有固定的存放目录. WEB应用的配置信息存放在web.xml ...

  8. JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台

    JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓 ...

  9. JAVA EE企业级开发四步走完全攻略 [转]

    http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...

随机推荐

  1. Linux 编译命令参数

    基本格式:gcc [options] file1 file2... //若不加入参数,则按默认参数依次执行编译.汇编和链接操作,生成的可执行文件名为 a.out 常用参数:-E //只执行预处理操作 ...

  2. BZOJ2214[Poi2011]Shift——模拟

    题目描述 Byteasar bought his son Bytie a set of blocks numbered from to and arranged them in a row in a ...

  3. First Knight UVALive - 4297(优化高斯消元解概率dp)

    题意: 一个矩形区域被分成 m*n 个单元编号为 (1, 1)至 (m, n),左上为 (1, 1),右下为(m, n).给出P(k)i,j,其中 1 ≤ i ≤ m,1 ≤ j ≤ n,1 ≤ k ...

  4. THUWC2019 摸鱼记

    Day1 菜狗选手无人权,衣服没有海星,狗牌手写全糊,餐票不发刷卡,住宿自理宾馆. 人菜没办法. 感受到了自己智商低 不想写了 想原地退役 不知道还要不要走下去

  5. job.yml

    job.yml apiVersion: batch/v1kind: Jobmetadata: name: myjobspec: completions: 6 parallelism: 2 templa ...

  6. 洛谷P3953 逛公园

    DP+图论大毒瘤. 推荐这个博客. 先跑两遍最短路,搞掉一些无用点. 然后选出最短路上的边,做拓扑排序. 然后每层DP. 具体看代码. 用到的数组较多,记得清空. #include <cstdi ...

  7. A1095. Cars on Campus

    Zhejiang University has 6 campuses and a lot of gates. From each gate we can collect the in/out time ...

  8. 【模板】Trie

    代码如下 int trie[maxn][26],tot=1,ed[maxn]; void insert(char *s){ int len=strlen(s+1),now=1; for(int i=1 ...

  9. activeMQ点对点

    摘要: ActiveMQ 点对点消息 Point-to-Point 是一对一 创建消息生产者 /**  * 点对点消息生产者  *   * @author Edward  *   */ public  ...

  10. MySQL中使用like查找汉字 Incorrect string value 解决办法

    用Select…like %…%来查找MySQL的text类型字段的一个中文,却发现查出来的是乱的,发现不少人也遇到这样的问题.在中文排序和查找的时候,汉字的结果是错误的. 原因在于MySQL在查找字 ...