1.分頁實現
分頁實現是將所有查詢結果保存在session對象或集合中,翻頁時從session對象或集合中取出一頁所需的數據顯示。但是這種方法有兩個最主要的缺點:一是用戶看到的可能是過期數據;二是如果數據量非常大,查詢一次數據集會耗費很長時間,并且存儲的數據也會占用大量內存,效果明顯下降。
2.實現數據分頁顯示的步驟
(1)確定每頁顯示的數據數量。根據頁面的設計,確定在數據列表中每次顯示多少條記錄,也就是說每次從數據庫中需要查詢出多少條記錄用于頁面顯示,通常這個數量可以在開發時定義好,也可以通過用戶來確定。
(2)計算顯示的總頁數。既然要進行分頁顯示,還需清楚按照每頁顯示的數據庫記錄數量,計算出需要劃分的總頁數。由于在頁面中顯示的記錄數量是固定的,而數據庫中共存儲了多少條記錄是未知的,因此要想得到總頁數,需要以下步驟:
<1>首先要通過查詢獲取數據庫中總的記錄數,在SQL Server 數據庫中提供了count()聚合函數,借助count()聚合函數就可以獲取數據庫中記錄的總數,代碼如下所示:
定義新聞接口代碼如下。
public interface NewsDao{
public int getTotalCount();
}
新聞接口的實現類中獲取數據庫中記錄總數的代碼如下。
public class NewsDaoiple extends BaseDao implements NewsDao{
public int getTotalCount(){
int count =0;
String sql="select count(*) fro News";
......//省略執行代碼
if(rs.next()){
count=rs.getInt(1);
}
....//省略執行代碼
returncount
}
}
從代碼中可以看出,當你執行使用了count()函數的SQL語句后,將獲得news表中的記錄總數,然后將其數據返回。
<2>有了數據庫記錄總數后,就可以根據每頁顯示的記錄數計算共需要劃分為多少頁,將有關分頁的數據封裝到page類,代碼如下:
public class Page{
//總頁數
PRivate int totalPageCount=1;
//頁面大小,即每頁顯示記錄數
private int pageSize=0;
//記錄總數
private int totalCount=0;
//當前頁碼
private int currPageNo=1;
//每頁新聞集合
List<News> newsList;
.........//省略其他getter/setter()方法
public int getCurrPageNo(){
if(totalPageCount==0)
return 0;
return currPageNo;
}
public void setCurrPageNo(int currPageNo){
if(this.currPageNo>0)
this.currPageNo = currPageNo;
}
public int getPageSize(){
return pageSize;
}
public void setPageSize(int pageSize){
if(pageSize>0)
this.pageSize = pageSize;
}
public int getTotalCount(){
return totalCount;
}
public void setTotalCount(int totalCount){
if(totalCount>0){
this.totalCount = totalCount;
//計算總頁數
totalPageCount=this.totalCount%pageSize==0?(this.totalCount/pageSize) : this.totalCount/pageSize+1;
}
}
}
以上代碼設置記錄總數的setTotalCount()方法中,根據記錄總數和每頁顯示記錄數通過公式計算出總頁數,其使用了條件三元運算符 "? :" 的方式進行數據處理。如果記錄總數能被每頁顯示記錄數整除,則總頁數為兩者的商;如果不能被整除,則余出的記錄數單獨列為一頁,所以總頁數為兩者的商再加一。
(3)編寫SQL語句。
《1》假如每頁顯示3條記錄,若要顯示第一頁的記錄,則:
String sql="select top 3 NID,NTITLE,NCREATEDATE from News"+" where NID not in (select top 0 NID from News)";
上述語句中top作用是限制返回的行數,此語句運用了兩層嵌套的查詢方式,內層的select語句是一條普通的返回限制行的查詢語句,他的執行結果實際上是為外層的select語句起到一個限制范圍的作用,其中數字0是起始行的下標,如顯示第一頁則從第一行開始查詢,即起始下標為0.而外層的select語句限制的行數實際上是每頁要顯示的記錄數,其執行結果就是從內層語句的查詢結果中按照起始行的下標取出前三條(每頁顯示的記錄數)。
起始行的下標 = (當前頁頁碼-1)* 每頁顯示的數據量
《2》String sql="select top "+pageSize+" NID,NTITLE,NCREATEDATE from News"+"where NID not in(select top "+(currPageNo-1)* pageSize+"NID from News )";
pageSize 表示每頁顯示的記錄數,而currPageNo 變量表示當前頁的代碼。
定義新聞接口的代碼如下:
public interface NewsDao{
public int getTotalCount();
public List<News> getPageNewsList(int pageNo,int pageSize);
}
新聞接口的實現類中獲得每頁新聞集合代碼如下:
public class NewsDaoImple extends BaseDao implements NewsDao{
.....//省略查詢數據庫中記錄總數的代碼
public List<News> getPageNewsList(int pageNo,int pageSize){
List<News> newslist=new ArrayList<News>();
Connection con=this.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
String sql="select top "+pageSize+"NID,NTITLE,NCREATEDATE from News where NID not in "+"(select top "+(pageNo-1)*pageSize+"NID from News"+"order by NCREATEDATE desc) order by NCREATEDATE desc";
.......//省略其他執行代碼
return newslist;
}
}
向頁面顯示信息:
public class NewsDAoImple extends BaseDao implements NewsDao{
..........//省略其他代碼實現
public static void main(String[] args){
NewsDaoImple news =new NewsDaoImple();
int totalCount=news.getTotalCount();
Page page =new Page();
page.setCurrPageNo(1); //設置當前頁面
page.setPageSize(3); //設置每頁條數
page.setTotalCount(totalCount); //設置總數量
System.out.println("新聞總數量是:"+page.getTotalCount());
System.out.println("每頁條數是:" +page.setPageSize(););
System.out.println("總頁數:"page.getTotalPageCount());
System.out.println("當前是第"+page.getCurrPageNo()"頁");
List<News> newslist=news.getPageNewsList(page.getCurrPageNo(), page.getPageSize());
page.setListNews(newslist);
for(News news:page.getListNews()){
System.out.println(news.getNid()+"/t"+news.getNtitle()+"/t"+news.getNcreatedate());
}
}
}
新聞熱點
疑難解答