以前一都是在用mysql數據庫,在mysql裏可以用select * from table LIMIT 5,10 實現從數據中間位置取固定長短的數據,當是到了公司裏,公司是用是sqlserver 搞了半天發現sqlserver裏不支持limit函數,無奈到網上找了找資料 發現了這麼一個sql語句
SELECT TOP 頁大小 *
FROM Table1
WHERE (ID NOT IN
(SELECT TOP 頁大小*頁數 id
FROM 表
ORDER BY id))
ORDER BY ID
試了一下很是不錯,而且還可以解決大量的數據分頁,但是用這個的話你必須在建立表的時候有個“id”字段,並且它爲你表的主鍵。在這裏我把它編寫成了組件,下面給大家看我的具體實現。
/*
* Pagination.java
*
* Created on 2007年11月1日, 下午1:13
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package cn.CCmingzhou.jsp;
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.ResultSet;
import cn.CCmingzhou.db.MsManager;
/**
*冷漠大神 qq 361619004
* @author Angel
*/
public class Pagination extends HttpServlet{
/** Creates a new instance of Pagination */
public Pagination() {
}
private int pageSize=0;
private String table="";
private void setTable(String s)
{
this.table=s;
}
private String getTable()
{
return table;
}
/**
*首頁
*參數說明 request 傳入jsp內置的request對象 current 當前頁 例:比如你現在在index.jsp頁 那你就 XX.top(request,"index.jsp"),當然你也可以懶的寫法XX.top(request,"")這麼寫也可以實現相同的功能
*/
public String top(HttpServletRequest request,String current)
{
request.setAttribute("info","0");
return "<a href="+current+"?page="+(String)request.getAttribute("info")+">首頁</a> ";
}
/**
*上一頁
* 參數說明 request 傳入jsp內置的request對象 current 當前頁 例:比如你現在在index.jsp頁 那你就 XX.shang(request,"index.jsp"),當然你也可以懶的寫法XX.shang(request,"")這麼寫也可以實現相同的功能
*yema 這個參數就是你當前的頁碼 你可以在你的my.jsp 這麼調用 String pages=request.getParameter("page") 再把pages傳到yema 裏就一切 OK 了
*/
public String shang(HttpServletRequest request,String current,String yema)
{
int i=Integer.parseInt(yema);
if(i>0)
i--;
String s=""+i;
request.setAttribute("info",s);
return "<a href="+current+"?page="+(String)request.getAttribute("info")+">上一頁</a> ";
}
/**
*下一頁
* 參數說明 request 傳入jsp內置的request對象 current 當前頁 例:比如你現在在index.jsp頁 那你就 XX.xia(request,"index.jsp"),當然你也可以懶的寫法XX.xia(request,"")這麼寫也可以實現相同的功能
*yema 這個參數就是你當前的頁碼 你可以在你的my.jsp 這麼調用 String pages=request.getParameter("page") 再把pages傳到yema 裏就一切 OK 了
*/
public String xia(HttpServletRequest request,String current,String yema )
{
String wei=null;
MsManager ms=new MsManager();
ResultSet rs=ms.query("select count(*) as a from "+this.getTable());
try {
if(rs.next())
{
wei=rs.getString("a");
}
} catch (SQLException ex) {
ex.printStackTrace();
}
int ii=0;
if(wei!=null)
{
ii=Integer.parseInt(wei);
ii=ii/this.getPageSize();
}
int i=Integer.parseInt(yema);
if(i<ii)
i++;
String s=""+i;
request.setAttribute("info",s);
ms.close();
return "<a href="+current+"?page="+(String)request.getAttribute("info")+">下一頁</a> ";
}
/**
*尾頁
*參數說明 request 傳入jsp內置的request對象 current 當前頁 例:比如你現在在index.jsp頁 那你就 XX.bottom(request,"index.jsp"),當然你也可以懶的寫法XX.bottom(request,"")這麼寫也可以實現相同的功能
*/
public String bottom(HttpServletRequest request,String current)
{
String wei=null;
MsManager ms=new MsManager();
ResultSet rs=ms.query("select count(*) as a from "+this.getTable());
try {
if(rs.next())
{
wei=rs.getString("a");
}
} catch (SQLException ex) {
ex.printStackTrace();
}
int ii=0;
if(wei!=null)
{
ii=Integer.parseInt(wei);
ii=ii/this.getPageSize();
}
wei=""+ii;
request.setAttribute("info",wei);
ms.close();
return "<a href="+current+"?page="+(String)request.getAttribute("info")+">尾頁</a> ";
}
private void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
private int getPageSize()
{
return this.pageSize;
}
/**
*返回sql語句
*參數說明 pageSize 這個參數是指你每頁想顯示幾條數據 比如說 把10 傳進去就會返回10條記錄的結果集 tableName 這個沒有說明好說的啦 就是把你想要操作的表 的名字傳進來就行了
*yema 這個參數就是你當前的頁碼 你可以在你的my.jsp 這麼調用 String pages=request.getParameter("page") 再把pages傳到yema 裏就一切 OK 了
*/
public String getSqlASC(int pageSize,String tableName,String yema) {
this.setTable(tableName);
this.setPageSize(pageSize);
int i=0;
int temp=0;
if(yema!=null&&!yema.equals(""))
{
i=Integer.parseInt(yema);
temp=pageSize*i;
}
return "select top "+pageSize+" * from "+tableName+" where (id not in (select top "+temp+" id from "+tableName+" order by id)) order by id ";
}
/**
*返回sql語句 按照你的主鍵id值倒序 輸出
*參數說明 pageSize 這個參數是指你每頁想顯示幾條數據 比如說 把10 傳進去就會返回10條記錄的結果集 tableName 這個沒有說明好說的啦 就是把你想要操作的表 的名字傳進來就行了
*yema 這個參數就是你當前的頁碼 你可以在你的my.jsp 這麼調用 String pages=request.getParameter("page") 再把pages傳到yema 裏就一切 OK 了
*/
public String getSqlDESC(int pageSize,String tableName,String yema) {
this.setPageSize(pageSize);
this.setTable(tableName);
int i=0;
int temp=0;
if(yema!=null&&!yema.equals(""))
{
i=Integer.parseInt(yema);
temp=pageSize*i;
}
return "select top "+pageSize+" * from "+tableName+" where (id not in (select top "+temp+" id from "+tableName+" order by id desc)) order by id desc";
}
}
這裏我簡單的對這個類做一下解說
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.ResultSet;
import cn.CCmingzhou.db.MsManager;
這裏必須要引入servlet的jar包 否則你在編譯的時候會出錯
至於cn.CCmingzhou.db.MsManager; 這個類的引用是對數據庫的操作的,這個類裏我對數據庫簡單的做了一下封裝,包擴對數據庫的 增刪該查。
其他的方法我都有寫註釋,而且很很詳細了,你可以把它打成jar包,下面說下怎麼去用它,你直接把這個類引用到你的jsp頁裏,給大家個例子
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ page import="java.sql.ResultSet" %>
<jsp: useBean id="db" scope="page" class="cn.CCmingzhou.db.MsManager">
</jsp:useBean>
<jsp:useBean id="jsp" scope="page" class="cn.CCmingzhou.jsp.Pagination">
</jsp:useBean>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%
String s=request.getParameter("page");
if(s==null)
s="0";
//首先必須得用request.getParameter("page");獲取到當前的頁碼
//可能有人會問了 page是怎麼出來的啊?其實要是細心看那個類的朋友就
//就不會有這麼的疑問了,沒錯我們的分頁組件的動態生成的
ResultSet rs=db.query(jsp.getSqlASC(10,"love",s));
//db. Query()這個方法是我封裝好的,如果你沒有的話 那麼你就寫一個方法
//傳進去一個查詢的sql語句返回一個ResultSet 很簡單 這裏不提了
// jsp.getSqlASC(10,"love",s) 這個纔是終點和大家說的 這裏面的10 代表是你
//想一頁顯示幾條數據 “love”這則是你的biao的名字 比如說你在數據庫的 test表
//test s則是當前的頁碼 因爲我們的分頁是自動生成的嘛 :)
while(rs.next())
{
out.println(rs.getString("id"));
out.println(rs.getString("name"));
out.println(rs.getString("password")+"<br>");
}
out.println(jsp.top(request,"")+jsp.shang(request,"",s)+jsp.xia(request,"",s)+jsp.bottom(request,""));
//這裏給給大家解說一下 jsp.top(request,"") 這個方法,這個方法會返回一個String類型
//的字符串 <a href=?page=0>首頁</>在瀏覽器裏就會 首頁 這麼一個超連接 傳參的說明
//我在類裏都有明確的註釋 後頭看看吧
db.close();
%>
想看結果的話,自己運行一下試試吧,我相信當你看到結構的話你一定會愛上它的 :)
cn.CCmingzhou 這個是我的軟件包 裏面有對數據庫的操作 也有分頁,還有處理中文和javaMail,連接池和報表也有一點,但是我還沒有在網上發佈 :) 工作忙的要死 嘿嘿!好了,不所了要是有興趣的話就加我的qq吧 361619004 希望和大家一起交流技術!
作者:高秋
網名:冷漠大神
q:361619004
Mail:[email protected]
Time:2007年11月2日星期五