国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
分頁技術(shù)及其實現(xiàn)

什么是分頁技術(shù)

分頁,是一種將所有數(shù)據(jù)分段展示給用戶的技術(shù).用戶每次看到的不是全部數(shù)據(jù),而是其中的一部分,如果在其中沒有找到自習自己想要的內(nèi)容,用戶可以通過制定頁碼或是翻頁的方式轉(zhuǎn)換可見內(nèi)容,直到找到自己想要的內(nèi)容為止.其實這和我們閱讀書籍很類似.

下頁顯示了兩種常見的分頁方式.


分頁的意義

分頁確實有效,但它一定會加大系統(tǒng)的復(fù)雜度,但可否不分頁呢?如果數(shù)據(jù)量少的話當然可以.但是對于企業(yè)信息系統(tǒng)來說數(shù)據(jù)量不會限制在一個小范圍內(nèi).如果不顧一切的Select * from某個表,再將返回的數(shù)據(jù)一古腦的扔給客戶,即使客戶能夠忍受成千上萬足夠讓人眼花繚亂的表格式數(shù)據(jù),繁忙的網(wǎng)絡(luò),緊張的服務(wù)器也會提出它們無聲的抗議,甚至有時會以徹底的罷工作為終結(jié).這個結(jié)局有點像古代為所欲為的暴君和他忍無可忍的臣民之間的故事.
程序員不是暴君,他希望程序使生活變得更好而不是更糟.考慮到企業(yè)信息系統(tǒng)多是三層甚至更多層架構(gòu)的事實,程序員在向客戶展示數(shù)據(jù)時都應(yīng)該采取分頁的形式.如果他不想被抱怨淹沒或是半夜被電話驚醒的話.

從請求發(fā)起到返回數(shù)據(jù)的整個過程

現(xiàn)在你已經(jīng)下定決心想要分頁了,在動手書寫代碼之前,先讓我們回想一下,在典型的三層架構(gòu)中,從請求發(fā)起到返回數(shù)據(jù)的整個過程.如下所示:


在哪里進行分頁

從上面的圖中我們可以觀察得知,在SQL語句處理完畢后,數(shù)據(jù)庫,WebApplication和Browser都能進行分頁,那在哪里分頁好呢?
判斷的標準是速度,顯而易見,數(shù)據(jù)庫服務(wù)器,Web應(yīng)用服務(wù)器和客戶端之間是網(wǎng)絡(luò),如果網(wǎng)絡(luò)傳遞的數(shù)據(jù)量越少,則客戶端獲得響應(yīng)的速度越快.而且一般來說,數(shù)據(jù)庫服務(wù)器和Web應(yīng)用服務(wù)器的處理能力一般比客戶端要強很多.從這兩點來看,在客戶端分頁的方案是最不可取的.
其次就剩下了在Web服務(wù)器端分頁和在數(shù)據(jù)庫端分頁兩種方式了,如果選擇在Web服務(wù)器端分頁的話,大部分的被過濾掉的數(shù)據(jù)還是被傳輸?shù)搅薟eb應(yīng)用服務(wù)器端,與其這樣還不如直接在數(shù)據(jù)庫端進行分頁.

分頁的SQL語句

如果我們是通過JDBC的方式訪問數(shù)據(jù)庫,那么就有必要根據(jù)數(shù)據(jù)庫類型采取不同的SQL分頁語句,對于MySql數(shù)據(jù)庫,我們可以采用limit語句進行分頁,對于Oracle數(shù)據(jù)庫,我們可以采用rownum的方式進行分頁.

MySql的Limit m,n語句

Limit后的兩個參數(shù)中,參數(shù)m是起始下標,它從0開始;參數(shù)n是返回的記錄數(shù)。我們需要分頁的話指定這兩個值即可.
如右是limit語句的一次應(yīng)用,圖示的SQL語句返回報銷記錄表中第四,第五條報銷額度最大的記錄。


Oracle數(shù)據(jù)庫的rownum

在Oracle數(shù)據(jù)庫中,分頁方式?jīng)]有MySql這樣簡單,它需要依靠rownum來實現(xiàn).
Rownum表示一條記錄的行號,值得注意的是它在獲取每一行后才賦予.因此,想指定rownum的區(qū)間來取得分頁數(shù)據(jù)在一層查詢語句中是無法做到的,要分頁還要進行一次查詢.
右圖是分頁的具體示例,它從帳戶表中返回前十條記錄.


將兩種方案統(tǒng)合起來

實際上兩種方案的核心查詢語句,分頁的起點和終點都是一樣的,只是方言有所不同.如果將特殊的部分封裝起來,對外置以統(tǒng)一的接口,這樣在轉(zhuǎn)換數(shù)據(jù)庫時更換被/* */屏蔽的部分即可.
下頁顯示了統(tǒng)合的函數(shù).

List<BaseDomainObj> fetchPageRecords(int start,int end,String coreSql) throws CannotConnectToDBException,SQLException{
  StringBuffer sb
=new StringBuffer();
  
  
// 下面是Oracle的分頁
  /*sb.append(" Select                              ");
  sb.append("        *                            ");
  sb.append(" from                                ");
  sb.append("        (                            ");
  sb.append("         Select                      ");
  sb.append("                t01.*,               ");
  sb.append("                rownum as newRowNum  ");
  sb.append("         from                        ");
  sb.append("                (                    ");
  sb.append(coreSql);
  sb.append("                ) t01                ");
  sb.append("         where                       ");
  sb.append("                rownum<='"+end+"'    ");
  sb.append("        )                            ");
  sb.append(" where                               ");
  sb.append("        newRowNum>'"+start+"'        ");
*/

  
  
// 下面是MySql的分頁
  sb.append(coreSql+" limit "+start+","+end);
  
  String sql
=sb.toString();   
  
return search(sql);
}

 

Hibernate實現(xiàn)的分頁

如果使用Hibernate取代JDBC,那么上面這一步就不用我們自己費力了,Hiberate會根據(jù)方言的種類選擇不同的方案,具體我們不必知道也不想知道,要分頁直接制定firstRow和maxRow即可,具體函數(shù)如下:

public List<T> findPageDatum(String hql,int firstRow,int maxRow){
      List
<T> result;
  
      Session session
=HibernateUtil.getSession();

      Query q 
= session.createQuery(hql);
      q.setFirstResult(firstRow);
      q.setMaxResults(maxRow);
      result 
=(List<T>) q.list(); 

      session.flush();
      HibernateUtil.closeSession(session);
      
      
return result;
}

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Hibernate 實現(xiàn)分頁查詢
Hibernate 高級查詢技巧
JAVA技巧:Java中的大量數(shù)據(jù)查詢
ORACLE中用ROWNUM分頁并排序的SQL語句
JSP分頁技術(shù)實現(xiàn)
ORACLE分頁查詢SQL語法——最高效的分頁
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服