日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Session和唯一索引字段实现通用Web分页功能

發(fā)布時間:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Session和唯一索引字段实现通用Web分页功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

??? Web系統(tǒng)雖然現(xiàn)在很流行,但是分頁問題一直長期困擾著Web系統(tǒng)的開發(fā)人員。對于不同的數(shù)據(jù)庫,可能開發(fā)人員對分頁的處理分有很大差別。個人認(rèn)為,使用MySQL開發(fā)Web系統(tǒng)的程序員是感到最舒服的,因為,在MySQL中提供了limit語句,可以獲得查詢結(jié)果的一段數(shù)據(jù)。如下面的SQL語句所示:

select?*?from?table1?limit?1,?20

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

????對于其他的數(shù)據(jù)庫,恐怕就沒MySQL那么容易查詢出記錄段了。在SQL Server2005中也提供了類似MySQL的處理方法(可以使用ROW_NUMBER()函數(shù)來實現(xiàn)這個功能),SQL語句如下:

With?t?AS?
(
????SELECT?contactid,?namestyle,?lastname,
????ROW_NUMBER()?over(order?by?namestyle)?as?RowNumber?
????FROM?Person.Contact
)
select?*?from?t
Where?RowNumber?Between?20?and?30

????雖然上面的SQL語句雖然也可以實現(xiàn)和MySQL一樣的功能,但卻比MySQLlimit復(fù)雜一些。

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

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

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

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

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

????先拿Java為例來說明一下。下面的代碼在Session中記錄了第一頁到最后一頁的起始id:

//??rs為記錄集,其他語言的操作類似
ResultSet?rs?=?stmt.executeQuery("select?*?from?table1?where?field1?like?'%abc%'");??
int?n?=?1;
while(rs.absolute(n))
{
????int?id?=?rs.getInt(id)
????//??將id保存在Session中
????n?+=?50;
}

????從上面的代碼可以看出,使用ResultSetabsolute來定位記錄,并取出當(dāng)前記錄的id值(一個自增字段),并將其保存在Session中。

????假設(shè)共查詢出500條記錄,那么Session中保存的id值有可能是下面的樣子:

??? 1?51?123?179?229?290?367?567?699

????從上面的id值可以看出,中間有斷檔。但這9id值之間的記錄數(shù)都是50個。如下面的SQL語句將查詢出50個記錄:

select?*?from?table1?where?field1?like?'%abc%'?and?(id?>=?290?and?id?<?367)

????假設(shè)用戶要查看第3頁的話,就會取出123179,并將其加入select?語句的where條件,類似上面的SQL語句。這樣用戶除了第一次查詢外,查看其他頁都會只返回當(dāng)前頁面的記錄了。

????上面的方法還有一些問題,如當(dāng)?shù)谝淮畏祷氐挠涗浐芏嗟脑?#xff0c;使用absolute方法進(jìn)行循環(huán)所有的記錄可能有些慢,那可以在程序中做個約定,只循環(huán)41次,也就是保存前40頁的記錄,當(dāng)用戶要查看第41頁的話,再取出第40頁的開始記錄的id值,將再次查詢從該id值往后的所有記錄,再記錄40頁的id值,也就是這時已經(jīng)有80頁的id記錄被保存在Session中的。以此類推,

????當(dāng)然,這種方法也不可避免地遇到刪除記錄的情況,如果用戶正在查看頁面,這時某一頁的記錄被刪除了,當(dāng)用戶再次要查看這頁時,根據(jù)Session中保存的id區(qū)間,就會得到少于50的記錄。在這種情況下,如果使用的是SQL Servlet,就好辦一些,可以在where條件中只加id的上限,不加下限,然后使用top關(guān)鍵字來限制查詢出的記錄數(shù),SQL語句如下:

select?top?50?*?from?table1?where?field1?like?'%abc%'?and?id?>=?290?

????如果使用的是其他數(shù)據(jù)庫,沒有類型top的關(guān)鍵字,可以在查詢時多加一個區(qū)間,如用戶要查詢第2頁的數(shù)據(jù),可以將第2頁和第3頁的都查出來,這樣一般就可以獲得超過50條的記錄。但如果記錄數(shù)還不夠(這個表的記錄被刪除的太多了),筆者建議重新查詢所有的記錄,重新更新一下Session對象中的id值。

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

????本分頁方法適合于所有的數(shù)據(jù)庫,無論是網(wǎng)絡(luò)數(shù)據(jù)庫(OracleSQL ServletDB2等),以及桌面數(shù)據(jù)庫(accessparadoxpdf等)。并且不需要在數(shù)據(jù)庫中建立額外的資源,如存儲過程等。(當(dāng)然,每個表需要有一個自增類型字段,這一點很關(guān)鍵)。

??? 補(bǔ)充一下,這種方法只適合于一個排序字段的查詢,而且這個排序字段值不能有重復(fù)的,也就是說得是有唯一索引的字段。在本文中使用了自增鍵來說明,但也可以是其他字段,如不重復(fù)的時間字段,按時間排序后。可以使用本文的方法。而且唯一字段區(qū)間值也可以使用其他的方式保存,如viewstate,hide input等。??

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

本文轉(zhuǎn)自銀河使者博客園博客,原文鏈接http://www.cnblogs.com/nokiaguy/archive/2008/08/23/1274769.html如需轉(zhuǎn)載請自行聯(lián)系原作者


銀河使者

總結(jié)

以上是生活随笔為你收集整理的用Session和唯一索引字段实现通用Web分页功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产又粗又黄又猛 | 亚洲成av人片 | 亚洲精品欧洲 | 国产高清免费 | 欧美视频a | cao死你 | 九九热精品 | 少妇肥臀大白屁股高清 | 日韩精品在线播放 | 成人网站免费观看入口 | 精品日本一区二区 | 超碰人操 | 日本xxxxxxxxx69 | 无码精品人妻一区二区三区漫画 | 国产毛片久久久久 | 亚洲社区在线观看 | 精品国产乱码久久久久久蜜臀 | av噜噜| 九七电影院97理论片 | 少妇自摸视频 | 狂野欧美 | 国产不卡视频在线观看 | 超碰在线免费观看97 | 黄色www视频 | 成人h动漫精品一区二区无码 | 秘密基地电影免费版观看国语 | av中文在线 | 在线观看的av| 精品不卡在线 | 成人黄色免费在线观看 | 青草视频在线免费观看 | 久久人人妻人人人人妻性色av | 日韩欧美在线精品 | 国产成人精品无码免费看夜聊软件 | 熟女少妇a性色生活片毛片 亚洲伊人成人网 | 国产不卡一区 | 欧美一区二区在线免费观看 | 久久伊人精品视频 | 亚洲理论片在线观看 | 免费欧美一级视频 | 日韩xxx视频 | av官网在线 | 99在线精品视频免费观看20 | 久久99伊人 | 91久久一区二区 | 少妇av在线| 国产亚州av | 91视频第一页| 国产有码在线 | 在线观看视频免费 | 精品黄色在线观看 | a∨鲁丝一区鲁丝二区鲁丝三区 | 美女av一区二区 | 欧美激情在线 | 先锋影音男人 | 艹少妇视频 | 国产一区二区亚洲 | 玖玖伊人| 天堂av2021| 毛片其地| 久久久久99精品成人片试看 | aaa亚洲| 国产激情av在线 | 日本欧美国产在线 | 国产看黄网站 | 婷婷色在线观看 | 9.1成人看片免费版 日韩经典在线 | 免费无码毛片一区二区app | 香蕉国产999 | 无码人妻精品一区二区蜜桃网站 | 用力抵着尿进去了h | 国产成人短视频 | 97av在线视频| 福利一二区 | 日韩美女视频在线观看 | 日韩精品一区二区三区在线播放 | 日本久色 | 日韩精品视频一区二区 | 国产精品午夜影院 | 日本捏奶吃奶的视频 | 久在线 | 九九热播视频 | 伊人久久大香线蕉成人综合网 | 国产亚洲精品精品精品 | 精品自拍偷拍视频 | 天天鲁一鲁摸一摸爽一爽 | 国产视频91在线 | 亚洲精品视频免费观看 | 视频精品一区二区 | 吖v在线| 亚洲一区二区三区电影在线观看 | 丝瓜av| 妹子干综合网 | 亚洲乱妇老熟女爽到高潮的片 | 激情久久婷婷 | 国产xxxxx | 黑人性生活视频 | 在线看片你懂的 | 久久久久无码国产精品一区 |