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

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. Mysql 悲观锁

    转载:http://chenzhou123520.iteye.com/blog/1860954 悲观锁介绍: 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处 ...

  2. jquery 祖先、子孫、同級

    jquery向上遍歷,獲取祖先元素 parent()獲取選中元素的父 parents()獲取選中元素的所有的祖先節點,一直到文檔的根元素<html> parentUntil(“元素1”)獲 ...

  3. codeforces624A

    Save Luke CodeForces - 624A Luke Skywalker got locked up in a rubbish shredder between two presses. ...

  4. python异常提示表

    Python常见的异常提示及含义对照表如下: 异常名称 描述 BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是 ...

  5. ELK--filebeat nginx模块

    Nginx模块 该nginx模块解析由Nginx HTTP服务器创建的访问和错误日​​志 . 当你运行这个模块的时候,它会执行一些任务: 设置日志文件的默认路径(但不用担心,可以覆盖默认值) 确保每个 ...

  6. BZOJ3835[Poi2014]Supercomputer——斜率优化

    题目描述 Byteasar has designed a supercomputer of novel architecture. It may comprise of many (identical ...

  7. BZOJ3530[Sdoi2014]数数——AC自动机+数位DP

    题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...

  8. day13 for内部机制详解,迭代器

    迭代器定义: 可迭代协议:含有iter方法的都是可以迭代的 迭代器协议: 有.next 方法,和iter的都是迭代器 必须存在终结 特点: 节省空间 方便逐个取值,一个迭代器只能取一次 简单来说:满足 ...

  9. 批量修改SharePoint2013 备用语言

    cls [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") foreach ($we ...

  10. sqlite 日期型 字符串转为日期型

    因为sqlite为弱引用,使用字段前将他强制转为日期型,用datetime.或者最原始的 strftime. SELECT distinct ID from testTable where datet ...