首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP + JDBC 實現資料庫分頁顯示 (Oracle 範例、可捲動結果集)

     編輯:關於JSP

核心邏輯

  1. 取得頁碼參數 (page),預設第 1 頁
  2. 建立可捲動、唯讀 ResultSet (TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY)
  3. 執行查詢,rs.last() 移至末尾取得總筆數 getRow()
  4. 計算總頁數:(total + pageSize - 1) / pageSize
  5. rs.absolute((page-1)*pageSize + 1) 定位到當頁首筆
  6. 迴圈 pageSize 次 rs.next() 輸出資料
  7. 產生「上一頁/下一頁」連結

完整 JSP 範例 (jdbc20-oracle.jsp)

<%@ page import="java.sql.*" contentType="text/html; charset=UTF-8" %>
<%
    // 1. 參數處理
    int pageSize = 2;
    String pageParam = request.getParameter("page");
    int page = (pageParam == null) ? 1 : Math.max(1, Integer.parseInt(pageParam));

    // 2. 資料庫連線 (生產環境請用連線池)
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    Connection conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@linux:1521:ora4cweb", "hzq", "hzq");
    Statement stmt = conn.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
    ResultSet rs = stmt.executeQuery("SELECT name, age FROM test");

    // 3. 總筆數與總頁數
    rs.last();
    int total = rs.getRow();
    int totalPages = (total + pageSize - 1) / pageSize;
    if (page > totalPages) page = totalPages;

    // 4. 定位到當頁起始列
    rs.absolute((page - 1) * pageSize + 1);
%>
<html><body>
<table border="1" cellpadding="5">
<tr><th>姓名</th><th>年齡</th></tr>
<%
    int count = 0;
    while (count < pageSize && !rs.isAfterLast()) {
%>
    <tr><td><%=rs.getString(1)%></td><td><%=rs.getString(2)%></td></tr>
<%
        rs.next();
        count++;
    }
%>
</table>
第 <%=page%> 頁 / 共 <%=totalPages%> 頁
<% if (page < totalPages) { %> <a href="?page=<%=page+1%>">下一頁</a> <% } %>
<% if (page > 1) { %> <a href="?page=<%=page-1%>">上一頁</a> <% } %>
</body></html>
<%
    rs.close(); stmt.close(); conn.close();
%>

關鍵技術點解析

技術說明注意事項
TYPE_SCROLL_INSENSITIVE可捲動、不反映他人提交的更新Oracle 驅動需支援;MySQL/PostgreSQL 同樣支援
CONCUR_READ_ONLY唯讀結果集,效能較好不可更新
rs.last() / getRow()取得總筆數需將游標移至末尾,大結果集可能較慢
rs.absolute(n)直接跳至第 n 列 (1-based)高效隨機存取,避免迴圈 next()
rs.isAfterLast()判斷是否超過最後一列配合計數器控制輸出筆數

效能優化與生產級建議

  1. 避免 SELECT * 再 last():大表先 SELECT COUNT(*) 取總數,再 LIMIT/OFFSET 或 ROWNUM 分頁查詢,減少網路傳輸與記憶體佔用。
  2. Oracle 12c+ 原生分頁:
    SELECT * FROM test ORDER BY id
    OFFSET :offset ROWS FETCH NEXT :pageSize ROWS ONLY;
  3. MySQL/PostgreSQL:LIMIT :pageSize OFFSET :offset。
  4. 連線池:HikariCP / Druid 替代 DriverManager。
  5. 關閉資源:使用 try-with-resources (JDBC 4.1+ AutoCloseable) 確保連線歸還。
  6. 分頁導航優化:大頁數時僅顯示首頁、末頁、當前頁前後各 2 頁、省略號,避免連結過多。

現代架構分層實現

// Controller (Spring MVC)
@GetMapping("/users")
public String list(@RequestParam(defaultValue="1") int page,
                   @RequestParam(defaultValue="10") int size, Model model) {
    Page p = userService.findPage(page, size); // Service 呼叫 Repository 分頁查詢
    model.addAttribute("page", p);
    return "user/list"; // Thymeleaf/JSP 渲染
}

結語

可捲動結果集 (TYPE_SCROLL_INSENSITIVE) 實現分頁是 JDBC 2.0 經典技巧,適合中小資料量、快速原型。大規模系統請改用 資料庫原生分頁語法 (OFFSET/FETCH, LIMIT) 搭配 連線池、Service/Repository 分層、前端模板引擎,實現高效能、可維護的分頁功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved