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

JDBC 使用可滾動游標實現分頁查詢兩種方案

     編輯:Java 相關知識

場景

在不支持 LIMIT/OFFSET 的數據庫(如早期 Oracle、SQL Server)中,可利用 JDBC ResultSet.TYPE_SCROLL_INSENSITIVE 游標實現分頁。

方案一:設置 maxRows 限制讀取範圍

public void getData(String sql, int startNo, int maxCount) {
    try (Connection conn = ConnectionUtil.getConnection();
         PreparedStatement ps = conn.prepareStatement(sql,
                 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)) {

        ps.setMaxRows(startNo + maxCount - 1); // 只讀取到目標頁末尾
        ResultSet rs = ps.executeQuery();
        rs.first();                     // 移至第一行
        rs.relative(startNo - 2);       // 移至目標頁第一行(相對移動)

        while (rs.next()) {
            System.out.println(rs.getInt(1));
        }
    } catch (SQLException e) { e.printStackTrace(); }
}

原理:setMaxRows 限制數據庫返回行數,游標再定位到起始行。

方案二:查詢全量後游標定位

public void getDataFromAll(String sql, int startNo, int maxCount) {
    try (Connection conn = ConnectionUtil.getConnection();
         PreparedStatement ps = conn.prepareStatement(sql,
                 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)) {

        ResultSet rs = ps.executeQuery();
        rs.first();
        rs.relative(startNo - 1); // 移至起始行

        int i = startNo - 1;
        while (i < startNo + maxCount - 1 && !rs.isAfterLast()) {
            System.out.println(rs.getInt(1));
            i++;
            rs.next();
        }
    } catch (SQLException e) { e.printStackTrace(); }
}

原理:一次性查所有數據,在客戶端游標中跳過前面行。

關鍵點對比

維度方案一方案二
網絡傳輸量少(受 maxRows 限制)大(全量傳輸)
數據庫負載低高
適用數據量大表小表
游標類型要求TYPE_SCROLL_INSENSITIVETYPE_SCROLL_INSENSITIVE

注意事項

  • MySQL、PostgreSQL 等現代數據庫優先使用 LIMIT offset, size,性能更優。
  • 游標為 INSENSITIVE 類型,不感知他人提交的修改,適合只讀分頁。
  • 務必關閉 ResultSet、Statement、Connection(建議用 try-with-resources)。

總結

可滾動游標是早期分頁常用技巧,理解其原理有助於維護舊系統;新項目請優先使用數據庫原生分頁語法。

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