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

Java MySQL 分頁查詢實戰:LIMIT 子句與 DAO 封裝完整指南

     編輯:Java 綜合教學

MySQL 分頁查詢核心語法

在 MySQL 中實現分頁功能,核心在於 LIMIT 子句。其標準語法為:

SELECT * FROM 表名 WHERE 條件 LIMIT 偏移量, 每頁行數;

其中「偏移量」計算公式為 (頁碼 - 1) * 每頁行數。例如每頁顯示 10 行,查詢第 3 頁時,偏移量為 20,即 LIMIT 20, 10。

完整 DAO 封裝實現

以下展示一個標準的 FruitDao 類,封裝了總頁數計算與分頁數據查詢兩大核心功能:

import java.util.*;
import java.sql.*;

public class FruitDao {
    private Connection conn;
    private PreparedStatement pre;
    private ResultSet rs;

    public FruitDao() throws Exception {
        conn = DBConnection.getConnection(); // 假設存在連接工具類
    }

    /** 計算總頁數 */
    public int getTotalPages(int pageSize) throws SQLException {
        int totalPages = 0;
        String sql = "SELECT COUNT(*) FROM fruit";
        pre = conn.prepareStatement(sql);
        rs = pre.executeQuery();
        if (rs.next()) {
            int totalRows = rs.getInt(1);
            totalPages = (int) Math.ceil(1.0 * totalRows / pageSize);
        }
        closeResources();
        return totalPages;
    }

    /** 查詢指定頁數據 */
    public ArrayList<Fruit> findByPage(int pageNum, int pageSize) throws Exception {
        ArrayList<Fruit> list = new ArrayList<>();
        String sql = "SELECT * FROM fruit LIMIT ?, ?";
        pre = conn.prepareStatement(sql);
        pre.setInt(1, pageSize * (pageNum - 1)); // 偏移量
        pre.setInt(2, pageSize);                 // 每頁行數
        rs = pre.executeQuery();

        while (rs.next()) {
            Fruit fruit = new Fruit();
            fruit.setIds(rs.getString(1));
            fruit.setName(rs.getString(2));
            fruit.setPrice(rs.getDouble(3));
            fruit.setSource(rs.getString(4));
            fruit.setNumbers(rs.getInt(5));
            fruit.setImage(rs.getString(6));
            list.add(fruit);
        }
        closeResources();
        return list;
    }

    private void closeResources() throws SQLException {
        if (rs != null) rs.close();
        if (pre != null) pre.close();
        if (conn != null) conn.close();
    }
}

關鍵點總結

  • 使用 PreparedStatement 防止 SQL 注入,佔位符 ? 對應偏移量與頁面大小。
  • 總頁數計算採用 Math.ceil 向上取整,確保餘數也能顯示為一頁。
  • 資源關閉放在 finally 或獨立方法中,避免連接洩漏。
  • 實際專案中建議引入連接池(如 Druid、HikariCP)替代直接創建連接。

進階優化建議

面對大數據量時,LIMIT 深分頁性能會下降。可考慮:

  1. 「游標式分頁」:記住上一頁最大 ID,改為 WHERE id > lastId LIMIT pageSize。
  2. 覆蓋索引優化:只查主鍵 ID,再回表查詳情。
  3. 引入 Elasticsearch 等搜索引擎處理複雜查詢與分頁。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved