欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

通用Web分頁功能一例

系統 1629 0
<!--新Google 468x15 橫鏈接單元開始--> <script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; /* 468x15 橫鏈接單元 */ google_ad_slot = "5785741422"; google_ad_width = 468; google_ad_height = 15; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--新Google 468x15 橫鏈接單元結束-->

<!-- Feedsky FEED發布代碼開始 --> 歡迎使用RSS訂閱本Blog <!-- FEED自動發現標記開始 --> <link title="RSS 2.0" type="application/rss+xml" rel="alternate"> <!-- FEED自動發現標記結束 --> Blog 訂閱
用Session和自增鍵實現通用Web分頁功能
Web系統雖然現在很流行,但是分頁問題一直長期困擾著Web系統的開發人員。對于不同的數據庫,可能開發人員對分頁的處理分有很大差別。個人認為,使用MySQL開發Web系統的程序員是感到最舒服的,因為,在MySQL中提供了limit語句,可以獲得查詢結果的一段數據。如下面的SQL語句所示:
  1. select*fromtable1limit1,20

上面的SQL表示從table1中查出記錄,并返回從第2條開始的20條記錄(第1條記錄從0開始)。

對于其他的數據庫,恐怕就沒MySQL那么容易查詢出記錄段了。在SQL Server2005中也提供了類似MySQL的處理方法(可以使用ROW_NUMBER()函數來實現這個功能),SQL語句如下:
  1. WithtAS
  2. (
  3. SELECTcontactid,namestyle,lastname,
  4. ROW_NUMBER()over(orderbynamestyle) as RowNumber
  5. FROMPerson.Contact
  6. )
  7. select*fromt
  8. WhereRowNumberBetween20and30
雖然上面的SQL語句雖然也可以實現和MySQL一樣的功能,但卻比MySQL的limit復雜一些。

如果在數據庫中提供了實現Web分頁的機制,就算復雜一些,也是可以解決的。但有效數據庫可能并未提供這種機制。這就得使用更復雜的方法來實現Web分頁,如在SQL Server2000中未提供ROW_NUMBER()函數,就有很多開發人員通過編寫分頁的存儲過程來處理。這樣做既復雜,又不通用。假設要移植到Oracle上,還得費一番功夫。

在本文給出一種直接使用Web中的Session對象來方式來實現分頁的功能,Session是在Web系統中保存當前分話數據的。我們可以想象。分頁的難點在哪里,就象MySQL中的limit語句一樣,只需要有兩個值:起使記錄數和要獲得的記錄總數就可以了。要獲得的記錄總數這個我們很容易知道,一般就是分一頁的記錄數。但是起使記錄數卻很難獲得。

如果使用自增鍵當然可以,但這要建立在表只增不刪,而且id從1或一個已知的起始位置開始的情況。如果刪除了表中的一些數據,自增鍵就不再是從1到n,依次遞增了。也就是中間可能有空檔。如自增鍵從20至100,中間可能只有10條記錄。因此,單純使用自增鍵并不能很好地解決分頁問題。

但卻可以將Session和自增鍵組合來解決分頁問題。大家可以設想,在用戶第一次查詢時,如select * from table1 where field1 like '%abc%',這時將記錄全部查出。假設每頁顯示50條記錄,這時可以從頭開始取出50條記錄。這不會有任何問題。然后,當用戶要查看第2頁時,最普通的做是再執行一次上面的SQL語句,然后從第51第記錄開始,再取出50條記錄。如果這樣做,將大大浪費服務器的資源。

為了解決這個問題,可以在每一次執行完上面的SQL語句后,除了取出前50條記錄外,再通過記錄的定位,將其他頁面的起始id值保存在Session中(可以放在List對象中)。然后在用戶要查看第2頁或后面的頁時,直接從Session中取出該頁起始id的值,如果使用的是SQL Servlet數據庫,可以使用top n,其中n表示每頁記錄數,來查詢當前頁的記錄。

先拿Java為例來說明一下。下面的代碼在Session中記錄了第一頁到最后一頁的起始id:
  1. //rs為記錄集,其他語言的操作類似
  2. ResultSetrs=stmt.executeQuery( "select*fromtable1wherefield1like'%abc%'" );
  3. int n=1;
  4. while (rs.absolute(n))
  5. {
  6. int id=rs.getInt(id)
  7. //將id保存在Session中
  8. n+=50;
  9. }
從上面的代碼可以看出,使用ResultSet的absolute來定位記錄,并取出當前記錄的id值(一個自增字段),并將其保存在Session中。

假設共查詢出500條記錄,那么Session中保存的id值有可能是下面的樣子:
1 51 123 179 229 290 367 567 699

從上面的id值可以看出,中間有斷檔。但這9個id值之間的記錄數都是50個。如下面的SQL語句將查詢出50個記錄:
  1. select*fromtable1wherefield1like '%abc%' and(id>=290andid<367)
假設用戶要查看第3頁的話,就會取出123和179,并將其加入select 語句的where條件,類似上面的SQL語句。這樣用戶除了第一次查詢外,查看其他頁都會只返回當前頁面的記錄了。

上面的方法還有一些問題,如當第一次返回的記錄很多的話,使用absolute方法進行循環所有的記錄可能有些慢,那可以在程序中做個約定,只循環41次,也就是保存前40頁的記錄,當用戶要查看第41頁的話,再取出第40頁的開始記錄的id值,將再次查詢從該id值往后的所有記錄,再記錄40頁的id值,也就是這時已經有80頁的id記錄被保存在Session中的。以此類推,

當然,這種方法也不可避免地遇到刪除記錄的情況,如果用戶正在查看頁面,這時某一頁的記錄被刪除了,當用戶再次要查看這頁時,根據Session中保存的id區間,就會得到少于50的記錄。在這種情況下,如果使用的是SQL Servlet,就好辦一些,可以在where條件中只加id的上限,不加下限,然后使用top關鍵字來限制查詢出的記錄數,SQL語句如下:
  1. selecttop50*fromtable1wherefield1like '%abc%' andid>=290
如果使用的是其他數據庫,沒有類型top的關鍵字,可以在查詢時多加一個區間,如用戶要查詢第2頁的數據,可以將第2頁和第3頁的都查出來,這樣一般就可以獲得超過50條的記錄。但如果記錄數還不夠(這個表的記錄被刪除的太多了),筆者建議重新查詢所有的記錄,重新更新一下Session對象中的id值。

總之,本算法就是在第一次查詢時預先將后面頁面的起始記錄的id值事先保存起來,然后等待以后查看其他頁面時使用。如果這時某個頁面的記錄被刪除(如果當前頁面記錄數不足頁面記錄總數,被示為有記錄刪除),可以重新更新一下Session中的id值,然后根據新的id值再查一遍。但要注意的是這個id值最好使用數據庫的自增型字段(一般的數據庫,甚至桌面數據庫都會有自增型字段類型)。為了盡量避免總更新Session中的id值,可以在查詢一個頁面時查詢出兩個頁面的記錄,這樣在一般情況下,會保證記錄數超過頁面記錄總數。但這樣做一個缺點,就是可能兩個相鄰頁面的記錄有一定的重復。不過并沒有太大影響。我們在網上看某些論壇的貼子時,有時可能也會發現兩個相鄰頁面的記錄有重復。

本分頁方法適合于所有的數據庫,無論是網絡數據庫(Oracle、SQL Servlet、DB2等),以及桌面數據庫(access、paradox、pdf等)。并且不需要在數據庫中建立額外的資源,如存儲過程等。(當然,每個表需要有一個自增類型字段,這一點很關鍵)。

哪位讀者有更好,更通用的分頁方法(最好不要在數據庫中建立象存儲過程一樣的資源,盡量不要使用與數據庫相關的語句,如SQL Server中的top),請跟貼。

摘自【http://www.blogjava.net/nokiaguy/archive/2008/08/23/223881.html】

<!--Google 468*60橫幅廣告開始--><script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "image"; //2007-07-26: CSDN google_ad_channel = "6063905817"; google_color_border = "6699CC"; google_color_bg = "E6E6E6"; google_color_link = "FFFFFF"; google_color_text = "333333"; google_color_url = "AECCEB"; google_ui_features = "rc:6"; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--Google 468*60橫幅廣告結束--><!--新Google 468*60橫幅廣告開始--><script type="text/javascript"><!-- google_ad_client = "pub-7343546549496470"; /* 468x60, 創建于 08-8-6 */ google_ad_slot = "7368701459"; google_ad_width = 468; google_ad_height = 60; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><!--新Google 468*60橫幅廣告結束-->

<!-- Google Reader shared發布代碼開始 --><script type="text/javascript" src="http://www.google.com/reader/ui/publisher.js"></script><script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/00697638153916680411/state/com.google/broadcast?n=5&amp;callback=GRC_p(%7Bc%3A%22green%22%2Ct%3A%22%5Cu8FD9%5Cu4E9B%5Cu6587%5Cu7AE0%5Cu4E5F%5Cu503C%5Cu5F97%5Cu4E00%5Cu770B%22%2Cs%3A%22false%22%7D)%3Bnew%20GRC"></script><!-- Google Reader shared發布代碼結束 -->

通用Web分頁功能一例


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 狠狠干网 | 国产精品99久久久久久www | 亚洲精品一区久久狠狠欧美 | 亚洲日韩成人 | 激情一区二区三区成人 | 一级特黄特黄毛片欧美的 | 九九九热在线精品免费全部 | 亚洲综合综合在线 | 国产午夜大片 | 亚洲在线资源 | 污版视频在线观看 | 国产一区二区欧美 | 99精品视频在线 | 香蕉久久一区二区不卡无毒影院 | 国产 福利 在线 | 91免费在线看 | 在线观看国产 | 久草在线新免久费观看视频 | 欧美精品一区二区三区免费播放 | 小明台湾www永久视频 | 91视频完整版 | 精品视频网站 | 久久久综合九色合综国产 | 偷拍在线观看视频在线观看地址 | 99热这里只有精品久久免费 | 中文字幕a∨在线乱码免费看 | 草樱av | 免费看特黄特黄欧美大片 | 黄色片视频在线观看 | 国产69久久久欧美黑人A片 | 欧美高清观看免费全部完 | www.99b| 国产精品视频 | 色综合97天天综合网 | 亚洲情a成黄在线观看动 | 一级毛片免费电影 | 草草影院国产第一页 | www.国产| 国产自产拍精品视频免费看 | 国产精品久久99 | 欧美久久亚洲精品 |