欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
JSP分頁(yè)技術(shù)實(shí)現
目前比較廣泛使用的分頁(yè)方式是將查詢(xún)結果緩存在HttpSession或有狀態(tài)bean中,翻頁(yè)的時(shí)候從緩存中取出一頁(yè)數據顯示。這種方法有兩個(gè)主要的缺點(diǎn):一是用戶(hù)可能看到的是過(guò)期數據;二是如果數據量非常大時(shí)第一次查詢(xún)遍歷結果集會(huì )耗費很長(cháng)時(shí)間,并且緩存的數據也會(huì )占用大量?jì)却?,效率明顯下降。
   其它常見(jiàn)的方法還有每次翻頁(yè)都查詢(xún)一次數據庫,從ResultSet中只取出一頁(yè)數據(使用rs.last();rs.getRow()獲得總計錄條數,使用rs.absolute()定位到本頁(yè)起始記錄)。這種方式在某些數據庫(如oracle)的JDBC實(shí)現中差不多也是需要遍歷所有記錄,實(shí)驗證明在記錄數很大時(shí)速度非常慢。
   至于緩存結果集ResultSet的方法則完全是一種錯誤的做法。因為ResultSet在Statement或Connection關(guān)閉時(shí)也會(huì )被關(guān)閉,如果要使ResultSet有效勢必長(cháng)時(shí)間占用數據庫連接。

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

  在oracle數據庫中查詢(xún)結果的行號使用偽列ROWNUM表示(從1開(kāi)始)。例如select * from employee where rownum<10 返回前10條記錄。但因為rownum是在查詢(xún)之后排序之前賦值的,所以查詢(xún)employee按birthday排序的第100到120條記錄應該這么寫(xiě):
[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沒(méi)研究過(guò),可以參考這篇文章:http://www.csdn.net/develop/article/18/18627.shtm

  在Web程序中分頁(yè)會(huì )被頻繁使用,但分頁(yè)的實(shí)現細節卻是編程過(guò)程中比較麻煩的事情。大多分頁(yè)顯示的查詢(xún)操作都同時(shí)需要處理復雜的多重查詢(xún)條件,sql語(yǔ)句需要動(dòng)態(tài)拼接組成,再加上分頁(yè)需要的記錄定位、總記錄條數查詢(xún)以及查詢(xún)結果的遍歷、封裝和顯示,程序會(huì )變得很復雜并且難以理解。因此需要一些工具類(lèi)簡(jiǎn)化分頁(yè)代碼,使程序員專(zhuān)注于業(yè)務(wù)邏輯部分。下面是我設計的兩個(gè)工具類(lèi):
   PagedStatement  封裝了數據庫連接、總記錄數查詢(xún)、分頁(yè)查詢(xún)、結果數據封裝和關(guān)閉數據庫連接等操作,并使用了PreparedStatement支持動(dòng)態(tài)設置參數。
   RowSetPage  參考PetStore的page by page iterator模式, 設計RowSetPage用于封裝查詢(xún)結果(使用OracleCachedRowSet緩存查詢(xún)出的一頁(yè)數據,關(guān)于使用CachedRowSet封裝數據庫查詢(xún)結果請參考JSP頁(yè)面查詢(xún)顯示常用模式)以及當前頁(yè)碼、總記錄條數、當前記錄數等信息, 并且可以生成簡(jiǎn)單的HTML分頁(yè)代碼。
   PagedStatement 查詢(xún)的結果封裝成RowsetPage。

  下面是簡(jiǎn)單的使用示例:


    //DAO查詢(xún)數據部分代碼:
    …
    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數據庫的分頁(yè)查詢(xún)實(shí)現,每頁(yè)顯示5條
        PagedStatement pst =new PagedStatementOracleImpl(sql,  pageNo, 5);
        pst.setString(1, gender);
        return pst.executeQuery();
    }


    //Servlet處理查詢(xún)請求部分代碼:

    …
    int pageNo;
    try{
        //可以通過(guò)參數pageno獲得用戶(hù)選擇的頁(yè)碼
        pageNo = Integer.parseInt(request.getParameter("pageno") );
    }catch(Exception ex){
        //默認為第一頁(yè)
        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=" 查詢(xún) " onclick="doQuery()">
<%
    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>用戶(hù)名</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>
<%
    //顯示總頁(yè)數和當前頁(yè)數(pageno)以及分頁(yè)代碼。
    //此處doQuery為頁(yè)面上提交查詢(xún)動(dòng)作的javascript函數名, pageno為標識當前頁(yè)碼的參數名
%>
            <td colspan=4><%= empPage .getHTML("doQuery", "pageno")%></td>
        </tr>
    </table>
    </form>

  效果如圖:


   因為分頁(yè)顯示一般都會(huì )伴有查詢(xún)條件和查詢(xún)動(dòng)作,頁(yè)面應已經(jīng)有校驗查詢(xún)條件和提交查詢(xún)的javascript方法(如上面的doQuery),所以RowSetPage.getHTML()生成的分頁(yè)代碼在用戶(hù)選擇新頁(yè)碼時(shí)直接回調前面的處理提交查詢(xún)的javascript方法。注意在顯示查詢(xún)結果的時(shí)候上次的查詢(xún)條件也需要保持,如<input type=text name=gender size=1 value="<%=request.getParameter("gender")%>">。同時(shí)由于頁(yè)碼的參數名可以指定,因此也支持在同一頁(yè)面中有多個(gè)分頁(yè)區。
   另一種分頁(yè)代碼實(shí)現是生成每一頁(yè)的URL,將查詢(xún)參數和頁(yè)碼作為QueryString附在URL后面。這種方法的缺陷是在查詢(xún)條件比較復雜時(shí)難以處理,并且需要指定處理查詢(xún)動(dòng)作的servlet,可能不適合某些定制的查詢(xún)操作。
   如果對RowSetPage.getHTML()生成的默認分頁(yè)代碼不滿(mǎn)意可以編寫(xiě)自己的分頁(yè)處理代碼,RowSetPage提供了很多getter方法用于獲取相關(guān)信息(如當前頁(yè)碼、總頁(yè)數、 總記錄數和當前記錄數等)。
   在實(shí)際應用中可以將分頁(yè)查詢(xún)和顯示做成jsp taglib, 進(jìn)一步簡(jiǎn)化JSP代碼,屏蔽Java Code。

附:分頁(yè)工具類(lèi)的源代碼, 有注釋?zhuān)瑧摵苋菀桌斫狻?/p>

1.Page.java
2.RowSetPage.java(RowSetPage繼承Page)
3.PagedStatement.java
4.PagedStatementOracleImpl.java(PagedStatementOracleImpl繼承PagedStatement)

您可以任意使用這些源代碼,但必須保留author evan_zhao@hotmail.com字樣


///////////////////////////////////
//
//  Page.java
//  author: evan_zhao@hotmail.com
//
///////////////////////////////////

package page;

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;


/**
 * Title: 分頁(yè)對象<br>
 * Description:  用于包含數據及分頁(yè)信息的對象<br>
 *               Page類(lèi)實(shí)現了用于顯示分頁(yè)信息的基本方法,但未指定所含數據的類(lèi)型,
 *               可根據需要實(shí)現以特定方式組織數據的子類(lèi),<br>
 *               如RowSetPage以RowSet封裝數據,ListPage以L(fǎng)ist封裝數據<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 = 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;

    /**
     * 默認構造方法,只構造空頁(yè)
     */
    protected Page(){
        this.init(0,0,0,DEFAULT_PAGE_SIZE,new Object());
    }

    /**
     * 分頁(yè)數據初始方法,由子類(lèi)調用
     * @param start 本頁(yè)數據在數據庫中的起始位置
     * @param avaCount 本頁(yè)包含的數據條數
     * @param totalSize 數據庫中總記錄條數
     * @param pageSize 本頁(yè)容量
     * @param data 本頁(yè)包含的數據
     */
    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;
    }

    /**
     * 取本頁(yè)數據容量(本頁(yè)能包含的記錄數)
     * @return 本頁(yè)能包含的記錄數
     */
    public int getPageSize(){
        return this.myPageSize;
    }

    /**
     * 是否有下一頁(yè)
     * @return 是否有下一頁(yè)
     */
    public boolean hasNextPage() {
      /*
        if (avaCount==0 && totalSize==0){
            return false;
        }
        return (start + avaCount -1) < totalSize;
       */
      return (this.getCurrentPageNo()<this.getTotalPageCount());
    }

    /**
     * 是否有上一頁(yè)
     * @return  是否有上一頁(yè)
     */
    public boolean hasPreviousPage() {
      /*
        return start > 1;
       */
      return (this.getCurrentPageNo()>1);
    }

    /**
     * 獲取當前頁(yè)第一條數據在數據庫中的位置
     * @return
     */
    public int getStart(){
        return start;
    }

    /**
     * 獲取當前頁(yè)最后一條數據在數據庫中的位置
     * @return
     */
    public int getEnd(){
        int end = this.getStart() + this.getSize() -1;
        if (end<0) {
            end = 0;
        }
        return end;
    }

    /**
     * 獲取上一頁(yè)第一條數據在數據庫中的位置
     * @return 記錄對應的rownum
     */
    public int getStartOfPreviousPage() {
        return Math.max(start-myPageSize, 1);
    }


    /**
     * 獲取下一頁(yè)第一條數據在數據庫中的位置
     * @return 記錄對應的rownum
     */
    public int getStartOfNextPage() {
        return start + avaCount;
    }

    /**
     * 獲取任一頁(yè)第一條數據在數據庫中的位置,每頁(yè)條數使用默認值
     * @param pageNo 頁(yè)號
     * @return 記錄對應的rownum
     */
    public static int getStartOfAnyPage(int pageNo){
        return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
    }

    /**
     * 獲取任一頁(yè)第一條數據在數據庫中的位置
     * @param pageNo 頁(yè)號
     * @param pageSize 每頁(yè)包含的記錄數
     * @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;
    }

    /**
     * 取本頁(yè)包含的記錄數
     * @return 本頁(yè)包含的記錄數
     */
    public int getSize() {
        return avaCount;
    }

    /**
     * 取數據庫中包含的總記錄數
     * @return 數據庫中包含的總記錄數
     */
    public int getTotalSize() {
        return this.totalSize;
    }

    /**
     * 取當前頁(yè)碼
     * @return 當前頁(yè)碼
     */
    public int getCurrentPageNo(){
        return  this.currentPageno;
    }

    /**
     * 取總頁(yè)碼
     * @return 總頁(yè)碼
     */
    public int getTotalPageCount(){
        return this.totalPageCount;
    }


    /**
     *
     * @param queryJSFunctionName 實(shí)現分頁(yè)的JS腳本名字,頁(yè)碼變動(dòng)時(shí)會(huì )自動(dòng)回調該方法
     * @param pageNoParamName 頁(yè)碼參數名稱(chēng)
     * @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(‘尚未定義查詢(xún)方法: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( "頁(yè)")
             .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( ")‘>上一頁(yè)</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>頁(yè)  \n");
        if (hasNextPage()){
             html.append( "    [<a href=‘javascript:").append(gotoPage)
               .append("(").append((getCurrentPageNo()+1)) 
               .append( ")‘>下一頁(yè)</a>]   \n");
        }
        html.append( "</td></tr></table>  \n");

        return html.toString();

    }
}


///////////////////////////////////
//
//  RowSetPage.java
//  author: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;

import javax.sql.RowSet;


/**
 * <p>Title: RowSetPage</p>
 * <p>Description: 使用RowSet封裝數據的分頁(yè)對象</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * @author evan_zhao@hotmail.com
 * @version 1.0
 */

public class RowSetPage extends Page {
    private javax.sql.RowSet rs;

    /**
     *空頁(yè)
     */
    public static final RowSetPage EMPTY_PAGE = new RowSetPage();

    /**
     *默認構造方法,創(chuàng )建空頁(yè)
     */
    public RowSetPage(){
      this(null, 0,0);
    }

    /**
     *構造分頁(yè)對象
     *@param crs 包含一頁(yè)數據的OracleCachedRowSet
     *@param start 該頁(yè)數據在數據庫中的起始位置
     *@param totalSize 數據庫中包含的記錄總數
     */
    public RowSetPage(RowSet crs, int start, int totalSize) {
        this(crs,start,totalSize,Page.DEFAULT_PAGE_SIZE);
    }

    /**
     *構造分頁(yè)對象
     *@param crs 包含一頁(yè)數據的OracleCachedRowSet
     *@param start 該頁(yè)數據在數據庫中的起始位置
     *@param totalSize 數據庫中包含的記錄總數
     *@pageSize 本頁(yè)能容納的記錄數
     */
    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());
        }
    }

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


}


///////////////////////////////////
//
//  PagedStatement.java
//  author: evan_zhao@hotmail.com
//
///////////////////////////////////

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: 分頁(yè)查詢(xún)</p>
 * <p>Description: 根據查詢(xún)語(yǔ)句和頁(yè)碼查詢(xún)出當頁(yè)數據</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * @author evan_zhao@hotmail.com
 * @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;

    /**
     * 構造一查詢(xún)出所有數據的PageStatement
     * @param sql  query sql
     */
    public PagedStatement(String sql){
        this(sql,1,MAX_PAGE_SIZE);
    }


    /**
     * 構造一查詢(xún)出當頁(yè)數據的PageStatement
     * @param sql  query sql
     * @param pageNo  頁(yè)碼
     */
    public PagedStatement(String sql, int pageNo){
        this(sql, pageNo, Page.DEFAULT_PAGE_SIZE);
    }

    /**
     * 構造一查詢(xún)出當頁(yè)數據的PageStatement,并指定每頁(yè)顯示記錄條數
     * @param sql query sql
     * @param pageNo 頁(yè)碼
     * @param pageSize 每頁(yè)容量
     */
    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);
    }


    /**
     *生成查詢(xún)一頁(yè)數據的sql語(yǔ)句
     *@param sql 原查詢(xún)語(yǔ)句
     *@startIndex 開(kāi)始記錄位置
     *@size 需要獲取的記錄數
     */
    protected abstract  String intiQuerySQL(String sql, int startIndex, int size);


    /**
     *使用給出的對象設置指定參數的值
     *@param index 第一個(gè)參數為1,第二個(gè)為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 第一個(gè)參數為1,第二個(gè)為2,。。。
     *@param obj 包含參數值的對象
     *@param targetSqlType 參數的數據庫類(lèi)型
     */
    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 第一個(gè)參數為1,第二個(gè)為2,。。。
     *@param obj 包含參數值的對象
     *@param targetSqlType 參數的數據庫類(lèi)型(常量定義在java.sql.Types中)
     *@param scale 精度,小數點(diǎn)后的位數
     * (只對targetSqlType是Types.NUMBER或Types.DECIMAL有效,其它類(lèi)型則忽略)
     */
    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 第一個(gè)參數為1,第二個(gè)為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 第一個(gè)參數為1,第二個(gè)為2,。。。
     *@param timestamp 包含參數值的時(shí)間戳
     */
    public void setTimestamp(int index, Timestamp timestamp)throws SQLException{
        BoundParam bp = new BoundParam(index, timestamp)  ;
        boundParams.remove(bp);
        boundParams.add( bp );
    }

    /**
     *使用給出的整數設置指定參數的值
     *@param index 第一個(gè)參數為1,第二個(gè)為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 );
    }

    /**
     *使用給出的長(cháng)整數設置指定參數的值
     *@param index 第一個(gè)參數為1,第二個(gè)為2,。。。
     *@param value 包含參數值的長(cháng)整數
     */
    public void setLong(int index, long value)throws SQLException{
        BoundParam bp =  new BoundParam(index, new Long(value))  ;
        boundParams.remove(bp);
        boundParams.add( bp );
    }

    /**
     *使用給出的雙精度浮點(diǎn)數設置指定參數的值
     *@param index 第一個(gè)參數為1,第二個(gè)為2,。。。
     *@param value 包含參數值的雙精度浮點(diǎn)數
     */
    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 第一個(gè)參數為1,第二個(gè)為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);
            }
        }
    }

    /**
     * 執行查詢(xún)取得一頁(yè)數據,執行結束后關(guān)閉數據庫連接
     * @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數據填充進(jìn)CachedRowSet
     */
    protected abstract RowSet populate(ResultSet rs) throws SQLException;

    /**
     *取封裝成RowSet查詢(xún)結果
     *@return RowSet
     */
    public javax.sql.RowSet getRowSet(){
        return this.rowSet;
    }


    /**
     *取封裝成RowSetPage的查詢(xún)結果
     *@return RowSetPage
     */
    public RowSetPage getRowSetPage() {
        return this.rowSetPage;
    }

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

    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: evan_zhao@hotmail.com
//
///////////////////////////////////
package page;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.RowSet;
import oracle.jdbc.rowset.OracleCachedRowSet;

/**
 * <p>Title: 分頁(yè)查詢(xún)Oracle數據庫實(shí)現</p>
 * <p>Copyright: Copyright (c) 2002</p>
 * @author evan_zhao@hotmail.com
 * @version 1.0
 */
public class PagedStatementOracleImpl extends PagedStatement {

    /**
     * 構造一查詢(xún)出所有數據的PageStatement
     * @param sql  query sql
     */
    public PagedStatementOracleImpl(String sql){
        super(sql);
    }


    /**
     * 構造一查詢(xún)出當頁(yè)數據的PageStatement
     * @param sql  query sql
     * @param pageNo  頁(yè)碼
     */
    public PagedStatementOracleImpl(String sql, int pageNo){
        super(sql, pageNo);
    }

    /**
     * 構造一查詢(xún)出當頁(yè)數據的PageStatement,并指定每頁(yè)顯示記錄條數
     * @param sql query sql
     * @param pageNo 頁(yè)碼
     * @param pageSize 每頁(yè)容量
     */
    public PagedStatementOracleImpl(String sql, int pageNo, int pageSize){
        super(sql, pageNo, pageSize);
    }


    /**
     *生成查詢(xún)一頁(yè)數據的sql語(yǔ)句
     *@param sql 原查詢(xún)語(yǔ)句
     *@startIndex 開(kāi)始記錄位置
     *@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數據填充進(jìn)CachedRowSet
     */
    protected  RowSet populate(ResultSet rs) throws SQLException{
        OracleCachedRowSet ocrs = new OracleCachedRowSet();
        ocrs.populate(rs);
        return ocrs;
    }

}


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JDBC編程結果集的分頁(yè)顯示
CMS項目總結:4、利用pager-taglib實(shí)現分頁(yè)處理(終極武器)
使用工具類(lèi)實(shí)現通用分頁(yè)處理
自定義分頁(yè)標簽
Spring+Mybatis+SpringMVC后臺與前臺分頁(yè)展示實(shí)例
Spring MVC MongoDB 分頁(yè)例子下載
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久