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

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. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  2. git-stash用法小结

    [时间:2016-10] [状态:Open] [关键词:git,版本控制,版本管理,stash,git储藏] 缘起 今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原因 ...

  3. BZOJ3294 CQOI2011放棋子(动态规划)

    可以看做棋子放在某个位置后该种颜色就占领了那一行一列.行列间彼此没有区别. 于是可以设f[i][j][k]表示前k种棋子占领了i行j列的方案数.转移时枚举第k种棋子占领几行几列.注意行列间是有序的,要 ...

  4. VMware配置Linux虚拟机访问外网

    [虚拟机版本] 系统版本 : Centos 6.8 [连接方法] 网络模式:桥接模式 ps:本人比较喜欢用桥接,直接NAT也是可以的 [配置步骤] 1.配置网卡 #配置命令 vi /etc/sysco ...

  5. String类型的特殊之处

    String是一种特殊的引用类型,那么它究竟特殊在哪里? 请看看下面这个程序,输出什么结果? public static void changeStr(String str) { str = &quo ...

  6. 【题解】 bzoj3956: Count (ST表+单调栈)

    题面 Solution 看了一点点题解,自己又刚了\(2h30min\),刚了出来qwq,我好菜啊qwq 貌似这道题是BZOJ 4826的弱化,弱化都不会qwq凉凉 Solution 首先你可以考虑, ...

  7. linux运维、架构之路-linux文件属性

    1.查看文件属性 ls -lhi 文件属性详细说明 1. 第一列: inode索引节点编号 2. 第二列:文件类型及权限 3. 第三列:硬链接数 4. 第四列:文件或目录所属的用户,即文件的所有者 5 ...

  8. 学习Spring Boot:(二十四)多数据源配置与使用

    前言 随着业务量增大,可能有些业务不是放在同一个数据库中,所以系统有需求使用多个数据库完成业务需求,我们需要配置多个数据源,从而进行操作不同数据库中数据. 正文 JdbcTemplate 多数据源 配 ...

  9. A1100. Mars Numbers

    People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. T ...

  10. 【洛谷P2607】骑士 没有上司的舞会+

    题目大意:给定一个 N 个点的外向树森林,点有点权.从该树中选出若干顶点组成一个集合,满足任意相邻的两个顶点不同时出现在该集合中,求这样集合中点权和的最大值为多少. 题解:与树相比,该题多了环这个结构 ...