所謂分頁,從資料庫中分,則是封裝一個分頁類。利用分頁對象進行分頁。
但,分頁往往帶查詢條件。
分頁類的三個重要資料:【目前頁碼數】,【資料庫中的總記錄數】,【每頁顯示的資料的條數】
原理:select * from 【表名】 where 【字段名】 like 【'%條件%'】 limit 【開始查詢的索引】,【每頁顯示的資料】
帶查詢條件的分頁分兩步
(1)第一步:查詢出符合條件的資料的總條數
---->select count(*) from 【表名】 where 【字段名】 like 【條件】
(2)第二步:提供三個重要資料,生成分頁對象,然後查詢資料庫中指定頁碼的資料
---->select * from 【表名】 where 【字段名】 like 【'%條件%'】 limit 【開始查詢的索引】,【每頁顯示的資料】
hibernate架構下的分頁【帶查詢條件的分頁核心源代碼】
(1)擷取符合條件的的資料的總記錄數的方法
/**
* 擷取資料庫中帶查詢條件的資料的記錄數
* @Title: countByName
* @Description: TODO(這裡用一句話描述這個方法的作用)
* @param seachName 查詢條件
* @return
* @return Integer 傳回符合條件的資料的總記錄數
* @author 尚曉飛
* @date 2014-7-1 上午9:22:14
*/
public Integer countByName(final String seachName){
return super.getHibernateTemplate().execute(new HibernateCallback<Integer>() {
public Integer doInHibernate(Session session)
throws HibernateException, SQLException {
Query query=session.createSQLQuery("select count(*) from sys_user where sys_user_name LIKE ?");
query.setParameter(0, "%"+seachName+"%");
Number number= (java.lang.Number) query.uniqueResult();
return number.intValue();
}
});
}
(2)跟據符合條件的資料總記錄數,前台提供的目前頁碼數,每頁顯示的資料條數,生成分頁對象
//擷取分頁對象(目前頁碼數,符合條件的資料的總記錄數,每頁顯示的資料條數)
this.page=new Page(num, countRecords, pageRecords);
(3)根據分頁對象,查詢條件,利用hibernate架構進行分頁(可以用sql語句分頁,此處用hql分頁,也是hibernate的分頁)
*
* @Title: queryByQueryName
* @param queryName 查詢條件的參數
* @param firstResult 從第幾條資料開始查詢(分頁對象提供)
* @param maxResult 每頁顯示的資料條數(分頁對象提供)
* @return List<SysUser> 傳回指定頁碼的資料集合
* @date 2014-7-1 下午5:02:07
@SuppressWarnings("unchecked")
public List<SysUser> queryByQueryName( final String queryName,final Integer firstResult,final Integer maxResult){
return (List<SysUser>)super.getHibernateTemplate().executeFind(new HibernateCallback<List<SysUser>>() {
@Override
public List<SysUser> doInHibernate(Session session)
Query query=session.createQuery("from SysUser where sysUserName like ?");//帶查詢條件的分頁hql語句
query.setParameter(0,"%"+queryName+"%");
query.setFirstResult(firstResult);//從第幾條資料開始查詢
query.setMaxResults(maxResult);//每頁顯示多少條資料
return query.list();
(4)分頁類【僅供參考,省去set,get方法,代碼簡單,思路重要】
public class Page{
//每頁顯示資料條數
private int pageSize;
//目前頁碼數
private int pageNum;
//資料庫中總記錄數
private int rowCount;
//總頁數
private int pageCount;
//從多少條記錄開始查詢
private int rowStart;
//是否有上一頁
private boolean hasPrevious=false;
//上一頁
private int previousPage;
//首頁
private int firstPage;
//是否有下一頁
private boolean hasNext=false;
//下一頁
private int nextPage;
//末尾頁
private int lastPage;
//每頁顯示的頁碼數
private int everyPageCount=10;
//每頁開始的頁碼數
private int everyPageStart;
//每頁結束的頁碼數
private int everyPageEnd;
public Page(){}
public Page(String pageSize, String pageNum, int rowCount) {
this.pageSize=pageSize==null?10:Integer.parseInt(pageSize);
this.pageNum=pageNum==null?1:Integer.parseInt(pageNum);
this.rowCount=rowCount;
//總頁數
this.pageCount=(int)Math.ceil(this.rowCount*1.0/this.pageSize);
//當删除最後一頁資料時,會造成pageNum>pageCount,是以指派。
if(this.pageNum>this.pageCount){
this.pageNum=this.pageCount;
}
//每次從第幾條記錄開始查 select * from onesong limit rowStart ,pageSize
this.rowCount=(this.pageNum-1)*this.pageSize;
//當頁碼數大于1則存在上一頁,和首頁
if(this.pageNum>1){
this.hasPrevious=true;
this.previousPage=this.pageNum-1;
this.firstPage=1;
//當頁碼數小于1則存在下一頁,和尾頁
if(this.pageNum<this.pageCount){
this.hasNext=true;
this.nextPage=this.pageNum+1;
this.lastPage=this.pageCount;
//每頁顯示的頁碼數的開始和結束
this.everyPageStart=(this.pageNum-this.pageSize/2)<=0?1:(this.pageNum-this.pageSize/2);
this.everyPageEnd=(this.everyPageStart+this.everyPageCount-1)>=this.pageCount?pageCount:(this.everyPageStart+this.everyPageCount-1);
}