亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java分頁簡介_動力節(jié)點Java學院整理

 更新時間:2017年08月14日 10:46:55   作者:java-source  
這篇文章主要為大家詳細介紹了Java分頁簡介的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是分頁技術(shù)

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

分頁的意義

分頁確實有效,但它一定會加大系統(tǒng)的復雜度,但可否不分頁呢?如果數(shù)據(jù)量少的話當然可以.但是對于企業(yè)信息系統(tǒng)來說數(shù)據(jù)量不會限制在一個小范圍內(nèi).如果不顧一切的Select * from某個表,再將返回的數(shù)據(jù)一古腦的扔給客戶,即使客戶能夠忍受成千上萬足夠讓人眼花繚亂的表格式數(shù)據(jù),繁忙的網(wǎng)絡,緊張的服務器也會提出它們無聲的抗議,甚至有時會以徹底的罷工作為終結(jié).這個結(jié)局有點像古代為所欲為的暴君和他忍無可忍的臣民之間的故事.

程序員不是暴君,他希望程序使生活變得更好而不是更糟.考慮到企業(yè)信息系統(tǒng)多是三層甚至更多層架構(gòu)的事實,程序員在向客戶展示數(shù)據(jù)時都應該采取分頁的形式.如果他不想被抱怨淹沒或是半夜被電話驚醒的話.

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

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

 

在哪里進行分頁

從上面的圖中我們可以觀察得知,在SQL語句處理完畢后,數(shù)據(jù)庫,WebApplication和Browser都能進行分頁,那在哪里分頁好呢?

判斷的標準是速度,顯而易見,數(shù)據(jù)庫服務器,Web應用服務器和客戶端之間是網(wǎng)絡,如果網(wǎng)絡傳遞的數(shù)據(jù)量越少,則客戶端獲得響應的速度越快.而且一般來說,數(shù)據(jù)庫服務器和Web應用服務器的處理能力一般比客戶端要強很多.從這兩點來看,在客戶端分頁的方案是最不可取的.

其次就剩下了在Web服務器端分頁和在數(shù)據(jù)庫端分頁兩種方式了,如果選擇在Web服務器端分頁的話,大部分的被過濾掉的數(shù)據(jù)還是被傳輸?shù)搅薟eb應用服務器端,與其這樣還不如直接在數(shù)據(jù)庫端進行分頁.

因此比較好的分頁做法應該是每次翻頁的時候只從數(shù)據(jù)庫里檢索頁面大小的塊區(qū)的數(shù)據(jù)。這樣雖然每次翻頁都需要查詢數(shù)據(jù)庫,但查詢出的記錄數(shù)很少,網(wǎng)絡傳輸數(shù)據(jù)量不大,如果使用連接池更可以略過最耗時的建立數(shù)據(jù)庫連接過程。而在數(shù)據(jù)庫端有各種成熟的優(yōu)化技術(shù)用于提高查詢速度,比在應用服務器層做緩存有效多了。

分頁的SQL語句

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

(1)MySql的Limit m,n語句

Limit后的兩個參數(shù)中,參數(shù)m是起始下標,它從0開始;參數(shù)n是返回的記錄數(shù)。我們需要分頁的話指定這兩個值即可

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

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

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM <= 40
)
WHERE RN >= 21

其中最內(nèi)層的查詢SELECT * FROM TABLE_NAME表示不進行翻頁的原始查詢語句。ROWNUM <= 40和RN >= 21控制分頁查詢的每頁的范圍。

上面給出的這個分頁查詢語句,在大多數(shù)情況擁有較高的效率。分頁的目的就是控制輸出結(jié)果集大小,將結(jié)果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現(xiàn)在WHERE ROWNUM <= 40這句上。

選擇第21到40條記錄存在兩種方法,一種是上面例子中展示的在查詢的第二層通過ROWNUM <= 40來控制最大值,在查詢的最外層控制最小值。而另一種方式是去掉查詢第二層的WHERE ROWNUM <= 40語句,在查詢的最外層控制分頁的最小值和最大值。這是,查詢語句如下:

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
)
WHERE RN BETWEEN 21 AND 40

對比這兩種寫法,絕大多數(shù)的情況下,第一個查詢的效率比第二個高得多。

這是由于CBO優(yōu)化模式下,Oracle可以將外層的查詢條件推到內(nèi)層查詢中,以提高內(nèi)層查詢的執(zhí)行效率。對于第一個查詢語句,第二層的查詢條件WHERE ROWNUM <= 40就可以被Oracle推入到內(nèi)層查詢中,這樣Oracle查詢的結(jié)果一旦超過了ROWNUM限制條件,就終止查詢將結(jié)果返回了。

而第二個查詢語句,由于查詢條件BETWEEN 21 AND 40是存在于查詢的第三層,而Oracle無法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒有意義,因為最內(nèi)層查詢不知道RN代表什么)。因此,對于第二個查詢語句,Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù),而中間層返回給最外層的也是所有數(shù)據(jù)。數(shù)據(jù)的過濾在最外層完成,顯然這個效率要比第一個查詢低得多。

上面分析的查詢不僅僅是針對單表的簡單查詢,對于最內(nèi)層查詢是復雜的多表聯(lián)合查詢或最內(nèi)層查詢包含排序的情況一樣有效。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Elasticsearch(ES)多種查詢方式案例

    Elasticsearch(ES)多種查詢方式案例

    Elasticsearch是一個分布式的RESTful搜索和分析引擎,可讓您輕松地大規(guī)模存儲,搜索和分析,這篇文章主要給大家介紹了關(guān)于Elasticsearch(ES)多種查詢方式的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • JavaFX之TableView的使用詳解

    JavaFX之TableView的使用詳解

    這篇文章主要介紹了JavaFX之TableView的使用,有需要的朋友可以參考一下
    2013-12-12
  • SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解

    SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解

    這篇文章主要介紹了SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解,因為案例代碼用到了hutool提供的DesensitizedUtil數(shù)據(jù)脫敏工具類,這里要引入hutool的依賴,如果你需要自定義 數(shù)據(jù)脫敏的邏輯,可以不引入這個依賴,需要的朋友可以參考下
    2024-01-01
  • SpringBoot實現(xiàn)接口防刷的兩種方法

    SpringBoot實現(xiàn)接口防刷的兩種方法

    接口被刷指的是同一接口被頻繁調(diào)用,可能是由于以下原因?qū)е拢簮阂夤艉驼`操作或程序錯誤,本文給大家介紹了SpringBoot實現(xiàn)接口防刷的兩種方法,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • 關(guān)于ArrayList的動態(tài)擴容機制解讀

    關(guān)于ArrayList的動態(tài)擴容機制解讀

    這篇文章主要介紹了關(guān)于ArrayList的動態(tài)擴容機制解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java中的內(nèi)存模型JMM詳細解讀

    Java中的內(nèi)存模型JMM詳細解讀

    這篇文章主要介紹了Java中的內(nèi)存模型JMM詳細解讀,Java?對內(nèi)存的抽象模型如下,每個線程都有一塊自己的私有內(nèi)存(也稱為工作內(nèi)存),當線程使用變量時,會把主內(nèi)存里面的變量復制到工作內(nèi)存,線程讀寫變量時操作的是自己工作內(nèi)存中的變量,需要的朋友可以參考下
    2023-12-12
  • 快速解決VS Code報錯:Java 11 or more recent is required to run. Please download and install a recent JDK

    快速解決VS Code報錯:Java 11 or more recent is required to run. Ple

    這篇文章主要介紹了快速解決VS Code報錯:Java 11 or more recent is required to run. Please download and install a recent JDK的相關(guān)資料,需要的朋友可以參考下
    2020-09-09
  • 實例解析如何正確使用Java數(shù)組

    實例解析如何正確使用Java數(shù)組

    同一種類型數(shù)據(jù)的集合。其實數(shù)組就是一個容器。運算的時候有很多數(shù)據(jù)參與運算,那么首先需要做的是什么下面我們就一起來看看。
    2016-07-07
  • 分隔List集合,按指定大小,將集合分成多個的方法

    分隔List集合,按指定大小,將集合分成多個的方法

    下面小編就為大家?guī)硪黄指鬖ist集合,按指定大小,將集合分成多個的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java流程控制之循環(huán)結(jié)構(gòu)for,增強for循環(huán)

    Java流程控制之循環(huán)結(jié)構(gòu)for,增強for循環(huán)

    這篇文章主要介紹了Java流程控制之循環(huán)結(jié)構(gòu)for,增強for循環(huán),for循環(huán)是編程語言中一種循環(huán)語句,而循環(huán)語句由循環(huán)體及循環(huán)的判定條件兩部分組成,其表達式為:for(單次表達式;條件表達式;末尾循環(huán)體){中間循環(huán)體;},下面我們倆看看文章內(nèi)容的詳細介紹
    2021-12-12

最新評論