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

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. MT【210】四点共圆+角平分线

    (2018全国联赛解答最后一题)在平面直角坐标系$xOy$中,设$AB$是抛物线$y^2=4x$的过点$F(1,0)$的弦,$\Delta{AOB}$的外接圆交抛物线于点$P$(不同于点$A,O,B$ ...

  2. 【刷题】UOJ #374 【ZJOI2018】历史

    九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰好 \(n-1\) 条双向道路联通, ...

  3. 掌握 MySQL 这 19 个骚操作,效率至少提高3倍

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,利用好这19条方法,会让你的效率提升至少3倍. 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单 ...

  4. Python向来以慢著称,为啥Instagram却唯独钟爱它?

    PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会,大会由 Python 社区组织,每年举办一次.在 Python 2017 上,Instagram 的工程师们带来了一个有关 Py ...

  5. Asp.net与office web apps的整合

    其实网上有关office web app的整合已经有相关的文章了,典型的是如何整合Office Web Apps至自己开发的系统(一) 和如何整合Office Web Apps至自己开发的系统(二), ...

  6. cf860E Arkady and A Nobody-men (树剖)

    容易得出,如果我们按照深度一层一层地做,做完一层后,这层某个点的答案就是它的祖先们的子树大小(统计大小时不包括树根) 由于我太菜了不会别的方法,虽然N是5e5的,还是只好用一个树剖(树状数组降常数)水 ...

  7. JAVA多线程之中断机制(如何处理中断?)

    一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且 ...

  8. DownloadProvider 源码详细分析

    DownloadProvider 简介 DownloadProvider 是Android提供的DownloadManager的增强版,亮点是支持断点下载,提供了“开始下载”,“暂停下载”,“重新下载 ...

  9. SDL2.0 VLC ubuntu安装和黑屏问题

    开发环境安装: 1,执行:"sudo apt-get build-dep libsdl1.2",确定依赖库都装全了. sdl2.0没有正式发布到ubuntu,使用下面方法安装: h ...

  10. C# 随机四位数验证码

    string str ="abcdefghigklmnopqrstuvwxyzABCDEFJHIGKLMNOPQRSTUVWXYZ1234567890"; while(true){ ...