這種model1模式頁面顯示和分頁的業(yè)務(wù)邏輯混合在一起.比較簡單.
但是代碼可讀性很差,而且不容易維護.
?
在韓順平SERVLET教程的第四講中有明確的說明.
晚上弄清楚算法,貼過來.
?
需要4個參數(shù)
pageSize --> 用戶指定
pageNow --> 用戶選擇
rowCount --> 從表中查詢出來
pageCount --> 計算出來
?
pageCount的計算方法
if (rowCount % pageSize == 0) {
??? pageCount = rowCount / pageSize;
}else {
??? pageCOunt = rowCount / pageSize + 1;
}
?
說明:如果用戶的表中有9條記錄,即rowCount =? 9,pageSize = 3的話,那么pageCount就為3,正確
??????? 如果pageSize = 4,rowCount / pageSize取整也是2,+1后共3頁.正確.
?
針對上面的算法,很自然的想到下面的SQL語句
select 字段表名 from 表名 where id bwteen ? and ?
比如顯示第三頁(pageSize = 3)的話,那么就是
select * from user where userId bwteen 7 and 9;
但是有這樣一個問題,如果userId被刪除掉或者不連續(xù)的話,那么返回的結(jié)果集就是錯誤的.
?
下面列出常見的幾個數(shù)據(jù)庫的分頁SQL語句
MySQL數(shù)據(jù)庫
My sql數(shù)據(jù)庫最簡單,是利用mysql的LIMIT函數(shù),LIMIT [offset,] rows
從數(shù)據(jù)庫表中M條記錄開始檢索N條記錄的語句為:
SELECT * FROM 表名稱 LIMIT M,N
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
select * from sys_option limit 10,20
例如要從"品種"表里檢索,語句為
sql = "select * from pinzhong limit?"+pageSize+","+pageSize*(pageNow-1)+"? " ;
?
在我們使用查詢語句的時候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù),這個時候怎么辦呢?不用擔(dān)心, mysql 已經(jīng)為我們提供了這樣一個功能。
LIMIT 子句可以被用于強制 SELECT 語句返回指定的記錄數(shù)。LIMIT 接受一個或兩個數(shù)字參數(shù)。參數(shù)必須是一個整數(shù)常量。如果給定兩個參數(shù),第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1): 為了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
?
SQL Server
從數(shù)據(jù)庫表中的第M條記錄開始取N條記錄,利用Top關(guān)鍵字:注意如果Select語句中既有top,又有order by,則是從排序好的結(jié)果集中選擇:
SELECT*
FROM(SELECTTopN*
FROM(SELECTTop(M+N-1)*FROM表名稱Orderby主鍵desc)t1)t2
Orderby主鍵asc
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
SELECT*
FROM(SELECTTOP20*
FROM(SELECTTOP29*FROMSys_optionorderbysys_iddesc)t1)t2
Orderbysys_idasc
Oralce數(shù)據(jù)庫
從數(shù)據(jù)庫表中第M條記錄開始檢索N條記錄
SELECT*
FROM(SELECTROWNUMr,t1.*From表名稱t1whererownum<M+N)t2
wheret2.r>=M
例如從表Sys_option(主鍵為sys_id)中從10條記錄還是檢索20條記錄,語句如下:
SELECT*
FROM(SELECTROWNUMR,t1.*FromSys_optionwhererownum<30)t2
Wheret2.R>=10
?
?
在mysql數(shù)據(jù)庫中分頁實例
response.setContentType("text/html;charset=gbk") ;
request.setCharacterEncoding("gbk") ;
PrintWriter pw = response.getWriter() ;
//定義連接數(shù)據(jù)庫所需要的幾個常量
final String DBDriver = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/test";
final String user = "";
final String password = "";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//定義分頁所需要的幾個變量
int pageCount = 0;
int pageSize = 3;
int rowCount = 0;
int pageNow = 1;
//動態(tài)的接收pageNow,實現(xiàn)分頁的實時功能
String spageNow = request.getParameter("pageNow") ;
if(spageNow != null) {
pageNow = Integer.parseInt(spageNow) ;
}
Class.forName(DBDriver).newInstance();
conn = DriverManager.getConnection(DBURL, user, password);
String sql_count = "select count(*) from pinzhong"; //取得當前表中總的記錄數(shù)
ps = conn.prepareStatement(sql_count);
rs = ps.executeQuery();
//取得rowCount
if (rs.next()) {
rowCount = rs.getInt(1);
}
//計算pageCount
if ((rowCount % pageSize) == 0) {
pageCount = rowCount / pageSize;
} else {
pageCount = rowCount / pageSize + 1;
}
System.out.println("pageSize->" + pageSize) ;
System.out.println("pageCount->" + pageCount) ;
System.out.println("pageSize*(pageNow-1)->" + pageSize*(pageNow-1)) ;
System.out.println("spageNow->" + spageNow) ;
String sql_do = "select * from pinzhong limit "+pageSize*(pageNow-1)+" , "+pageSize+" " ;
ps = conn.prepareStatement(sql_do);
rs = ps.executeQuery();
pw.println("共有" + pageCount +"頁") ;
pw.println("<table border=1>") ;
pw.println("<tr><th>id</th><th>品種</th></tr>") ;
while(rs.next()) {
pw.println("<tr>") ;
pw.println("<td>"+rs.getInt(1)+"</td>") ;
pw.println("<td>"+rs.getString(2)+"</td>") ;
pw.println("</tr>") ;
}
pw.println("</table>") ;
//顯示上一頁
if(pageNow != 1) {
pw.println("<a href=wel?pageNow="+(pageNow-1)+">上一頁</a>") ;
}
for(int i = pageNow; i <= pageNow+4 ; i++) {
pw.println("<a href=wel?pageNow="+i+">"+i+"</a>") ;
}
//顯示下一頁
if(pageNow < pageCount){
pw.println("<a href=wel?pageNow="+(pageNow+1)+">下一頁</a>") ;
}
} catch (Exception e) {
e.printStackTrace() ;
} finally {
try {
if (rs != null) {
rs.close() ;
rs = null ;
}
if ( ps != null) {
ps.close() ;
ps = null ;
}
if (conn != null) {
conn.close() ;
conn = null ;
}
}catch(SQLException e) {
e.printStackTrace() ;
}
}
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

