一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 分頁技術原理與實現之分頁的意義及方法(一)

分頁技術原理與實現之分頁的意義及方法(一)

2020-05-14 10:20KaneTing JAVA教程

這篇文章主要介紹了分頁技術原理與實現第一篇:為什么要進行分頁及怎么分頁,感興趣的小伙伴們可以參考一下

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

分頁技術原理與實現之分頁的意義及方法(一)

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

從請求發起到返回數據的整個過程
 現在你已經下定決心想要分頁了,在動手書寫代碼之前,先讓我們回想一下,在典型的三層架構中,從請求發起到返回數據的整個過程.如下所示:

分頁技術原理與實現之分頁的意義及方法(一)

在哪里進行分頁
 從上面的圖中我們可以觀察得知,在SQL語句處理完畢后,數據庫,WebApplication和Browser都能進行分頁,那在哪里分頁好呢?
  判斷的標準是速度,顯而易見,數據庫服務器,Web應用服務器和客戶端之間是網絡,如果網絡傳遞的數據量越少,則客戶端獲得響應的速度越快.而且一般來說,數據庫服務器和Web應用服務器的處理能力一般比客戶端要強很多.從這兩點來看,在客戶端分頁的方案是最不可取的.
  其次就剩下了在Web服務器端分頁和在數據庫端分頁兩種方式了,如果選擇在Web服務器端分頁的話,大部分的被過濾掉的數據還是被傳輸到了Web應用服務器端,與其這樣還不如直接在數據庫端進行分頁.
 因此比較好的分頁做法應該是每次翻頁的時候只從數據庫里檢索頁面大小的塊區的數據。這樣雖然每次翻頁都需要查詢數據庫,但查詢出的記錄數很少,網絡傳輸數據量不大,如果使用連接池更可以略過最耗時的建立數據庫連接過程。而在數據庫端有各種成熟的優化技術用于提高查詢速度,比在應用服務器層做緩存有效多了。 

分頁的SQL語句
 如果我們是通過JDBC的方式訪問數據庫,那么就有必要根據數據庫類型采取不同的SQL分頁語句,對于MySQL數據庫,我們可以采用limit語句進行分頁,對于Oracle數據庫,我們可以采用rownum的方式進行分頁.
 (1)MySql的Limit m,n語句
 Limit后的兩個參數中,參數m是起始下標,它從0開始;參數n是返回的記錄數。我們需要分頁的話指定這兩個值即可
 (2)Oracle數據庫的rownum
 在Oracle數據庫中,分頁方式沒有MySql這樣簡單,它需要依靠rownum來實現.
Rownum表示一條記錄的行號,值得注意的是它在獲取每一行后才賦予.因此,想指定rownum的區間來取得分頁數據在一層查詢語句中是無法做到的,要分頁還要進行一次查詢.

?
1
2
3
4
5
6
7
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21

 其中最內層的查詢SELECT * FROM TABLE_NAME表示不進行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的范圍。
 上面給出的這個分頁查詢語句,在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 40這句上。
 選擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM <= 40來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:

?
1
2
3
4
5
6
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40

 對比這兩種寫法,絕大多數的情況下,第一個查詢的效率比第二個高得多。
 這是由于CBO優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對于第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。
 而第二個查詢語句,由于查詢條件BETWEEN 21 AND 40是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道RN代表什么)。因此,對于第二個查詢語句,Oracle最內層返回給中間層的是所有滿足條件的數據,而中間層返回給最外層的也是所有數據。數據的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。
 上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內層查詢是復雜的多表聯合查詢或最內層查詢包含排序的情況一樣有效。

 其實分頁技術還有很多其它技術,比如:Struts、hibernate等等都可實現。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本xxxxx高清免费观看 | 欧美三级一区二区 | 欧美视频网址 | 成人在线观看网站 | 精品久久久噜噜噜久久久app | 欧美一级一级做性视频 | 99在线精品免费视频 | 国产性做久久久久久 | 欧美国产日产精品免费视频 | 日本护士xxxx视频免费 | 美女被的视频 | 午夜 在线播放 | 女同全黄h全肉动漫 | 欧美brazzers| 北岛玲亚洲一区在线观看 | 亚洲一区二区三区福利在线 | 国产目拍亚洲精品一区二区三区 | 波多野结在线观看 | 日日骑夜夜骑 | 日韩成人小视频 | 校园春色自拍偷拍 | 国产亚洲精品一区在线播 | 国产亚洲福利精品一区 | 操老妇| 四虎影院2022| 91精品手机国产露脸 | 国内精品露脸在线视频播放 | 免费亚洲视频 | 四虎影院在线免费 | 我将她侵犯1~6樱花动漫在线看 | 91成人免费视频 | 色婷婷六月丁香在线观看 | 色8| 国产精品久久久久一区二区三区 | 国内精品九一在线播放 | 国产精品酒店视频免费看 | 女子校生下媚药在线观看 | 能播放18xxx18女同 | 五月天在线视频观看 | 亲爱的客栈第二季免费观看完整版 | 国产一级视频久久 |