O(∩_∩)O~

創(chuàng)新互聯(lián)建站主營陸豐網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),陸豐h5微信小程序開發(fā)搭建,陸豐網(wǎng)站營銷推廣歡迎陸豐等地區(qū)企業(yè)咨詢
真巧,我最近也在研究分頁技術(shù),當(dāng)時我用的是STRUTS+JDBC+JSP做的網(wǎng)上類當(dāng)當(dāng)網(wǎng),
我總結(jié)的,你看看。
下面經(jīng)過我測試,肯定正確。
你自己再理理。
目前比較廣泛使用的分頁方式是將查詢結(jié)果緩存在HttpSession或有狀態(tài)bean中,翻頁的時候從緩存中取出一頁數(shù)據(jù)顯示。這種方法有兩個主要的缺點:一是用戶可能看到的是過期數(shù)據(jù);二是如果數(shù)據(jù)量非常大時第一次查詢遍歷結(jié)果集會耗費很長時間,并且緩存的數(shù)據(jù)也會占用大量內(nèi)存,效率明顯下降。
其它常見的方法還有每次翻頁都查詢一次數(shù)據(jù)庫,從ResultSet中只取出一頁數(shù)據(jù)(使用rs.last();rs.getRow()獲得總計錄條數(shù),使用rs.absolute()定位到本頁起始記錄)。這種方式在某些數(shù)據(jù)庫(如oracle)的JDBC實現(xiàn)中差不多也是需要遍歷所有記錄,實驗證明在記錄數(shù)很大時速度非常慢。
至于緩存結(jié)果集ResultSet的方法則完全是一種錯誤的做法。因為ResultSet在Statement或Connection關(guān)閉時也會被關(guān)閉,如果要使ResultSet有效勢必長時間占用數(shù)據(jù)庫連接。
因此比較好的分頁做法應(yīng)該是每次翻頁的時候只從數(shù)據(jù)庫里檢索頁面大小的塊區(qū)的數(shù)據(jù)。這樣雖然每次翻頁都需要查詢數(shù)據(jù)庫,但查詢出的記錄數(shù)很少,網(wǎng)絡(luò)傳輸數(shù)據(jù)量不大,如果使用連接池更可以略過最耗時的建立數(shù)據(jù)庫連接過程。而在數(shù)據(jù)庫端有各種成熟的優(yōu)化技術(shù)用于提高查詢速度,比在應(yīng)用服務(wù)器層做緩存有效多了。
在oracle數(shù)據(jù)庫中查詢結(jié)果的行號使用偽列ROWNUM表示(從1開始)。例如select * from employee where rownum10 返回前10條記錄。但因為rownum是在查詢之后排序之前賦值的,所以查詢employee按birthday排序的第100到120條記錄應(yīng)該這么寫:
select * from ( select my_table.*, rownum as my_rownum from ( select name, birthday from employee order by birthday ) my_table where rownum 120 ) where my_rownum=100
mySQL可以使用LIMIT子句:
select name, birthday from employee order by birthday LIMIT 99,20
DB2有rownumber()函數(shù)用于獲取當(dāng)前行數(shù)。
SQL Server沒研究過,
在WEB的項目中,總免不了要分頁,在以前的項目中一般都是采用SQL語言去分頁,但SQL語言不好的一個
地方就是每種數(shù)據(jù)庫可能有一些不同,用hibernate是可以解決這個問題,但是我們的項目沒有用到任何
框架,主要的技術(shù)是jsp+javaBean+servlet,是表現(xiàn)層我采用的是面向?qū)ο蟮姆椒?數(shù)據(jù)庫中的每個表對
應(yīng)一個javaBean,表中的每條記錄就是一個javaBean的對象,所以分頁程序我也采用面向?qū)ο?只要在前
臺拿到一個表的所有記錄,用一個list存起來,然后用進list進行分頁即可.
具體的分頁程序如下:
1 import java.util.*;
2
3 /**
4 * 些類負責(zé)分頁顯示
5 * @author feng
6 */
7 public class PaginationE
8 {
9 private int pageSize;;//每頁記錄數(shù)
10 private int pageCount;//總頁數(shù)
11
12
13 public ListE getList(ListE list,int pageCur){
14 ListE pageList = new ArrayListE();
15 int count = 0;
16 count = list.size();
17 if( count pageCur*pageSize){
18 for(int i = (pageCur-1)*pageSize;i count;i++){
19 pageList.add(list.get(i));
20 }
21 }else{
22 for(int i = (pageCur-1)*pageSize;i pageCur*pageSize;i++){
23 pageList.add(list.get(i));
24 }
25 }
26 return pageList;
27 }
28
29 public int getPageCount(ListE list){
30 int sum = 0;
31 sum = list.size();
32 pageCount = sum/pageSize + 1;
33 return pageCount;
34 }
35
36 public int getPageSize(){
37 return this.pageSize;
38 }
39 public void setPageSize(int pageSize){
40 this.pageSize = pageSize;
41 }
42 }
43
在前臺只要把數(shù)據(jù)庫的數(shù)據(jù)取出,將他放進List中,然后進行分頁即可,例如:
有一表user,對應(yīng)有javaBean為User,先聲明一個List
ListUser list =new ListUser();
然后將user表中的所有記錄查出,然后add進list中,
下面是分頁
PaginationUser p = new PaginationUser();
p.setPageSize(10);
pageCount = p.getPageCount(list);
list = p.getList(list,1)
返回的list就是一頁的對象了,按順序取出顯示即可.
如果數(shù)據(jù)庫里有1000萬條記錄,你就把1000萬條全取出來?
1.這樣每次都取全部記錄,對數(shù)據(jù)庫的壓力非常大,性能非常差
2.全部記錄都取出來,放在List中,會造成內(nèi)存溢出
rowid: 表示了記錄的物理地址(不一定是連續(xù)的) 是唯一存在的
rownum:表示了記錄的行號(是連續(xù)的)
兩者沒有必然的聯(lián)系,所以rowid排在前面的行,rownum不一定排在前面。
oracle數(shù)據(jù)庫中,已建立好的存儲過程信息存儲在系統(tǒng)表ALL_SOURCE 中,需要用sysdba身份登錄數(shù)據(jù)庫,進行查詢操作,SQL命令如下:
1
2
3
4
5
SELECT line,text FROM ALL_SOURCE
WHERE TYPE='PROCEDURE'
AND NAME='過程名稱'
AND OWNER='用戶名'
ORDER BY line;
存儲過程分成多行,每一行會存儲為一條數(shù)據(jù),所以,查詢出來的會是多行,line表示行號。
ALL_SOURCE 表中還存儲了以下類型信息:
1
2
3
4
5
6
7
8
9
10
SQL select distinct type from all_source ;
TYPE
------------
TYPE (對象)類型
TYPE BODY 類型體
PROCEDURE a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWrjmvuWfvrycYrAmzuH7B0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW6srHTsrjnz" target="_blank" class="baidu-highlight"存儲過程/a
FUNCTION 函數(shù)
TRIGGER a href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1dWrjmvuWfvrycYrAmzuH7B0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EnW6srHTsrjnz" target="_blank" class="baidu-highlight"觸發(fā)器/a
PACKAGE 包
PACKAGE BODY 包體
通過:rowid。
sql如下:
select t.*,t.rowid from tablename t where ......;
解釋:rowid就是oracle默認的行號,不管你的記錄設(shè)怎么樣的形式,第一列行號永遠是1,以此類推。
當(dāng)前名稱:oracle行號如何表示,oracle數(shù)據(jù)庫的行號
本文來源:http://chinadenli.net/article11/dsidhdd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、面包屑導(dǎo)航、做網(wǎng)站、網(wǎng)站導(dǎo)航、動態(tài)網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)