我是用Struts的,當然就要使用到MVC這個模式,分頁的時候也是這樣的。
首先要有一個和數據庫鏈接的bean,我們暫時叫DBUtil吧,這里面封裝了很多和數據庫有關的東西,比如有查詢,修改,插入等方法,這是一個基本的類,這里我們用到的是查詢,這個方法返回的數據類型是Object[][]。這里大家要注意一下,你也可以返回別的類型,但是一定要注意把后面對應的程序也修改一下。一下是這個類的部分代碼:
package com.model;
import com.attribute.Constants;
import java.sql.*;
import java.util.*;
/**
* Created by IntelliJ IDEA.
* User: 7612CE
* Date: 2005-6-2
* Time: 21:41:38
* To change this template use Options | File Templates.
*/
public class DBUtil {
String sDBDriver=Constants.DBDriver;
String url=Constants.DBUrl;
String dbUser=Constants.DBUser;
String dbPassword=Constants.DBPassword;
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs=null;
public DBUtil()throws ClassNotFoundException{
try{
Class.forName(sDBDriver);
conn=DriverManager.getConnection(url,dbUser,dbPassword);
}catch(Exception e){
System.out.println("DBUtil():"+e.getMessage());
}
}
/**
* Search some record in object table
* @param sql sql segment
* @ param map values for match
* @return Collection
*/
public Object[][] doSearch(String sql,Object [] data)throws SQLException{
PreparedStatement stmt = conn.prepareStatement(sql);
for(int i=0;data!=null&&i<data.length;i++){
System.out.print("the aql is ="+sql);
System.out.println("data is " + data[i]);
stmt.setObject(i+1,data[i]);
}
ResultSet rset = stmt.executeQuery();
ResultSetMetaData rsm = rset.getMetaData();
int col = rsm.getColumnCount();
ArrayList list = new ArrayList();
//Each element of list contains a record of resultset
while(rset.next()){
list.add(getLine(rset,col));
}
if(list.size()==0||col==0){
closePrepStmt();
return null;
}
closePrepStmt();
//Construct box as a data matrix
Object[][] box = new Object[list.size()][col];
for(int i=0;i<list.size();i++)
for(int j=0;j<col;j++)
{
box[i][j] =((Object[])list.get(i))[j];
}
return box;
}
由于是寫分頁的,當然也是要有一個page的類,具體代碼如下,由于有很多注釋,不用一一介紹了:
package com.util;
/**
* Title: 分頁對象<br>
* Description: 用于包含數據及分頁信息的對象<br>
*Page類實現了用于顯示分頁信息的基本方法,但未指定所含數據的類型,
*可根據需要實現以特定方式組織數據的子類,<br>
*如RowSetPage以RowSet封裝數據,ListPage以List封裝數據<br>
* Copyright: Copyright (c) 2002 <br>
* @author evan_zhao@hotmail.com <br>
* @version 1.0
*/
public class Page implements java.io.Serializable {
public static final Page EMPTY_PAGE = new Page();
public static final int DEFAULT_PAGE_SIZE = 2;
public static final int MAX_PAGE_SIZE = 2;
private int myPageSize = DEFAULT_PAGE_SIZE;
private int start;
private int avaCount,totalSize;
private Object[][] data=null;
private int currentPageno;
private int totalPageCount;
/**
* 默認構造方法,只構造空頁
*/
public Page(){
this.init(0,0,0,DEFAULT_PAGE_SIZE,null);
}
/**
*構造分頁對象
*@param crs 包含一頁數據的OracleCachedRowSet
*@param start 該頁數據在數據庫中的起始位置
*@param totalSize 數據庫中包含的記錄總數
*@param pageSize 本頁能容納的記錄數
*/
public Page(Object[][] crs, int start, int totalSize, int pageSize) {
try{
int avaCount=0;
if (crs!=null) {
avaCount = crs.length;
}
data = crs;
this.init(start,avaCount,totalSize,pageSize,data);
}catch(Exception ex){
throw new RuntimeException(ex.toString());
}
}
/**
* 分頁數據初始方法
* @param start 本頁數據在數據庫中的起始位置
* @param avaCount 本頁包含的數據條數
* @param totalSize 數據庫中總記錄條數
* @param pageSize 本頁容量
* @param data 本頁包含的數據
*/
protected void init(int start, int avaCount, int totalSize, int pageSize, Object[][] data){
this.avaCount =avaCount;
this.myPageSize = pageSize;
this.start = start;
this.totalSize = totalSize;
this.data=data;
//System.out.println("avaCount:"+avaCount);
//System.out.println("totalSize:"+totalSize);
if (avaCount>totalSize) {
//throw new RuntimeException("記錄條數大于總條數?!");
}
this.currentPageno = (start -1)/pageSize +1;
this.totalPageCount = (totalSize + pageSize -1) / pageSize;
if (totalSize==0 && avaCount==0){
this.currentPageno = 1;
this.totalPageCount = 1;
}
//System.out.println("Start Index to Page No: " + start + "-" + currentPageno);
}
public Object[][] getData(){
return this.data;
}
/**
* 取本頁數據容量(本頁能包含的記錄數)
* @return 本頁能包含的記錄數
*/
public int getPageSize(){
return this.myPageSize;
}
/**
* 是否有下一頁
* @return 是否有下一頁
*/
public boolean hasNextPage() {
/*
if (avaCount==0 && totalSize==0){
return false;
}
return (start + avaCount -1) < totalSize;
*/
return (this.getCurrentPageNo()<this.getTotalPageCount());
}
/**
* 是否有上一頁
* @return 是否有上一頁
*/
public boolean hasPreviousPage() {
/*
return start > 1;
*/
return (this.getCurrentPageNo()>1);
}
/**
* 獲取當前頁第一條數據在數據庫中的位置
* @return
*/
public int getStart(){
return start;
}
/**
* 獲取當前頁最后一條數據在數據庫中的位置
* @return
*/
public int getEnd(){
int end = this.getStart() + this.getSize() -1;
if (end<0) {
end = 0;
}
return end;
}
/**
* 獲取上一頁第一條數據在數據庫中的位置
* @return 記錄對應的rownum
*/
public int getStartOfPreviousPage() {
return Math.max(start-myPageSize, 1);
}
/**
* 獲取下一頁第一條數據在數據庫中的位置
* @return 記錄對應的rownum
*/
public int getStartOfNextPage() {
return start + avaCount;
}
/**
* 獲取任一頁第一條數據在數據庫中的位置,每頁條數使用默認值
* @param pageNo 頁號
* @return 記錄對應的rownum
*/
public static int getStartOfAnyPage(int pageNo){
return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
}
/**
* 獲取任一頁第一條數據在數據庫中的位置
* @param pageNo 頁號
* @param pageSize 每頁包含的記錄數
* @return 記錄對應的rownum
*/
public static int getStartOfAnyPage(int pageNo, int pageSize){
int startIndex = (pageNo-1) * pageSize + 1;
if ( startIndex < 1) startIndex = 1;
//System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);
return startIndex;
}
/**
* 取本頁包含的記錄數
* @return 本頁包含的記錄數
*/
public int getSize() {
return avaCount;
}
/**
* 取數據庫中包含的總記錄數
* @return 數據庫中包含的總記錄數
*/
public int getTotalSize() {
return this.totalSize;
}
/**
* 取當前頁碼
* @return 當前頁碼
*/
public int getCurrentPageNo(){
return this.currentPageno;
}
/**
* 取總頁碼
* @return 總頁碼
*/
public int getTotalPageCount(){
return this.totalPageCount;
}
}
由于是用mvc這樣的框架,所以在c這一層僅僅起到一個轉向和收集頁面信息的作用,所以這里我有寫了一個分頁查詢的bean,暫時命名是PageCtBean,代碼如下:
package com.util;
import com.model.DBUtil;
import java.sql.*;
/**
* Created by IntelliJ IDEA.
* User: 7612ce
* Date: 2005-6-23
* Time: 10:36:57
* To change this template use Options | File Templates.
*/
public class PageCtBean {
public final static int MAX_PAGE_SIZE = Page.MAX_PAGE_SIZE;
protected String countSQL, querySQL;
protected int pageNo,pageSize,startIndex,totalCount;
protected javax.sql.RowSet rowSet;
protected Page setPage;
protected Object[][] objTables=null;
protected Object[][] objCount=null;
protected Object[] obj=null;
public PageCtBean(){
}
/**
* 構造一查詢出所有數據的PageStatement
. * @param sql query sql
*/
public PageCtBean(String sql){
this(sql,1,MAX_PAGE_SIZE);
}
/**
* 構造一查詢出當頁數據的PageStatement
* @param sql query sql
* @param pageNo 頁碼
*/
public PageCtBean(String sql, int pageNo){
this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);
}
/**
* 構造一查詢出當頁數據的PageStatement,并指定每頁顯示記錄條數
* @param sql query sql
* @param pageNo 頁碼
* @param pageSize 每頁容量
*/
public PageCtBean(String sql, int pageNo, int pageSize){
this.pageNo = pageNo;
this.pageSize = pageSize;
this.startIndex = Page.getStartOfAnyPage(pageNo, pageSize);
this.querySQL = intiQuerySQL(sql, this.startIndex, pageSize);
}
/**
*生成查詢一頁數據的sql語句
*@param sql 原查詢語句
*@ startIndex 開始記錄位置
*@ size 需要獲取的記錄數
*/
protected String intiQuerySQL(String sql, int startIndex, int size){
StringBuffer querySQL = new StringBuffer();
querySQL.append(sql)
.append(" limit ")
.append(startIndex-1 )
.append(",").append(size);
return querySQL.toString();
}
/**
*使用給出的對象設置指定參數的值
*@param obj 包含參數值的對象
*/
public void setObject(Object obj[]) throws SQLException{
this.obj=obj;
}
public void setCountSql(String sql){
this.countSQL=sql;
}
/**
* 執行查詢取得一頁數據,執行結束后關閉數據庫連接
* @return RowSetPage
. * @throws SQLException
*/
public Page executeQuery() throws ClassNotFoundException{
System.out.println("executeQueryUsingPreparedStatement");
DBUtil DBean=new DBUtil();
try{
objCount = DBean.doSearch(this.countSQL,obj);
if (!objCount.equals(null)){
System.out.println("the count is ="+objCount[0][0].toString());
totalCount =Integer.parseInt(objCount[0][0].toString()) ;
System.out.println("the count is ="+totalCount);
} else {
totalCount = 0;
}
if (totalCount < 1 )
return null;
objTables= DBean.doSearch(this.querySQL,obj);
this.setPage = new Page(this.objTables,startIndex,totalCount,pageSize);
return this.setPage;
}catch(SQLException sqle){
//System.out.println("executeQuery SQLException");
sqle.printStackTrace();
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e.toString());
}
return null;
}
/**
*取封裝成Page的查詢結果
*@return Page
*/
public Page getPage() {
return this.setPage;
}
}
接下來是Action里面的代碼,暫時定義這個Action 是ComputerAction,代碼如下:
package com.action;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.form.LoginForm;
import com.util.LoginBean;
import com.util.ComputerBean;
import com.util.BaseView;
import com.util.Page;
import com.model.FunctionManager;
import com.attribute.Constants;
import com.attribute.SQLBook;
import java.sql.ResultSet;
/**
* Created by IntelliJ IDEA.
* User: 7612CE
* Date: 2005-6-14
* Time: 13:31:34
* To change this template use Options | File Templates.
*/
public class ComputerAction extends BaseAction {
private Log log=LogFactory.getLog(this.getClass().getName());
public ActionForward execute(ActionMapping mapping,
ActionForm Form,
HttpServletRequest request,
HttpServletResponse response){
boolean flag=false;
Object[][] obj=null;
Page page=new Page();
Integer id=new Integer(Constants.id);
String sql=SQLBook.Computer_select_SQL;
BaseView view=new BaseView();
String pageNo = request.getParameter("pageNo");
if (pageNo == null || pageNo.equals("null") || pageNo.length() <= 0) {
pageNo = "1";
}
try{
Object[] table={id};
ComputerBean computerBean=new ComputerBean();
computerBean.setBeanDate(sql,table);
computerBean.setPageNo(pageNo);
page=computerBean.getResult();
obj=page.getData();
if(!obj.equals(null)){
flag=true;
view.setObject(obj);
request.setAttribute(Constants.QUERY_RESULT,view);
request.setAttribute("page",page);
}
}catch(Exception ex){
ex.printStackTrace();
}
log.info("system print the flag ="+flag);
if(flag){
return(mapping.findForward(Constants.FORWARD_SUCCESS));
}else{
return(mapping.findForward(Constants.FORWARD_FAILURE));
}
}
}
由于Action里面用到了查詢的SQL語句,所有SQL語句寫在一個特定的類中,這個類名定義為SQLBook,代碼如下:
public class SQLBook {
public SQLBook(){}
/**
* computer sql
*/
public static final String Computer_select_SQL=
"select a.id,a.bookname,a.bookclass,b.classname,"+
"a.author,a.publish,a.bookno,a.content,a.prince,a.amount,"+
"a.Leav_number,a.regtime,a.picture from book a,bookclass b"+
" where a.Bookclass = b.Id and a.bookclass=? "+
" order by a.Id desc ";
public static final String Computer_select_count_sql=
"select count(*) from book a,bookclass b"+
" where a.Bookclass = b.Id and a.bookclass=? "+
" order by a.Id desc ";
}
到此為止,基本上分頁的代碼基本完成,為了使得分頁的代碼共用,我把他封裝成了一個標簽,這個方法是參考一個網友的文章上寫的,在這里表示感謝。這個自定義的標簽命名為PaginatorTag,代碼如下:
package com.util;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class PaginatorTag extends BodyTagSupport {
protected Log log = LogFactory.getLog(this.getClass());
//以下是一標簽中的一些屬性,后面有較詳細的介紹
int currentPage = 1;//當前頁碼
String url = "";//轉向的地址
int totalSize = 0;//總的記錄數
int perPage = 20;//每頁顯示的記錄數目
boolean showTotal = true;//是否顯示總數量
boolean showAllPages = false;//是否顯示總頁碼
String strUnit ="";//計數單位
//得到當前頁碼
public int getCurrentPage() {
return currentPage;
}
//設置當前頁碼
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
//得到每頁顯示記錄的數目
public int getMaxPerPage() {
return perPage;
}
//設置每頁顯示的記錄數目
public void setMaxPerPage(int perPage) {
this.perPage = perPage;
}
//判斷是否顯示總的頁碼數目
public boolean isShowAllPages() {
return showAllPages;
}
//設置是否顯示總的頁碼數目
public void setShowAllPages(boolean showAllPages) {
this.showAllPages = showAllPages;
}
//判斷是否顯示總的記錄數目
public boolean isShowTotal() {
return showTotal;
}
//設置是否顯示總的記錄數目
public void setShowTotal(boolean showTotal) {
this.showTotal = showTotal;
}
//得到計數單位
public String getStrUnit() {
return strUnit;
}
//設置計數單位
public void setStrUnit(String strUnit) {
this.strUnit = strUnit;
}
//得到總的記錄數目
public int getTotalPut() {
return totalSize;
}
//設置總的記錄數目
public void setTotalPut(int totalSize) {
this.totalSize = totalSize;
}
//得到轉向的鏈接地址
public String getUrl() {
return url;
}
//設置鏈接地址
public void setUrl(String url) {
this.url = url;
}
public int doStartTag() throws JspException {
return SKIP_BODY;
}
public int doEndTag() throws JspException {
String out = showPage(currentPage, url, totalSize, perPage, showTotal, showAllPages, strUnit);
try {
pageContext.getOut().print(out);
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_PAGE;
}
/**
* 作 用:顯示“上一頁 下一頁”等信息
*
* @param url
* ----鏈接地址
* @ param totalSize
* ----總數量
* @ param perPage
* ----每頁數量
* @param showTotal
* ----是否顯示總數量
* @param showAllPages
* ---是否用下拉列表顯示所有頁面以供跳轉。有某些頁面不能使用,否則會出現JS錯誤。
* @param strUnit
* ----計數單位
* @return .
* @ throws IOException
*/
protected String showPage(int currentPage,String url, int totalSize, int perPage,
boolean showTotal, boolean showAllPages, String strUnit){
int n = 0;
StringBuffer buf = new StringBuffer();
String strUrl;
n = (totalSize + perPage -1) / perPage;
buf.append("<table align='center'><tr><td>");
if (showTotal == true)
buf.append("共 <b>" + totalSize + "</b> " + strUnit
+ " ");
strUrl = JoinChar(url);
if (currentPage < 2) {
buf.append("首頁 上一頁 ");
} else {
buf.append("<a href='" + strUrl + "pageNo=1' title='首頁'>首頁</a> ");
buf.append("<a href='" + strUrl + "pageNo=" + (currentPage - 1)
+ "' title='上一頁'>上一頁</a> ");
}
if (n - currentPage < 1)
buf.append("下一頁 尾頁");
else {
buf.append("<a href='" + strUrl + "pageNo=" + (currentPage + 1)
+ "' title='下一頁'>下一頁</a> ");
buf.append("<a href='" + strUrl + "pageNo=" + n + "' title='尾頁'>尾頁</a>");
}
buf.append(" 頁次:<strong><font color=red>" + currentPage
+ "</font>/" + n + "</strong>頁 ");
buf.append(" <b>" + perPage + "</b>" + strUnit + "/頁");
if (showAllPages == true) {
buf
.append(" 轉到:<select name='page' size='1' onchange=\"javascript:window.location='"
+ strUrl
+ "pageNo="
+ "'+this.options[this.selectedIndex].value;\">");
for (int i = 1; i <= n; i++) {
buf.append("<option value='" + i + "'");
if(currentPage == i)
buf.append(" selected ");
buf.append(">第" + i + "頁</option>");
}
buf.append("</select>");
}
buf.append("</td></tr></table>");
return (buf.toString());
}
/**
* 向地址中加入 ? 或 &
* @param strUrl
* ----網址.
* @return 加了 ? 或 & 的網址.
*/
protected String JoinChar(String strUrl) {
String result = "";
if (strUrl.equals("") || strUrl.length() <= 0) {
return result;
}
if (strUrl.indexOf("?") < strUrl.length()) {
if (strUrl.indexOf("?") > -1) {
if (strUrl.indexOf("&") < strUrl.length()) {
result = strUrl + "&";
} else {
result = strUrl;
}
} else {
result = strUrl + "?";
}
} else {
result = strUrl;
}
return result;
}
}
有了自定義標簽,當然少不了用于處理標簽的tld,我們定義一個swsoft-struts.tld,代碼如下:
有了自定義標簽,當然少不了用于處理標簽的tld,我們定義一個swsoft-struts.tld,代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>out</shortname>
<uri>http://www.swsoftware.com/</uri>
<info>Tab Library for PaginatorTag</info>
<tag>
<name>paginator</name>
<tagclass>com.swsoftware.tags.PaginatorTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>Returns a paginator</info>
<attribute>
<name>currentPage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalPut</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>maxPerPage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>showTotal</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>showAllPages</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>strUnit</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
好了,到現在我們開始來真正看一下jsp中的處理,我們寫一個computer.jsp,代碼如下:
<%@ page import="com.util.BaseView,
com.attribute.Constants,
com.util.Page"%>
<%@ page contentType="text/html;charset=GB2312" language="java" errorPage=""%>
<%@ taglib uri="/WEB-INF/swsoft-struts.tld"prefix="swtag"%>
<html>
<head>
<title></title>
</head>
<body bgcolor="#e3edfc">
<div id="Layer1" style="position:absolute; left:1px; top:2px; width:780px; height:406px; z-index:1; background-color: #e3edfc; layer-background-color: #e3edfc; border: 1px none #000000;">
<table width="100%" cellpadding="1">
<tr>
<td colspan="6">
<table width="100%" cellpadding="1">
<tr>
<td width="20%" align="center">BOOKNAME</td>
<td width="10%" align="center">AUTHOR</td>
<td width="10%" align="center">TYPE</td>
<td width="30%" align="center">PUBLISH</td>
<td width="10%" align="center">PRINCE</td>
<td colspan="2" align="center">SELECT</td>
</tr>
<%
String contextPath = request.getContextPath();
String url=contextPath+"/computer.do";
BaseView view=(BaseView)request.getAttribute(Constants.QUERY_RESULT);
Page setpage=(Page)request.getAttribute("page");
int currentPage=setpage.getCurrentPageNo();
System.out.println("this is currentPage="+currentPage);
int totalPut=setpage.getTotalSize();
System.out.println("this is totalPut="+totalPut);
int maxPerPage=setpage.getPageSize();
System.out.println("this is maxPerPage="+maxPerPage);
if(view.haveRecord()){
String sBgcolor="";
int length=view.getRecordCount();
for(int i=0;i<length;i++){
String type =view.getValue(i,2);
if(type.equals("1")){
type="computer";
}
if(i%2!=0){
sBgcolor="#A5C6EB";
}
else{
sBgcolor="#B7D7EF";
}
%>
<tr bgcolor=<%=sBgcolor%> height="10">
<td align="center" ><%=view.getValue(i,1)%></td>
<td align="center"><%=view.getValue(i,4)%></td>
<td align="center"><%=type%></td>
<td align="center"><%=view.getValue(i,5)%></td>
<td align="center"><%=view.getValue(i,8)%></td>
<td width="20%" align="center">BUY PARTICULAR</td>
</tr>
<%}}%>
</table>
</td>
</tr>
<tr>
<swtag:paginator url="<%=url%>"
currentPage="<%=currentPage%>"
totalPut="<%=totalPut%>"
maxPerPage="<%=maxPerPage%>"
showTotal="true"
showAllPages="true"
strUnit="頁" />
</tr>
</table>
</div>
</body>
</html>
到此為止,分頁的類基本完成,這樣的話可以在別的模塊都可以用這個標簽,同時在開發別的系統的時候這個標簽也可以使用,具有比較好的可移植性。這個數據庫是mysql的,要是oracle的,僅僅在PageCtBean類中的intiQuerySQL方法里面改成
protected String intiQuerySQL(String sql, int startIndex, int size){
StringBuffer querySQL = new StringBuffer();
if (size != this.MAX_PAGE_SIZE) {
querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
.append( sql)
.append(") my_table where rownum<").append(startIndex + size)
.append(") where my_rownum>=").append(startIndex);
} else {
querySQL.append("select * from (select my_table.*,rownum as my_rownum from(")
.append(sql)
.append(") my_table ")
.append(") where my_rownum>=").append(startIndex);
}
return querySQL.toString();
}
就可以了。
同時在數據庫中,返回當前頁需要顯示的數據,主要有以下方法,。
a.使用mysql控制:
select * from user
order by Host
limit m, n
結果返回的是第m+1行到第n行的數據集。
比如
select * from user
order by Host
limit 1, 5
返回的是第2行到第5行的數據集
b.使用sqlserver
SELECT *
FROM (SELECT TOP m *
FROM (SELECT TOP n *
FROM Customers) A
ORDER BY CustomerID DESC) B
ORDER BY CustomerID
獲得的結果集數據為第n-m+1行到第n行。
對整個過程的解釋:
首先按照升序得到前n行的結果集A,然后按照降序從A中得到后m行的結果集B,最后按照升序對B進行重新排序,返回結果集。
其中CustomerID為主鍵
比如:
SELECT *
FROM (SELECT TOP 5 *
FROM (SELECT TOP 10 *
FROM Customers) A
ORDER BY CustomerID DESC) B
ORDER BY CustomerID
的意思就是返回包含第6行到第10行的數據結果集。
c.使用Oracle:
select * from (select rownum r ,* from test) tt
where tt.r > 50 and tt.r <= 100;
希望大家有好方法的話能說一下,大家共同進步.
posted on 2005-10-26 18:40
YangRj 閱讀(434)
評論(0) 編輯 收藏 所屬分類:
精華文章