在 MySQL 中實現分頁功能,核心在於 LIMIT 子句。其標準語法為:
SELECT * FROM 表名 WHERE 條件 LIMIT 偏移量, 每頁行數;
其中「偏移量」計算公式為 (頁碼 - 1) * 每頁行數。例如每頁顯示 10 行,查詢第 3 頁時,偏移量為 20,即 LIMIT 20, 10。
以下展示一個標準的 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 或獨立方法中,避免連接洩漏。面對大數據量時,LIMIT 深分頁性能會下降。可考慮:
WHERE id > lastId LIMIT pageSize。