• Java EE之分页器设计


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

    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

  • 相关阅读:
    商务通代码
    Ubuntu 创建快捷方式的方法
    Linux安装Nginx
    Linux安装jdk10
    Mycat实现Mysql数据库读写分离
    Mysql主从复制
    SpringBoot整合Redis集群
    Redis集群环境搭建
    SpringBoot整合redis哨兵主从服务
    redis 哨兵机制环境搭建
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/7819257.html
Copyright © 2020-2023  润新知