網(LieHuo.Net)教程 以前做的項目中,使用到分頁都是通過封裝一個頁面類如 class page 來保存頁面的信息,包括當前頁碼,每頁顯示頁碼數,總頁數,總記錄數,結果集
在SQL中通過當前頁碼和每頁頁碼數來控制SQL,直接查詢數據出來,然后挨著排的放到頁面中,在頁面加入鏈接或按鈕來改變當前頁碼,實現分頁
最近公司要求做的一個分頁,頁面中要有各種查詢條件選項,可以實現查詢功能,查詢的同時要實現分頁,這個還是有一點值得去思考的:
首先是拼接SQL,帶條件的分頁我感覺是有一定難度的,也是因為之前沒那么做過,也挺有挑戰性;我選擇的是select top 和 not in 的組合來完成,這樣的SQL最重要的一點是你要保證 not in 后面所要執行的 select 語句與它之前的 select 語句所操作的數據區域是一致的,否則查詢出來的數據是不正確的;我寫的語句是 :
select top 條數 * from (select top NO2 * from message where 條件 order by createTime desc)
t1 where t1.id not in (select top NO3 id from t1 order by createTime desc)
我的想法沒錯,但是t1在 not in 后的查詢子句中引用無效,后來在老大的提示下,我在程序中改造了SQL,就是將各個區段的SQL封裝成一個個體,然后對接他們,最后實現了功能。
另一種SQL則是采用套三層的方式,倒轉查詢出來的結果集,如:
select * from (select top 10 * from (select top 29 from message where 條件 order by id asc)
t1 ) t2 order by id desc
但是我將這條SQL的排序列改為其他的非標識列時,發現查詢出的結果并非我想要的順序,我也對這種語句操作方式理解不夠,最后還是用自己的想法來實現了。
程序中要保證查詢與分頁的同步,而且還要保證頁面跳轉不會影響查詢結果集;我重新封裝了一個條件類,用來儲存條件信息,這樣就把散落的各種條件集合在一起,易于管理,后來證明這種方式確實是帶了很大的便利。后來也是圖方便,我還把條件類做成了分頁類的成員,這樣我在拼接SQL的時候比較簡單一些。
頁面的跳轉我是通過按鈕來實現的,起初設想的是,點擊頁面跳轉按鈕的時候觸發表單提交,然后將表單信息發送過去,執行查詢。這樣要面對一個問題,之前點擊查詢按鈕提交的表單數據需要記錄下來,在頁面跳轉事件中要繼續使用這些數據才能保證結果同步,否則表單提交完了以后就會清空,在提交就沒有條件了,那后果可想而知。我選擇session保存條件,判斷用戶按下的是不是查詢按鈕來決定是否要重新設定session中的條件值,然后分頁信息需要通過 request來傳遞,分頁按鈕也不能觸發表單提交了,而要改成鏈接參數的方式來傳遞分頁信息,這樣查詢和分頁互不干涉,同時能保證數據的正確性。
轉自:http://www.cnblogs.com/leosky/
上一篇 Linux 進程內存模型 (1)