亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

JSP分頁技術實現 使用工具類實現通用分頁處理

2024-09-05 00:19:28
字體:
來源:轉載
供稿:網友
目前比較廣泛使用的分頁方式是將查詢結果緩存在httpsession或有狀態bean中,翻頁的時候從緩存中取出一頁數據顯示。這種方法有兩個主要的缺點:一是用戶可能看到的是過期數據;二是如果數據量非常大時第一次查詢遍歷結果集會耗費很長時間,并且緩存的數據也會占用大量內存,效率明顯下降。
  其它常見的方法還有每次翻頁都查詢一次數據庫,從resultset中只取出一頁數據(使用rs.last();rs.getrow()獲得總計錄條數,使用rs.absolute()定位到本頁起始記錄)。這種方式在某些數據庫(如oracle)的jdbc實現中差不多也是需要遍歷所有記錄,實驗證明在記錄數很大時速度非常慢。
  至于緩存結果集resultset的方法則完全是一種錯誤的做法。因為resultset在statement或connection關閉時也會被關閉,如果要使resultset有效勢必長時間占用數據庫連接。

  因此比較好的分頁做法應該是每次翻頁的時候只從數據庫里檢索頁面大小的塊區的數據。這樣雖然每次翻頁都需要查詢數據庫,但查詢出的記錄數很少,網絡傳輸數據量不大,如果使用連接池更可以略過最耗時的建立數據庫連接過程。而在數據庫端有各種成熟的優化技術用于提高查詢速度,比在應用服務器層做緩存有效多了。

  在oracle數據庫中查詢結果的行號使用偽列rownum表示(從1開始)。例如select * from employee where rownum<10 返回前10條記錄。但因為rownum是在查詢之后排序之前賦值的,所以查詢employee按birthday排序的第100到120條記錄應該這么寫:
[pre]     select * from (
        select my_table.*, rownum as my_rownum from (
          select name, birthday from employee order by birthday
        ) my_table where rownum <120
    ) where my_rownum>=100
[/pre]
  mysql可以使用limit子句:
    select name, birthday from employee order by birthday limit 99,20
  db2有rownumber()函數用于獲取當前行數。
  sql server沒研究過,可以參考這篇文章:http://www.csdn.net/develop/article/18/18627.shtm

  在web程序中分頁會被頻繁使用,但分頁的實現細節卻是編程過程中比較麻煩的事情。大多分頁顯示的查詢操作都同時需要處理復雜的多重查詢條件,sql語句需要動態拼接組成,再加上分頁需要的記錄定位、總記錄條數查詢以及查詢結果的遍歷、封裝和顯示,程序會變得很復雜并且難以理解。因此需要一些工具類簡化分頁代碼,使程序員專注于業務邏輯部分。下面是我設計的兩個工具類:
  pagedstatement 封裝了數據庫連接、總記錄數查詢、分頁查詢、結果數據封裝和關閉數據庫連接等操作,并使用了preparedstatement支持動態設置參數。
  rowsetpage 參考petstore的page by page iterator模式, 設計rowsetpage用于封裝查詢結果(使用oraclecachedrowset緩存查詢出的一頁數據,關于使用cachedrowset封裝數據庫查詢結果請參考jsp頁面查詢顯示常用模式)以及當前頁碼、總記錄條數、當前記錄數等信息, 并且可以生成簡單的html分頁代碼。
  pagedstatement 查詢的結果封裝成rowsetpage。

  下面是簡單的使用示例:


  //dao查詢數據部分代碼:
  …
  public rowsetpage getemployee(string gender, int pageno) throws exception{
    string sql="select emp_id, emp_code, user_name, real_name from employee where gender =?";
    //使用oracle數據庫的分頁查詢實現,每頁顯示5條
    pagedstatement pst =new pagedstatementoracleimpl(sql, pageno, 5);
    pst.setstring(1, gender);
    return pst.executequery();
  }


  //servlet處理查詢請求部分代碼:

  …
  int pageno;
  try{
    //可以通過參數pageno獲得用戶選擇的頁碼
    pageno = integer.parseint(request.getparameter("pageno") );
  }catch(exception ex){
    //默認為第一頁
    pageno=1;
  }
  string gender = request.getparameter("gender" );
  request.setattribute("emppage", mybean.getemployee(gender, pageno) );
  …

  //jsp顯示部分代碼
<%@ page import = "page.rowsetpage"%>
  …
  <script language="javascript">
    function doquery(){
        form1.actiontype.value="doquery";
        form1.submit();
  }
  </script>
  …
  <form name=form1 method=get>
    <input type=hidden name=actiontype>
    性別:
    <input type=text name=gender size=1 value="<%=request.getparameter("gender")%>">
    <input type=button value=" 查詢 " >
<%
  rowsetpage emppage = (rowsetpage)request.getattribute("emppage");
  if (emppage == null ) emppage = rowsetpage.empty_page;
%>
  …
  <table cellspacing="0" width="90%">
    <tr> <td>id</td> <td>代碼</td> <td>用戶名</td> <td>姓名</td> </tr>
<%
  javax.sql.rowset emprs = (javax.sql.rowset) emppage.getrowset();
  if (emprs!=null) while (emprs.next() ) {
%>
    <tr>  
        <td><%= emprs.getstring("emp_id")%></td>
        <td><%= emprs.getstring("emp_code")%></td>  
        <td><%= emprs.getstring("user_name")%></td>
        <td><%= emprs.getstring("real_name")%></td>  
    </tr>
<%
  }// end while
%>
    <tr>
<%
  //顯示總頁數和當前頁數(pageno)以及分頁代碼。
  //此處doquery為頁面上提交查詢動作的javascript函數名, pageno為標識當前頁碼的參數名
%>
        <td colspan=4><%= emppage .gethtml("doquery", "pageno")%></td>
    </tr>
  </table>
  </form>

  效果如圖:
=800) window.open('/xrssfile/2006-5/11/2006511194114817.jpg');" height=201 alt="" hspace=0 src="http://www.jscode.cn/uploadpic/2007-5/20075623104206.jpg" width=492 border=0>
因為分頁顯示一般都會伴有查詢條件和查詢動作,頁面應已經有校驗查詢條件和提交查詢的javascript方法(如上面的doquery),所以rowsetpage.gethtml()生成的分頁代碼在用戶選擇新頁碼時直接回調前面的處理提交查詢的javascript方法。注意在顯示查詢結果的時候上次的查詢條件也需要保持,如<input type=text name=gender size=1 value="<%=request.getparameter("gender")%>">。同時由于頁碼的參數名可以指定,因此也支持在同一頁面中有多個分頁區。
  另一種分頁代碼實現是生成每一頁的url,將查詢參數和頁碼作為querystring附在url后面。這種方法的缺陷是在查詢條件比較復雜時難以處理,并且需要指定處理查詢動作的servlet,可能不適合某些定制的查詢操作。
  如果對rowsetpage.gethtml()生成的默認分頁代碼不滿意可以編寫自己的分頁處理代碼,rowsetpage提供了很多getter方法用于獲取相關信息(如當前頁碼、總頁數、 總記錄數和當前記錄數等)。
  在實際應用中可以將分頁查詢和顯示做成jsp taglib, 進一步簡化jsp代碼,屏蔽java code。

附:分頁工具類的源代碼, 有注釋,應該很容易理解。

1.page.java
2.rowsetpage.java(rowsetpage繼承page)
3.pagedstatement.java
4.pagedstatementoracleimpl.java(pagedstatementoracleimpl繼承pagedstatement)



您可以任意使用這些源代碼,但必須保留author [email protected]字樣


///////////////////////////////////
//
// page.java
// author: [email protected]
//
///////////////////////////////////

package page;

import java.util.list;
import java.util.arraylist;
import java.util.collection;
import java.util.collections;


/**
* title: 分頁對象<br>
* description: 用于包含數據及分頁信息的對象<br>
*           page類實現了用于顯示分頁信息的基本方法,但未指定所含數據的類型,
*           可根據需要實現以特定方式組織數據的子類,<br>
*           如rowsetpage以rowset封裝數據,listpage以list封裝數據<br>
* copyright:   copyright (c) 2002 <br>
* @author [email protected] <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 = 20;
  public static final int max_page_size = 9999;

  private int mypagesize = default_page_size;

  private int start;
  private int avacount,totalsize;
  private object data;

  private int currentpageno;
  private int totalpagecount;

  /**
  * 默認構造方法,只構造空頁
  */
  protected page(){
    this.init(0,0,0,default_page_size,new object());
  }

  /**
  * 分頁數據初始方法,由子類調用
  * @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 has下一頁:控制字符串的超長部分用省略號表示 () {
    /*
    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 getstartof下一頁:控制字符串的超長部分用省略號表示 () {
    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;
  }


  /**
  *
  * @param queryjsfunctionname 實現分頁的js腳本名字,頁碼變動時會自動回調該方法
  * @param pagenoparamname 頁碼參數名稱
  * @return
  */
  public string gethtml(string queryjsfunctionname, string pagenoparamname){
    if (gettotalpagecount()<1){
        return "<input type='hidden' name='"+pagenoparamname+"' value='1' >";
    }
    if (queryjsfunctionname == null || queryjsfunctionname.trim().length()<1) {
        queryjsfunctionname = "gotopage";
    }
    if (pagenoparamname == null || pagenoparamname.trim().length()<1){
        pagenoparamname = "pageno";
    }

    string gotopage = "_"+queryjsfunctionname;

    stringbuffer html = new stringbuffer("/n");
    html.append("<script language=/"javascript1.2/">/n")
        .append("function ").append(gotopage).append("(pageno){ /n")
        .append( "   var curpage=1; /n")
        .append( "   try{ curpage = document.all[/"")
        .append(pagenoparamname).append("/"].value; /n")
        .append( "     document.all[/"").append(pagenoparamname)
        .append("/"].value = pageno; /n")
        .append( "     ").append(queryjsfunctionname).append("(pageno); /n")
        .append( "     return true; /n")
        .append( "   }catch(e){ /n")
//         .append( "     try{ /n")
//         .append( "       document.forms[0].submit(); /n")
//         .append( "     }catch(e){   /n")
        .append( "       alert('尚未定義查詢方法:function ")
        .append(queryjsfunctionname).append("()'); /n")
        .append( "       document.all[/"").append(pagenoparamname)
        .append("/"].value = curpage; /n")
        .append( "       return false; /n")
//         .append( "     } /n")
        .append( "   } /n")
        .append( "}")
        .append( "</script> /n")
        .append( "");
    html.append( "<table border=0 cellspacing=0 cellpadding=0 align=center width=80%> /n")
        .append( " <tr> /n")
        .append( "   <td align=left><br> /n");
    html.append( "     共" ).append( gettotalpagecount() ).append( "頁")
        .append( "     [") .append(getstart()).append("..").append(getend())
        .append("/").append(this.gettotalsize()).append("] /n")
        .append( "   </td> /n")
        .append( "   <td align=right> /n");
    if (haspreviouspage()){
        html.append( "[<a href='javascript:").append(gotopage)
        .append("(") .append(getcurrentpageno()-1)
        .append( ")'>上一頁</a>]   /n");
    }
    html.append( "     第")
        .append(   "     <select name='")
        .append(pagenoparamname).append("' onchange='javascript:")
        .append(gotopage).append("(this.value)'>/n");
    string selected = "selected";
    for(int i=1;i<=gettotalpagecount();i++){
        if( i == getcurrentpageno() )
          selected = "selected";
        else selected = "";
        html.append( "     <option value='").append(i).append("' ")
        .append(selected).append(">").append(i).append("</option> /n");
    }
    if (getcurrentpageno()>gettotalpagecount()){
        html.append( "     <option value='").append(getcurrentpageno())
        .append("' selected>").append(getcurrentpageno())
        .append("</option> /n");
    }
    html.append( "   </select>頁 /n");
    if (has下一頁:控制字符串的超長部分用省略號表示 ()){
        html.append( "   [<a href='javascript:").append(gotopage)
          .append("(").append((getcurrentpageno()+1))
          .append( ")'>下一頁</a>]   /n");
    }
    html.append( "</td></tr></table> /n");

    return html.tostring();

  }
}




///////////////////////////////////
//
// rowsetpage.java
// author: [email protected]
//
///////////////////////////////////
package page;

import javax.sql.rowset;


/**
* <p>title: rowsetpage</p>
* <p>description: 使用rowset封裝數據的分頁對象</p>
* <p>copyright: copyright (c) 2003</p>
* @author [email protected]
* @version 1.0
*/

public class rowsetpage extends page {
  private javax.sql.rowset rs;

  /**
  *空頁
  */
  public static final rowsetpage empty_page = new rowsetpage();

  /**
  *默認構造方法,創建空頁
  */
  public rowsetpage(){
    this(null, 0,0);
  }

  /**
  *構造分頁對象
  *@param crs 包含一頁數據的oraclecachedrowset
  *@param start 該頁數據在數據庫中的起始位置
  *@param totalsize 數據庫中包含的記錄總數
  */
  public rowsetpage(rowset crs, int start, int totalsize) {
    this(crs,start,totalsize,page.default_page_size);
  }

  /**
  *構造分頁對象
  *@param crs 包含一頁數據的oraclecachedrowset
  *@param start 該頁數據在數據庫中的起始位置
  *@param totalsize 數據庫中包含的記錄總數
  *@pagesize 本頁能容納的記錄數
  */
  public rowsetpage(rowset crs, int start, int totalsize, int pagesize) {
    try{
        int avacount=0;
        if (crs!=null) {
          crs.beforefirst();
          if (crs.next()){
            crs.last();
            avacount = crs.getrow();
          }
          crs.beforefirst();
        }
        rs = crs;
        super.init(start,avacount,totalsize,pagesize,rs);
    }catch(java.sql.sqlexception sqle){
        throw new runtimeexception(sqle.tostring());
    }
  }

  /**
  *取分頁對象中的記錄數據
  */
  public javax.sql.rowset getrowset(){
    return rs;
  }


}




///////////////////////////////////
//
// pagedstatement.java
// author: [email protected]
//
///////////////////////////////////

package page;

import foo.dbutil;

import java.math.bigdecimal;
import java.util.list;
import java.util.iterator;
import java.util.collections;

import java.sql.connection;
import java.sql.sqlexception;
import java.sql.resultset;
import java.sql.statement;
import java.sql.preparedstatement;
import java.sql.timestamp;
import javax.sql.rowset;

/**
* <p>title: 分頁查詢</p>
* <p>description: 根據查詢語句和頁碼查詢出當頁數據</p>
* <p>copyright: copyright (c) 2002</p>
* @author [email protected]
* @version 1.0
*/
public abstract class pagedstatement {
  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 rowsetpage rowsetpage;

  private list boundparams;

  /**
  * 構造一查詢出所有數據的pagestatement
  * @param sql query sql
  */
  public pagedstatement(string sql){
    this(sql,1,max_page_size);
  }


  /**
  * 構造一查詢出當頁數據的pagestatement
  * @param sql query sql
  * @param pageno 頁碼
  */
  public pagedstatement(string sql, int pageno){
    this(sql, pageno, page.default_page_size);
  }

  /**
  * 構造一查詢出當頁數據的pagestatement,并指定每頁顯示記錄條數
  * @param sql query sql
  * @param pageno 頁碼
  * @param pagesize 每頁容量
  */
  public pagedstatement(string sql, int pageno, int pagesize){
    this.pageno = pageno;
    this.pagesize = pagesize;
    this.startindex = page.getstartofanypage(pageno, pagesize);
    this.boundparams = collections.synchronizedlist(new java.util.linkedlist());

    this.countsql = "select count(*) from ( " + sql +") ";
    this.querysql = intiquerysql(sql, this.startindex, pagesize);
  }


  /**
  *生成查詢一頁數據的sql語句
  *@param sql 原查詢語句
  *@startindex 開始記錄位置
  *@size 需要獲取的記錄數
  */
  protected abstract string intiquerysql(string sql, int startindex, int size);


  /**
  *使用給出的對象設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param obj 包含參數值的對象
  */
  public void setobject(int index, object obj) throws sqlexception{
    boundparam bp = new boundparam(index, obj);
    boundparams.remove(bp);
    boundparams.add( bp);
  }

  /**
  *使用給出的對象設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param obj 包含參數值的對象
  *@param targetsqltype 參數的數據庫類型
  */
  public void setobject(int index, object obj, int targetsqltype) throws sqlexception{
    boundparam bp = new boundparam(index, obj, targetsqltype);
    boundparams.remove(bp);
    boundparams.add(bp );
  }

  /**
  *使用給出的對象設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param obj 包含參數值的對象
  *@param targetsqltype 參數的數據庫類型(常量定義在java.sql.types中)
  *@param scale 精度,小數點后的位數
  * (只對targetsqltype是types.number或types.decimal有效,其它類型則忽略)
  */
  public void setobject(int index, object obj, int targetsqltype, int scale) throws sqlexception{
    boundparam bp = new boundparam(index, obj, targetsqltype, scale) ;
    boundparams.remove(bp);
    boundparams.add(bp);
  }

  /**
  *使用給出的字符串設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param str 包含參數值的字符串
  */
  public void setstring(int index, string str)throws sqlexception{
    boundparam bp = new boundparam(index, str) ;
    boundparams.remove(bp);
    boundparams.add(bp);
  }

  /**
  *使用給出的字符串設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param timestamp 包含參數值的時間戳
  */
  public void settimestamp(int index, timestamp timestamp)throws sqlexception{
    boundparam bp = new boundparam(index, timestamp) ;
    boundparams.remove(bp);
    boundparams.add( bp );
  }

  /**
  *使用給出的整數設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param value 包含參數值的整數
  */
  public void setint(int index, int value)throws sqlexception{
    boundparam bp = new boundparam(index, new integer(value)) ;
    boundparams.remove(bp);
    boundparams.add( bp );
  }

  /**
  *使用給出的長整數設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param value 包含參數值的長整數
  */
  public void setlong(int index, long value)throws sqlexception{
    boundparam bp = new boundparam(index, new long(value)) ;
    boundparams.remove(bp);
    boundparams.add( bp );
  }

  /**
  *使用給出的雙精度浮點數設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param value 包含參數值的雙精度浮點數
  */
  public void setdouble(int index, double value)throws sqlexception{
    boundparam bp = new boundparam(index, new double(value))   ;
    boundparams.remove(bp);
    boundparams.add( bp);
  }

  /**
  *使用給出的bigdecimal設置指定參數的值
  *@param index 第一個參數為1,第二個為2,。。。
  *@param bd 包含參數值的bigdecimal
  */
  public void setbigdecimal(int index, bigdecimal bd)throws sqlexception{
    boundparam bp =   new boundparam(index, bd )   ;
    boundparams.remove(bp);
    boundparams.add( bp);
  }

  private void setparams(preparedstatement pst) throws sqlexception{
    if (pst==null || this.boundparams==null || this.boundparams.size()==0 ) return ;
    boundparam param;
    for (iterator itr = this.boundparams.iterator();itr.hasnext();){
        param = (boundparam) itr.next();
        if (param==null) continue;
        if (param.sqltype == java.sql.types.other){
          pst.setobject(param.index, param.value);
        }else{
          pst.setobject(param.index, param.value, param.sqltype, param.scale);
        }
    }
  }



  /**
  * 執行查詢取得一頁數據,執行結束后關閉數據庫連接
  * @return rowsetpage
  * @throws sqlexception
  */
  public rowsetpage executequery() throws sqlexception{
    system.out.println("executequeryusingpreparedstatement");
    connection conn = dbutil.getconnection();
    preparedstatement pst = null;
    resultset rs = null;
    try{
        pst = conn.preparestatement(this.countsql);
        setparams(pst);
        rs =pst.executequery();
        if (rs.next()){
          totalcount = rs.getint(1);
        } else {
          totalcount = 0;
        }

        rs.close();
        pst.close();

        if (totalcount < 1 ) return rowsetpage.empty_page;

        pst = conn.preparestatement(this.querysql);
        system.out.println(querysql);
        pst.setfetchsize(this.pagesize);
        setparams(pst);
        rs =pst.executequery();
        //rs.setfetchsize(pagesize);

        this.rowset = populate(rs);

        rs.close();
        rs = null;
        pst.close();
        pst = null;

        this.rowsetpage = new rowsetpage(this.rowset,startindex,totalcount,pagesize);
        return this.rowsetpage;
    }catch(sqlexception sqle){
        //system.out.println("executequery sqlexception");
        sqle.printstacktrace();
        throw sqle;
    }catch(exception e){
        e.printstacktrace();
        throw new runtimeexception(e.tostring());
    }finally{
        //system.out.println("executequery finally");
        dbutil.close(rs, pst, conn);
    }
  }

  /**
  *將resultset數據填充進cachedrowset
  */
  protected abstract rowset populate(resultset rs) throws sqlexception;

  /**
  *取封裝成rowset查詢結果
  *@return rowset
  */
  public javax.sql.rowset getrowset(){
    return this.rowset;
  }


  /**
  *取封裝成rowsetpage的查詢結果
  *@return rowsetpage
  */
  public rowsetpage getrowsetpage() {
    return this.rowsetpage;
  }



  /**
  *關閉數據庫連接
  */
  public void close(){
    //因為數據庫連接在查詢結束或發生異常時即關閉,此處不做任何事情
    //留待擴充。
  }



  private class boundparam {
    int index;
    object value;
    int sqltype;
    int scale;

    public boundparam(int index, object value) {
        this(index, value, java.sql.types.other);
    }

    public boundparam(int index, object value, int sqltype) {
        this(index, value, sqltype, 0);
    }

    public boundparam(int index, object value, int sqltype, int scale) {
        this.index = index;
        this.value = value;
        this.sqltype = sqltype;
        this.scale = scale;
    }

    public boolean equals(object obj){
        if (obj!=null && this.getclass().isinstance(obj)){
          boundparam bp = (boundparam)obj;
          if (this.index==bp.index) return true;
        }
        return false;
    }
  }

}


///////////////////////////////////
//
// pagedstatementoracleimpl.java
// author: [email protected]
//
///////////////////////////////////
package page;
import java.sql.resultset;
import java.sql.sqlexception;
import javax.sql.rowset;
import oracle.jdbc.rowset.oraclecachedrowset;

/**
* <p>title: 分頁查詢oracle數據庫實現</p>
* <p>copyright: copyright (c) 2002</p>
* @author [email protected]
* @version 1.0
*/
public class pagedstatementoracleimpl extends pagedstatement {

  /**
  * 構造一查詢出所有數據的pagestatement
  * @param sql query sql
  */
  public pagedstatementoracleimpl(string sql){
    super(sql);
  }


  /**
  * 構造一查詢出當頁數據的pagestatement
  * @param sql query sql
  * @param pageno 頁碼
  */
  public pagedstatementoracleimpl(string sql, int pageno){
    super(sql, pageno);
  }

  /**
  * 構造一查詢出當頁數據的pagestatement,并指定每頁顯示記錄條數
  * @param sql query sql
  * @param pageno 頁碼
  * @param pagesize 每頁容量
  */
  public pagedstatementoracleimpl(string sql, int pageno, int pagesize){
    super(sql, pageno, pagesize);
  }


  /**
  *生成查詢一頁數據的sql語句
  *@param sql 原查詢語句
  *@startindex 開始記錄位置
  *@size 需要獲取的記錄數
  */
  protected string intiquerysql(string sql, int startindex, int size){
    stringbuffer querysql = new stringbuffer();
    if (size != super.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();
  }

  /**
  *將resultset數據填充進cachedrowset
  */
  protected rowset populate(resultset rs) throws sqlexception{
    oraclecachedrowset ocrs = new oraclecachedrowset();
    ocrs.populate(rs);
    return ocrs;
  }

}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本电影亚洲天堂| 国产脚交av在线一区二区| 欧美亚洲激情视频| 国产精品流白浆视频| 欧美精品在线免费| 国产精品xxx视频| 久久久精品999| 欧美自拍视频在线| 欧美精品在线极品| 亚洲综合色激情五月| 日韩精品视频在线| 中文字幕免费国产精品| 色婷婷av一区二区三区久久| 久久精品国产一区二区电影| 亚洲国产毛片完整版| 伊人久久大香线蕉av一区二区| 欧美xxxwww| 色婷婷久久一区二区| 日韩a**站在线观看| 成人免费大片黄在线播放| 国产日韩精品在线播放| 美日韩精品免费观看视频| 夜夜嗨av色一区二区不卡| 国产va免费精品高清在线| 欧美性猛交xxxx免费看| 国产成人精品一区二区在线| 日韩精品免费综合视频在线播放| 亚洲电影免费观看高清完整版| 亚洲精品免费在线视频| 欧美色视频日本高清在线观看| 亚洲丝袜在线视频| 国产亚洲欧洲高清一区| 91久久精品美女| 欧美日韩综合视频网址| 精品小视频在线| 亚洲欧美日韩天堂| 国产精品高潮呻吟久久av无限| 国产精品黄页免费高清在线观看| 性欧美激情精品| 日韩免费av一区二区| www.久久色.com| 国产精品第1页| 亚洲国产精品资源| 国产99久久精品一区二区| 亚洲桃花岛网站| 91精品国产高清久久久久久| 欧美黄色成人网| 国产专区精品视频| 激情亚洲一区二区三区四区| 欧美裸体xxxx极品少妇| 亚洲欧美一区二区精品久久久| 亚洲欧美国产一区二区三区| 国内精品免费午夜毛片| 色综合久久88色综合天天看泰| 久久91精品国产91久久久| 久久久电影免费观看完整版| 亚洲精选一区二区| 久久精品中文字幕免费mv| 亚洲国产欧美一区二区三区久久| 欧美性受xxxx黑人猛交| 久久久久久有精品国产| 日韩中文字幕第一页| 欧美又大粗又爽又黄大片视频| 蜜月aⅴ免费一区二区三区| 日韩av在线导航| 九九热视频这里只有精品| 操人视频在线观看欧美| 欧美另类极品videosbestfree| 亚洲电影中文字幕| 亚洲无限av看| 日韩在线视频免费观看高清中文| 不卡av日日日| 亚洲精品永久免费| 欧美美女操人视频| 91久久国产精品91久久性色| 久久成人人人人精品欧| 不用播放器成人网| 久久久爽爽爽美女图片| 成人久久一区二区三区| 91免费精品视频| 欧美肥老太性生活视频| 国产999精品久久久影片官网| 亚洲国产三级网| 国产一区二区黑人欧美xxxx| 久久激情视频免费观看| 国产精品久久久久福利| 国产做受69高潮| 日韩精品高清视频| 欧美在线视频免费播放| 亚洲综合精品伊人久久| 久久影院在线观看| 精品久久久久久亚洲国产300| 日韩在线观看免费高清| 国产精品一区久久久| 国产精品久久久久久久久久ktv| 欧美中文字幕在线播放| 国产精品久久久久福利| 在线观看欧美www| 日韩在线观看免费网站| 欧美一区二区色| 久热精品视频在线| 国产精品成av人在线视午夜片| 国产成+人+综合+亚洲欧洲| 成人欧美一区二区三区在线湿哒哒| 欧美高跟鞋交xxxxhd| 日韩精品在线观看一区| 久久久国产精品视频| 国产一区深夜福利| 欧美黄色免费网站| 中文字幕不卡在线视频极品| 91久久久在线| 亚洲精品www| 欧美日韩国产精品一区二区三区四区| 亚洲精品按摩视频| 国产精品美女主播在线观看纯欲| 国产精品日日摸夜夜添夜夜av| 欧美日韩视频免费播放| **欧美日韩vr在线| 国产在线拍揄自揄视频不卡99| 国产不卡av在线免费观看| 亚洲国产美女久久久久| 亚洲一区二区三区四区视频| 狠狠躁夜夜躁人人爽天天天天97| 在线一区二区日韩| 国产精品日韩在线观看| 91久久精品久久国产性色也91| 色哟哟入口国产精品| 国产精品美女www| 97色伦亚洲国产| 91av视频在线免费观看| 91色中文字幕| 中文字幕日韩专区| 亚洲第一区在线观看| 国产精品麻豆va在线播放| 午夜精品一区二区三区视频免费看| 最近日韩中文字幕中文| 亚洲香蕉成人av网站在线观看| 亚洲最大av网| 国产综合在线看| 国产精品视频999| 欧洲成人性视频| 激情久久av一区av二区av三区| 亚洲一区二区三区毛片| 日本久久久久久| 亚洲高清色综合| 欧亚精品中文字幕| 亚洲欧美日韩中文视频| 欧美放荡办公室videos4k| 亚洲最大成人网色| 亚洲视频在线免费看| 国产精品高潮呻吟视频| 456亚洲影院| 亚洲成人网在线观看| 精品一区二区三区四区| 孩xxxx性bbbb欧美| 亚洲aaaaaa| 国产免费一区二区三区在线观看| 亚洲欧美三级在线| 国产精品xxx视频| 欧美激情一区二区三级高清视频| 8090理伦午夜在线电影| 九九九久久国产免费| 国产在线观看一区二区三区| 欧美中文在线观看|