概述
在实际javaweb项目开发过程中,常常需要使用到分页的功能,特别是针对不同数据表的分页可以说是一件很麻烦的事情,因此这里分享一个通用分页解决方案,该方案可以实现对任意数据表实现分页,使用简单,具体实现请继续阅读。
通用分页工具类(PageUtils)
package com.softeem.pagination.dto;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
/**
* 通用分页工具类
* @author mrchai
*
* @param <T>
*/
public class PageUtils<T> {
/**
* 当前页码
*/
private int currentPage;
/**
* 每页大小
*/
private int pageSize;
/**
* 总数据条数
*/
private int totalNum;
/**
* 首页
*/
private int first = 1;
/**
* 尾页
*/
private int last;
/**
* 总页数
*/
private int totalPage;
/**
* 上一页
*/
private int prev;
/**
* 下一页
*/
private int next;
/**
* 页面序号显示的起始位置
*/
private int startNum;
/**
* 页码显示控制-开始页码
*/
private int start;
/**
* 页码显示控制-结束页码
*/
private int end;
/**
* 显示页码控制-总显示页码(防止页码过多,页面显示拥挤问题)
*/
private int count = 10;
/**
* 数据
*/
private List<T> list = new ArrayList<>();
/**
* 在构造器中根据指定的参数,计算其他所有属性的属性值
* @param currentPage
* @param pageSize
* @param totalNum
*/
public PageUtils(int currentPage, int pageSize, int totalNum) {
this.currentPage = currentPage;
//赋值每天显示的记录条数
this.pageSize = pageSize;
//赋值总记录数(总数据条数)
this.totalNum = totalNum;
//计算获得总页数以及尾页
this.totalPage = this.last = (int)Math.ceil((double)totalNum/pageSize);
//防止当前页小于1
this.currentPage = Math.max(this.currentPage, 1);
//防止当前页超过总页数
this.currentPage = Math.min(this.totalPage, this.currentPage);
//设置上一页:上一页不能小于1
this.prev = Math.max(this.currentPage - 1 , 1);
//设置下一页:下一页不能超过总页数
this.next = Math.min(this.currentPage + 1 , this.totalPage);
//计算获取数据显示的序号位置
this.startNum = (this.currentPage - 1) * pageSize;
//计算显示页码的起始位置:起始位置不能小于1
this.start = Math.max(this.currentPage - this.count/2 , 1);
//计算显示页码的结束位置:结束位置不能超过总页数
this.end = Math.min(this.start + this.count , this.totalPage);
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getFirst() {
return first;
}
public void setFirst(int first) {
this.first = first;
}
public int getLast() {
return last;
}
public void setLast(int last) {
this.last = last;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getPrev() {
return prev;
}
public void setPrev(int prev) {
this.prev = prev;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
public int getStartNum() {
return startNum;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public String toString(){
return JSON.toJSONString(this);
}
}
使用如下(业务层解决方案)
package com.softeem.pagination.service;
import java.util.List;
import com.softeem.pagination.dao.DailyDAO;
import com.softeem.pagination.dto.Daily;
import com.softeem.pagination.dto.PageUtils;
public class DailyService {
public PageUtils query(int currentPage,int pageSize){
DailyDAO dao = new DailyDAO();
//查总数据条数
int totalNum = dao.findTotalNum();
//根据提供的参数构建一个PageUtils对象
PageUtils<Daily> pu = new PageUtils<>(currentPage, pageSize, totalNum);
//查当前页数据
List<Daily> list = dao.findByPage(pu.getCurrentPage(), pu.getPageSize());
//将查询到的指定页码的数据存储到分页工具对象中
pu.setList(list);
//将分页工具对象返回
return pu;
}
}
使用时,只需在service层中获取需要查询的记录总数,并提供当前页码(currentPage)以及每页显示记录条数(pageSize),用于创建PageUtils对象,然后再讲PageUtils中的当前页和每页记录数获取后作为分页查询条件,调用DAO层实现,获取集合数据,最后将集合数据存储到PageUtils对象,并返回。