package org.dayatang.utils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 功能描述: 分页对象. 包含当前页数据及分页信息如总记录数.
*
* @author yshzhong
*
*/
public class Page<T> implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5859907455479273251L;
public static final int DEFAULT_PAGE_SIZE = 10;
private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数
private long start; // 当前页第一条数据在List中的位置,从0开始
private List<T> data = new ArrayList<T>(); // 当前页中存放的记录,类型一般为List
private long resultCount; // 总记录数
/**
* 默认构造方法.
*
* @param start 本页数据在数据库中的起始位置
* @param totalSize 数据库中总记录条数
* @param data 本页包含的数据
*/
public Page(long start, long totalSize, List<T> data) {
Assert.isTrue(start >= 0, "Start must not be negative!");
Assert.isTrue(totalSize >= 0, "Total size must not be negative!");
this.start = start;
this.resultCount = totalSize;
this.data = data;
if (this.data == null) {
this.data = new ArrayList<T>();
}
}
/**
* 获得第一条记录的截取位置
* @return 第一条记录的截取位置
*/
public long getStart() {
return start;
}
/**
* 默认构造方法.
*
* @param start 本页数据在数据库中的起始位置
* @param totalSize 数据库中总记录条数
* @param pageSize 本页容量
* @param data 本页包含的数据
*/
public Page(long start, long totalSize, int pageSize, List<T> data) {
this(start, totalSize, data);
Assert.isTrue(pageSize > 0, "Page size must be greater than 0!");
this.pageSize = pageSize;
}
/**
* 取总记录数.
* @return 符合查询条件的记录总数
*/
public long getResultCount() {
return this.resultCount;
}
/**
* 取总页数.
* @return 符合查询条件的记录总页数
*/
public long getPageCount() {
if (resultCount % pageSize == 0) {
return resultCount / pageSize;
} else {
return resultCount / pageSize + 1;
}
}
/**
* 取每页数据容量.
* @return 每页可容纳的记录数量
*/
public int getPageSize() {
return pageSize;
}
/**
* 取当前页中的记录.
* @return 当前数据页
*/
public List<T> getData() {
return data;
}
/**
* 取该页当前页码,0为第一页
* @return 当前页的页码
*/
public long getPageIndex() {
return start / pageSize;
}
/**
* 该页是否有下一页.
* @return 如果当前页是最后一页,返回false,否则返回true
*/
public boolean hasNextPage() {
return this.getPageIndex() < this.getPageCount() - 1;
}
/**
* 该页是否有上一页.
* @return 如果当前页码为0,返回true,否则返回false
*/
public boolean hasPreviousPage() {
return this.getPageIndex() > 0;
}
/**
* 获取任一页第一条数据在数据集的位置.
*
* @param pageIndex 从0开始的页号
* @param pageSize 每页的容量
* @return 该页第一条数据在符合条件的查询结果中的位置。
*/
public static int getStartOfPage(int pageIndex, int pageSize) {
return pageIndex * pageSize;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}