package cn.itcast.oa.domain;
import java.io.Serializable;
import java.util.List;
/**
* 分页功能中的一页的信息(封装对象)
*
* @author 风清杨
* @version V1.0
*/
@SuppressWarnings({ "serial", "rawtypes" })
public class PageBean implements Serializable {
// 指定的或是页面参数
/** 当前页 */
private int currentPage;// 当前页
/** 每页显示多少条数据 */
private int pageSize;// 每页显示多少条数据
// 查询数据库
/** 总记录数 */
private int recordCount;// 总记录数
/** 本页的数据列表 */
private List recordList;// 本页的数据列表
// 计算
/** 总页数 */
private int pageCount;// 总页数
/** 页码列表的开始索引(包含) */
private int beginPageIndex;// 页码列表的开始索引(包含)
/** 页码列表的结束索引(包含) */
private int endPageIndex;// 页码列表的结束索引(包含)
/**
* 只接受前4个必要的属性,会自动计算出其它3个属性的值
*
* @param currentPage
* 当前页
* @param pageSize
* 每页显示多少条数据
* @param recordCount
* 总记录数
* @param recordList
* 本页的数据列表
*/
public PageBean(int currentPage, int pageSize, int recordCount, List recordList) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.recordCount = recordCount;
this.recordList = recordList;
// 计算总页码
this.pageCount = (recordCount + pageSize - 1) / pageSize;
// 计算 beginPageIndex 和 endPageIndex 结束索引
// >> 总页数不多于10页,则全部显示
if (pageCount <= 10) {
beginPageIndex = 1;
endPageIndex = pageCount;
}
// >> 总页数多于10页,则显示当前页附近的共10个页
else {
// >> 当前页附近的共10个页码(前4个 + 当前页 + 后5个)
beginPageIndex = currentPage - 4;
endPageIndex = currentPage + 5;
// >> 当前面的页码不足4个时,则显示前10个页码
if (beginPageIndex < 1) {
beginPageIndex = 1;
endPageIndex = 10;
}
// >> 当后面的页码不足5个时,则显示后10个页码
if (endPageIndex > pageCount) {
endPageIndex = pageCount;
beginPageIndex = pageCount - 10 + 1;
}
}
}
public List getRecordList() {
return recordList;
}
public void setRecordList(List recordList) {
this.recordList = recordList;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public int getBeginPageIndex() {
return beginPageIndex;
}
public void setBeginPageIndex(int beginPageIndex) {
this.beginPageIndex = beginPageIndex;
}
public int getEndPageIndex() {
return endPageIndex;
}
public void setEndPageIndex(int endPageIndex) {
this.endPageIndex = endPageIndex;
}
}
// 公共的查询分页信息的方法(最终版)
public PageBean getPageBean(int pageNum, int pageSize, QueryHelper queryHelper) {
System.out.println("------> DaoSupporImpl.getPageBean(int pageNum, int pageSize, QueryHelper queryHelper)");
List<Object> parameters = queryHelper.getParameters();
// 查询本页的数据列表
Query listQuery = getSession().createQuery(queryHelper.getListQueryHql());// 创建查询对象
if (parameters != null) {// 设置参数
for (int i = 0; i < parameters.size(); i++) {
listQuery.setParameter(i, parameters.get(i));
}
}
listQuery.setFirstResult((pageNum - 1) * pageSize);//
listQuery.setMaxResults(pageSize);//
List list = listQuery.list();// 执行查询
// 查询总记录数量
Query countQuery = getSession().createQuery(queryHelper.getCountQueryHql());
if (parameters != null) {// 设置参数
for (int i = 0; i < parameters.size(); i++) {
countQuery.setParameter(i, parameters.get(i));
}
}
Long count = (Long) countQuery.uniqueResult();// 执行查询
return new PageBean(pageNum, pageSize, count.intValue(), list);
}
package cn.itcast.oa.util;
import java.util.ArrayList;
import java.util.List;
import cn.itcast.oa.base.DaoSupport;
import cn.itcast.oa.domain.PageBean;
import com.opensymphony.xwork2.ActionContext;
/**
* 用于辅助拼接HQL语句_工具
*
* @author 风清杨
* @version V1.0
*/
@SuppressWarnings({ "rawtypes" })
public class QueryHelper {
private String fromClause;// From子句
private String whereClause = "";// Where子句
private String orderByClause = "";// OrderBy子句
private List<Object> parameters = new ArrayList<Object>();// 参数列表
/**
* 生成From子句
*
* @param clazz
* @param alias
* 别名
*/
public QueryHelper(Class clazz, String alias) {
fromClause = " from " + clazz.getSimpleName() + " " + alias;// from User u
}
/**
* 拼接Where子句
*
* @param condition
* @param params
*/
public QueryHelper addCondition(String condition, Object... params) {
// 拼接
if (whereClause.length() == 0) {
whereClause = " where " + condition;// from User u where ?
} else {
whereClause += " and " + condition;// from User u where ?,and ?
}
// 参数
if (params != null) {
for (Object obj : params) {
parameters.add(obj);
}
}
return this;
}
/**
* 如果第一个参数为true,则拼接Where子句
*
* @param append
* @param condition
* @param params
*/
public QueryHelper addCondition(boolean append, String condition, Object... params) {
if (append) {
addCondition(condition, params);
}
return this;
}
/**
* 拼接OrderBy子句
*
* @param propertyName
* 参于排序的属性名
* @param asc
* true表示升序(1,2,3),false表示降序(3,2,1)
*/
public QueryHelper addOrderProperty(String propertyName, boolean asc) {
if (orderByClause.length() == 0) {
orderByClause = " Order by " + propertyName + (asc ? " asc " : " desc ");// from User u where ? order by ? asc/desc
} else {
orderByClause += " , " + propertyName + (asc ? " asc " : " desc ");// from User u where ? order by ? asc/desc,? asc/desc
}
return this;
}
/**
* 如果第一个参数为true,则拼接OrderBy子句
*
* @param append
* @param propertyName
* @param asc
*/
public QueryHelper addOrderProperty(boolean append, String propertyName, boolean asc) {
if (append) {
addOrderProperty(propertyName, asc);
}
return this;
}
/**
* 获取生成用于查询数据列表的HQL语句
*
* @return
*/
public String getListQueryHql() {
return fromClause + whereClause + orderByClause;
}
/**
* 获取生成用于查询总记录数的HQL语句
*
* @return
*/
public String getCountQueryHql() {
return " select count(*) " + fromClause + whereClause;
}
/**
* 获取HQL中的参数值列表
*
* @return
*/
public List<Object> getParameters() {
return parameters;
}
/**
* 查询分页信息,并放到值栈栈顶
* @param service
* @param pageNum
* @param pageSize
*/
public void preparePageBean(DaoSupport<?> service,int pageNum, int pageSize) {
PageBean pageBean = service.getPageBean(pageNum, pageSize, this);
ActionContext.getContext().getValueStack().push(pageBean);
}
}