JDBC在Java Web中的應用——分頁查詢

來源:互聯網
上載者:User

標籤:

本文轉自http://www.cnblogs.com/gaopeng527/p/4448105.html 感謝作者分頁查詢

通過JDBC實現分頁查詢的方法有很多種,而且不同的資料庫機制也提供了不同的分頁方式,在這裡介紹兩種非常典型的分頁方法。

  1. 通過ResultSet的游標實現分頁

  通過ResultSet的游標實現分頁,優點是在各種資料庫上通用,缺點是佔用大量資源,不適合資料量大的情況。

  2. 通過資料庫機制進行分頁

  很多資料庫自身都提供了分頁機制,如SQL Server中提供的top關鍵字,MySQL資料庫中提供的limit關鍵字,它們都可以設定資料返回的記錄數。

  通過各種資料庫的分頁機制實現分頁查詢,其優點是減少資料庫資源的開銷,提高程式的效能;缺點是只針對某一種資料庫通用。

說明:由於通過ResultSet的游標實現資料分頁存在效能方面的缺陷,所以,在實際開發中,很多情況下都是採用資料庫提供的分頁機制來實現分頁查詢功能。

例1.1 通過MySQL資料庫提供的分頁機制,實現商品資訊的分頁查詢功能,將分頁資料顯示在JSP頁面中。

(1)建立名稱為Product的類,用於封裝商品資訊,該類是商品資訊的JavaBean。關鍵代碼如下:

 

package com.cn.gao;public class Product {    public static final int PAGE_SIZE=2; //每頁記錄數    private int id;            //編號    private String name;      //名稱    private double price;    //價格    private int num;        //數量    private String unit;   //單位    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public double getPrice() {        return price;    }    public void setPrice(double price) {        this.price = price;    }    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    public String getUnit() {        return unit;    }    public void setUnit(String unit) {        this.unit = unit;    }}

技巧:在Java語言中,如果定義了靜態final類型變數,通常情況下將這個變數大寫。該種編寫方式是一種規範,能夠很容易地與其它類型的變數進行區分。

(2) 建立名稱為ProductDao的類,主要用於封裝商品對象的資料庫相關操作。在ProduceDao類中,首先編寫getConnection()方法,用於建立資料庫連接Connnection對象,其關鍵代碼如下:

/**     * 擷取資料庫連接     * @return Connection 對象     */    public Connection getConnection(){        Connection conn=null;        try {            Class.forName("com.mysql.jdbc.Driver");            String url = "jdbc:mysql://localhost:3306/test";            String user = "root";            String password = "1234";            conn=DriverManager.getConnection(url, user, password);        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return conn;    }

然後建立商品資訊的分頁查詢方法find(),該方法包含一個page參數,用於傳遞要查詢的頁碼。關鍵代碼如下:

/**     * 分頁查詢所有商品資訊     * @param page 頁數     * @return List<Product>     */    public List<Product> find(int page){        List<Product> list = new ArrayList<Product>();        Connection conn = getConnection();        String sql = "select* from tb_product order by id desc limit ?,?";        try {            PreparedStatement ps = conn.prepareStatement(sql);            ps.setInt(1, (page-1)*Product.PAGE_SIZE);            ps.setInt(2, Product.PAGE_SIZE);            ResultSet rs = ps.executeQuery();            while(rs.next()){                Product p=new Product();                p.setId(rs.getInt("id"));                p.setName(rs.getString("name"));                p.setNum(rs.getInt("num"));                p.setPrice(rs.getDouble("price"));                p.setUnit(rs.getString("unit"));                list.add(p);            }            ps.close();            conn.close();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return list;    }

find()方法用於實現分頁查詢功能,該方法根據入口參數page傳遞的頁碼,查詢指定頁碼中的記錄,主要通過limit關鍵字實現。

說明:MySQL資料庫提供的limit關鍵字能夠控制查詢資料結果集起始位置及返回記錄的數量,它的使用方式如下:

limit arg1,arg2參數說明:arg1:用於指定查詢記錄的起始位置。arg2:用於指定查詢資料所返回的記錄數。

在分頁查詢過程中,還需要擷取商品資訊的總記錄數,用於計算商品資訊的總頁數,該操作編寫在findCount()方法中。關鍵代碼如下:

/**     * 查詢總記錄數     * @return 總記錄數     */    public int findCount(){        int count=0;        Connection conn = getConnection();        String sql = "select count(*) from tb_product";        try {            Statement sta = conn.createStatement();            ResultSet rs = sta.executeQuery(sql);            if(rs.next()){                count = rs.getInt(1);  //對總記錄數賦值            }            rs.close();            conn.close();        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return count;        //返回總記錄數    }

(3)建立名稱為FindServlet1的類,該類是分頁查詢商品資訊的Servlet對象。在FindServlet1類中重寫doGet()方法,對分頁請求進行處理,其關鍵代碼如下:

package com.cn.gao;import java.awt.print.Pageable;import java.io.IOException;import java.io.PrintWriter;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class FindServlet1 extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        int currPage=1;        if(request.getParameter("page")!=null){            currPage=Integer.parseInt(request.getParameter("page"));        }        ProductDao dao = new ProductDao();        List<Product> list = dao.find(currPage);        request.setAttribute("list", list);        int pages;  //總頁數        int count=dao.findCount(); //查詢總記錄數        if(count%Product.PAGE_SIZE==0){            pages=count/Product.PAGE_SIZE;        }else{            pages=count/Product.PAGE_SIZE+1;        }        StringBuffer sb = new StringBuffer();        //通過迴圈構建分頁條        for(int i=1;i<=pages;i++){            if(i==currPage){   //判斷是否為當前頁                sb.append("『"+i+"』");  //構建分頁條            }else{                sb.append("<a href=‘FindServlet1?page="+i+"‘>"+i+"</a>"); //構建分頁條            }            sb.append(" ");        }        request.setAttribute("bar", sb.toString());;        request.getRequestDispatcher("product_list.jsp").forward(request, response);    }}

技巧:分頁條在JSP頁面中是動態內容,每次查看新頁面都要重新構造,所以,執行個體中將分頁的構造放置到Servlet中,以簡化JSP頁面的代碼。

在擷取查詢結果集List與分頁條後,FindServlet1分別將這兩個對象放置到request中,將請求轉寄到product_list.jsp頁面做出顯示。

(4)建立product_list.jsp頁面,該頁面通過擷取查詢結果集List與分頁條來分頁顯示商品資訊資料。關鍵代碼如下:

 

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><%@ page import="java.util.*" %><%@ page import="com.cn.gao.*" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Insert title here</title></head><body>    <table align="center" width="450" border="1">        <tr>            <td align="center" colspan="5">                <h2>所有商品資訊</h2>            </td>        </tr>        <tr align="center">            <td><b>ID</b></td>            <td><b>商品名稱</b></td>            <td><b>價格</b></td>            <td><b>數量</b></td>            <td><b>單位</b></td>        </tr>        <%            List<Product> list=(List<Product>)request.getAttribute("list");            for(Product p:list){         %>         <tr align="center">             <td><%=p.getId() %></td>             <td><%=p.getName() %></td>             <td><%=p.getPrice() %></td>             <td><%=p.getNum() %></td>             <td><%=p.getUnit() %></td>         </tr>         <%             }          %>          <tr>              <td align="center" colspan="5">                  <%=request.getAttribute("bar") %>              </td>          </tr>    </table></body></html>

(5)編寫程式中的首頁面showproduct.jsp,在該頁面中編寫分頁查詢商品資訊的超連結,指向FindServlet1。關鍵代碼如下:

<%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Insert title here</title></head><body>    <a href="FindServlet1">查看所有商品資訊</a></body></html>

 編寫完成該頁面後,部署運行項目,此時開啟showproduct.jsp頁面,其效果如所示:

JDBC在Java Web中的應用——分頁查詢

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.