SELECT * FROM table_name WHERE condition LIMIT offset, pageSize;
-- offset = (pageNumber - 1) * pageSize
-- pageNumber: 第幾頁(從 1 開始)
-- pageSize: 每頁條數
public class FruitDao {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
public FruitDao() throws Exception {
conn = DBConnection.getConnection(); // 單例連接池獲取
}
// 獲取總頁數
public int getTotalPages(int pageSize) throws SQLException {
String sql = "SELECT COUNT(*) FROM fruit";
try (PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
int totalRows = rs.getInt(1);
return (int) Math.ceil((double) totalRows / pageSize);
}
}
return 0;
}
// 查詢指定頁數據
public List<Fruit> findByPage(int pageNumber, int pageSize) throws Exception {
List<Fruit> list = new ArrayList<>();
String sql = "SELECT * FROM fruit LIMIT ?, ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, (pageNumber - 1) * pageSize); // offset
ps.setInt(2, pageSize); // pageSize
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
Fruit f = new Fruit();
f.setIds(rs.getString(1));
f.setName(rs.getString(2));
f.setPrice(rs.getDouble(3));
f.setSource(rs.getString(4));
f.setNumbers(rs.getInt(5));
f.setImage(rs.getString(6));
list.add(f);
}
}
}
return list;
}
// 關閉連接(若非連接池管理)
public void close() throws SQLException {
if (conn != null) conn.close();
}
}
LIMIT 1000000, 10 需掃描 100 萬行。優化方案:
WHERE id > lastMaxId LIMIT 10(需 ID 遞增且無刪除)。SELECT id FROM t LIMIT offset, size,再 IN 查詳細字段。COUNT(*) 慢,可用緩存、近似值或觸發器維護計數表。public PageResult<Fruit> queryFruits(int pageNum, int pageSize) {
FruitDao dao = new FruitDao();
int totalPages = dao.getTotalPages(pageSize);
List<Fruit> data = dao.findByPage(pageNum, pageSize);
return new PageResult<>(pageNum, pageSize, totalPages, data);
}
MySQL LIMIT 實現分頁簡單高效,配合 PreparedStatement 與連接池即可滿足中小數據量場景。百萬級以上需採用「游標分頁」或「延遲關聯」優化深分頁性能。