Hibernate+Struts分页代码介绍
关于分页显示方面的文章,网上搜索会有好几大箩,当然每个人都有自己的思路和出发点。我的基本思路也很简单,就是将搜索过程分为两个部分:“预搜索”和“分页显示”。预搜索负责查询记录主键ID集,并且在整个查询分页过程中只执行一次;分页显示负责从预搜索的主键ID集中找出当前要显示的记录,每进行一次翻页操作便执行一次,从而实现分页显示功能。由于查询的Where条件为主键ID,并且每次只查询当页显示的记录数(比如:20条),所以在重量级查询中有着一定的性能优势。 本文主要从以下三个方面(三篇文章)来进行讲解: 1. 构建生成分页变量实体、存储查询结果实体 2. 预搜索类、分页搜索类、HibernateUtil工具类部分关联代码 3. 实现预搜索、分页搜索的两个类及用Struts的Action调用分页实例 注:View视图层的JSP代码未贴出来,相信大家在得到Result后都知道如何用Struts标签显示 首先我们为查询分页构建三个基础类:Page(保存分页的当前状态值)、PageUtil(生成Page)、Result(保存查询结果),代码都有详细的文档解释,就不再另作说明了,这三个类的代码分别如下: /**********************************Page类*********************************************/ package com.nyhr.struts.page; /** * 分页实体类,保存当前分页状态变量 * @author Yeno.hhr */ public class Page { /** imply if the page has previous page */ private boolean hasPrePage; /** imply if the page has next page */ private boolean hasNextPage; /** the number of every page */ private int everyPage; /** the total page number */ private int totalPage; /** the total record number */ private int totalRecords; /** the number of current page */ private int currentPage; /** the begin index of the records by the current query */ private int beginIndex; /** The default constructor */ public Page(){ } /** construct the page by everyPage * @param everyPage * */ public Page(int everyPage){ this.everyPage = everyPage; } /** The whole constructor */ public Page(boolean hasPrePage, boolean hasNextPage, int everyPage, int totalPage, int totalRecords, int currentPage, int beginIndex) { this.hasPrePage = hasPrePage; this.hasNextPage = hasNextPage; this.everyPage = everyPage; this.totalPage = totalPage; this.totalRecords = totalRecords; this.currentPage = currentPage; this.beginIndex = beginIndex; } /** * @return * Returns the beginIndex. */ public int getBeginIndex() { return beginIndex; } /** * @param beginIndex * The beginIndex to set. */ public void setBeginIndex(int beginIndex) { this.beginIndex = beginIndex; } /** * @return * Returns the currentPage. */ public int getCurrentPage() { return currentPage; } /** * @param currentPage * The currentPage to set. */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } /** * @return * Returns the everyPage. */ public int getEveryPage() { return everyPage; } /** * @param everyPage * The everyPage to set. */ public void setEveryPage(int everyPage) { this.everyPage = everyPage; } /** * @return * Returns the hasNextPage. */ public boolean getHasNextPage() { return hasNextPage; } /** * @param hasNextPage * The hasNextPage to set. */ public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } /** * @return * Returns the hasPrePage. */ public boolean getHasPrePage() { return hasPrePage; } /** * @param hasPrePage * The hasPrePage to set. */ public void setHasPrePage(boolean hasPrePage) { this.hasPrePage = hasPrePage; } /** * @return Returns the totalPage. * */ public int getTotalPage() { return totalPage; } /** * @param totalPage * The totalPage to set. */ public void setTotalPage(int totalPage) { this.totalPage = totalPage; } /** * @param totalRecords * The totalRecords to set. */ public void settotalRecords(int totalRecords) { this.totalRecords = totalRecords; } /** * @return Returns the totalRecords. * */ public int getTotalRecords() { return this.totalRecords; } } /**********************************PageUtil类*********************************************/ package com.nyhr.struts.page; /** * 分页工具类,初始化Page对象 * @author Yeno.hhr */ public class PageUtil { /** * Use the origin page to create a new page * @param page * @param totalRecords * @return */ public static Page createPage(Page page, int totalRecords){ return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords); } /** * the basic page utils not including exception handler * @param everyPage * @param currentPage * @param totalRecords * @return page */ public static Page createPage(int everyPage, int currentPage, int totalRecords){ everyPage = getEveryPage(everyPage); currentPage = getCurrentPage(currentPage); int beginIndex = getBeginIndex(everyPage, currentPage); int totalPage = getTotalPage(everyPage, totalRecords); boolean hasNextPage = hasNextPage(currentPage, totalPage); boolean hasPrePage = hasPrePage(currentPage); return new Page(hasPrePage, hasNextPage, everyPage, totalPage, totalRecords, currentPage, beginIndex); } private static int getEveryPage(int everyPage){ return everyPage == 0 ? 10 : everyPage; } private static int getCurrentPage(int currentPage){ return currentPage == 0 ? 1 : currentPage; } private static int getBeginIndex(int everyPage, int currentPage){ return (currentPage - 1) * everyPage; } private static int getTotalPage(int everyPage, int totalRecords){ int totalPage = 0; if(totalRecords % everyPage == 0) totalPage = totalRecords / everyPage; else totalPage = totalRecords / everyPage + 1 ; return totalPage; } private static boolean hasPrePage(int currentPage){ return currentPage == 1 ? false : true; } private static boolean hasNextPage(int currentPage, int totalPage){ return currentPage == totalPage || totalPage == 0 ? false : true; } } /**********************************Result类*********************************************/ package com.nyhr.struts.page; import java.util.List; /** * <p>Title: 检索结果集实体类</p> * <p>Description: 保存分页参数及数据库查询的结果,用于页面显示</p> * <p>Copyright: Copyright (c) 2006</p> * <p>Company: 四方人才网</p> * @author Yeno.hhr * @version 1.0 */ public class Result { /**分页状态变量实体*/ private Page page; /**数据库检索到的当前页结果集*/ private List content; /** * The default constructor */ public Result() { super(); } /** * The constructor using fields * * @param page * @param content */ public Result(Page page, List content) { this.page = page; this.content = content; } /** * @return Returns the content. */ public List getContent() { return content; } /** * @return Returns the page. */ public Page getPage() { return page; } /** * The content to set. * @param content */ public void setContent(List content) { this.content = content; } /** * The page to set. * @param page */ public void setPage(Page page) { this.page = page; } } 现在展示在大家面前的是查询分页两个核心类 :AbstractSearch(预查询初始化程序)、AbstractList(分页及初始化分页程序),代码如下: /********************************AbstractSearch类************************************/ package com.nyhr.struts.frame; import java.util.List; import com.nyhr.struts.beans.HibernateUtil; /** * <p>Title: 预查询初始化程序</p> * <p>Description: 所有的初始化查询必须继承此类,本类只负责预查询ID集和Page对象的初始化,不实现显示逻辑</p> * <p>Copyright: Copyright (c) 2006</p> * <p>Company: 四方人才网</p> * @author Yeno.hhr * @version 1.0 */ public abstract class AbstractSearch { public AbstractSearch() { super(); } /** * 根据HQL查询出记录的主键ID(主索引)集合 * 注:此hql必须是只检索主键及复合主键的查询语句,具体见应用实例 * @param hql 不带查询的查询语句 * @return idArray 主索引集合(可以主键ID,也可以是复合ID) */ public Object[] getIDList(String hql) { List list = HibernateUtil.query(hql); if (list==null || list.size()==0) return null; return list.toArray(); } /** * 根据HQL查询出记录的主键ID(主索引)集合