PreparedStatement 實現分頁查詢詳解

PreparedStatement 實現分頁查詢詳解

在 JDBC 中使用 PreparedStatement 實現分頁查詢是高效安全的方式,可以避免 SQL 注入并提升性能。下面我將詳細說明實現步驟和原理。

📐 分頁查詢核心參數

參數名說明計算公式
pageNum當前頁碼(從1開始)用戶輸入
pageSize每頁顯示的記錄數用戶輸入或系統默認值
offset數據偏移量(跳過的記錄數)(pageNum - 1) * pageSize
limit每頁獲取的記錄數等于 pageSize

📝 分頁查詢實現步驟

1. 構建分頁SQL語句(以MySQL為例)

SELECT * FROM your_table 
ORDER BY sort_column 
LIMIT ? OFFSET ?
  • LIMIT: 指定每頁返回的記錄數
  • OFFSET: 指定跳過的記錄數
  • ORDER BY: 必須指定排序字段,確保分頁結果穩定

2. Java 實現代碼

public List<YourEntity> getPagedData(int pageNum, int pageSize) {List<YourEntity> resultList = new ArrayList<>();String sql = "SELECT id, name, email FROM users ORDER BY id LIMIT ? OFFSET ?";// 計算偏移量int offset = (pageNum - 1) * pageSize;try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {// 設置參數pstmt.setInt(1, pageSize);   // LIMIT 參數pstmt.setInt(2, offset);     // OFFSET 參數try (ResultSet rs = pstmt.executeQuery()) {while (rs.next()) {YourEntity entity = new YourEntity();entity.setId(rs.getLong("id"));entity.setName(rs.getString("name"));entity.setEmail(rs.getString("email"));resultList.add(entity);}}} catch (SQLException e) {throw new DataAccessException("分頁查詢失敗", e);}return resultList;
}

3. 不同數據庫的分頁語法差異

數據庫分頁語法示例備注
MySQLLIMIT ? OFFSET ?最常用
PostgreSQLLIMIT ? OFFSET ?同 MySQL
OracleOFFSET ? ROWS FETCH NEXT ? ROWS ONLY12c 及以上版本
SQL ServerOFFSET ? ROWS FETCH NEXT ? ROWS ONLY2012 及以上版本
SQLiteLIMIT ? OFFSET ?同 MySQL

Oracle 兼容寫法 (舊版本):

SELECT * FROM (SELECT t.*, ROWNUM rn FROM (SELECT * FROM your_table ORDER BY sort_column) t WHERE ROWNUM <= ?
) WHERE rn > ?

🔍 分頁查詢最佳實踐

1. 獲取總記錄數

public int getTotalRecords() {String countSql = "SELECT COUNT(*) FROM your_table";try (Connection conn = dataSource.getConnection();PreparedStatement pstmt = conn.prepareStatement(countSql);ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {return rs.getInt(1);}} catch (SQLException e) {// 異常處理}return 0;
}

2. 計算總頁數

int totalRecords = getTotalRecords();
int totalPages = (int) Math.ceil((double) totalRecords / pageSize);

3. 分頁參數校驗

// 確保頁碼有效
pageNum = Math.max(1, pageNum); // 限制每頁最大記錄數
pageSize = Math.min(100, Math.max(1, pageSize));

?? 分頁查詢注意事項

  1. 必須排序:分頁查詢必須指定 ORDER BY 子句,否則結果順序不確定
  2. 性能優化
    • 在排序字段上創建索引
    • 避免 SELECT *,只查詢必要字段
    • 大數據量表考慮使用基于鍵的分頁(WHERE id > ?)
  3. 連接池使用:確保使用數據庫連接池(如 HikariCP)
  4. 事務管理:在同一個事務中獲取數據和總記錄數,保證一致性
  5. 參數綁定:務必使用 PreparedStatement 防止 SQL 注入

🌟 高級分頁技術

1. 鍵集分頁(Keyset Pagination)

適用于超大數據集,性能優于傳統分頁

SELECT * FROM your_table 
WHERE id > ? 
ORDER BY id 
LIMIT ?

2. 前端分頁參數處理

// 前端請求示例
const pageRequest = {page: 2,size: 10,sort: "name,asc|email,desc"
};

3. Spring Data JPA 分頁

Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.by("name"));
Page<User> page = userRepository.findAll(pageable);List<User> users = page.getContent();
long totalItems = page.getTotalElements();
int totalPages = page.getTotalPages();

💡 總結

使用 PreparedStatement 實現分頁查詢的關鍵點:

  1. 正確計算 OFFSETLIMIT
  2. 根據數據庫類型使用正確的分頁語法
  3. 必須指定 ORDER BY 子句
  4. 結合總記錄數計算實現完整的分頁功能
  5. 使用參數綁定防止 SQL 注入
開始分頁查詢
計算偏移量 offset
構建分頁SQL
創建PreparedStatement
設置LIMIT參數
設置OFFSET參數
執行查詢
處理結果集
獲取總記錄數
計算總頁數
返回分頁結果

在實際項目中,推薦使用成熟的 ORM 框架(如 MyBatis、Hibernate)的分頁功能,它們已經處理了各種數據庫的兼容性問題,并提供了更簡潔的 API。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88434.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案 1. 概述 ClamAV 是一款開源的防病毒引擎,專為 Linux 服務器設計,用于檢測惡意軟件、病毒、木馬和其他安全威脅。它廣泛應用于郵件服務器、文件存儲系統和 Web 服務器,提供高效的病毒掃描功能。 主要特點: 免費開…

PySpark中python環境打包和JAR包依賴

在 PySpark 中打包 Python 環境并調度到集群是處理依賴一致性的關鍵步驟。以下是完整的解決方案&#xff0c;包含環境打包、分發和配置方法&#xff1a; 一、環境打包方法 使用 Conda 打包環境 # 創建 Conda 環境 conda create -n pyspark_env python3.8 conda activate pyspar…

和鯨社區深度學習基礎訓練營2025年關卡2(1)純numpy

擬分3種實現方法&#xff1a;1.純numpy2.sklearn中的MLPClassifier3.pytorch題目&#xff1a; 在 MNIST 數據集上訓練 MLP 模型并比較不同的激活函數和優化算法任務描述&#xff1a;使用 MNIST 數據集中的前 20,000 個樣本訓練一個多層感知機 (MLP) 模型。你需要比較三種不同的…

Sequential Thinking:AI深度思考的新范式及其與CoT、ReAct的對比分析

引言&#xff1a;AI深度思考的演進與Sequential Thinking的崛起在人工智能技術快速發展的今天&#xff0c;AI模型的思考能力正經歷著從簡單應答到深度推理的革命性轉變。這一演進過程不僅反映了技術本身的進步&#xff0c;更體現了人類對機器智能認知邊界的持續探索。早期的大語…

云原生詳解:構建現代化應用的未來

引言 在數字化轉型的浪潮中,"云原生"已成為技術領域最熱門的話題之一。從初創公司到全球500強企業,都在積極探索云原生技術以提升業務敏捷性和創新能力。本文將全面解析云原生的概念、核心技術、優勢以及實踐路徑,幫助您深入理解這一改變IT格局的技術范式。 什么…

SSE事件流簡單示例

文章目錄1、推送-SseEmitter2、接收-EventSourceListenerSSE&#xff08;Server-Sent Events&#xff0c;服務器推送事件&#xff09;是一種基于HTTP的服務器向客戶端實時推送數據的技術標準。1、推送-SseEmitter SseEmitter用于實現服務器向客戶端單向、長連接的實時數據推送…

Elasticsearch RESTful API入門:基礎搜索與查詢DSL

Elasticsearch RESTful API入門&#xff1a;基礎搜索與查詢DSL 本文為Elasticsearch初學者詳細解析RESTful API的核心操作與查詢DSL語法&#xff0c;包含大量實戰示例及最佳實踐。 一、Elasticsearch與RESTful API簡介 Elasticsearch&#xff08;ES&#xff09;作為分布式搜索…

(六)復習(OutBox Message)

文章目錄 項目地址一、OutBox Message1.1 OutBox表配置1. OutBoxMessage類2. OutboxMessage表配置3. 給每個模塊生成outboxmessage表1.2 發布OutBox Message1. 修改Intercepotor2. 配置Quartz3. 創建Quatz方法發布領域事件4. 創建Quatz定時任務5. 注冊Quatz服務和配置6. 流程梳…

STM32-ADC內部溫度

在通道16無引腳&#xff08;測量溫度不準確&#xff09;跟ADC代碼差不多&#xff1b;不需要使能引腳時鐘&#xff1b;將內部溫度測量打開/*** brief 啟用或禁用溫度傳感器和內部參考電壓功能* param NewState: 新的功能狀態&#xff0c;取值為ENABLE或DISABLE* retval 無* no…

「Linux命令基礎」文本模式系統關閉與重啟

關機重啟基本命令 直接拔掉計算機電源可能損壞內部元件;Linux系統通過命令關閉計算機則是安全流程,讓所有程序有機會保存數據、釋放資源。 關機命令:shutdown Linux系統提供了多種用于關閉或重啟系統的命令,其中 shutdown 是最常用的一種,它可以安全地通知用戶系統即將…

射頻信號(大寬高比)時頻圖目標檢測anchors配置

一、大寬高比目標YOLO檢測參數設置 這是yolov7的一個label的txt文件&#xff1a; 1 0.500 0.201 1.000 0.091 2 0.500 0.402 1.000 0.150 3 0.500 0.604 1.000 0.093 0 0.500 0.804 1.000 0.217 對應的樣本&#xff1a; 長寬比分別是&#xff1a;1/0.09110.98, 1/0.1506.67…

OpenStack 鑒權服務介紹.md

引言 OpenStack是一個開源的云計算管理平臺&#xff0c;其中的Keystone組件承擔了身份認證和授權的關鍵任務。Keystone的主要功能包括管理用戶及其權限、維護OpenStack Services的Endpoint&#xff0c;以及實現認證&#xff08;Authentication&#xff09;和鑒權&#xff08;Au…

Linux_3:進程間通信

IPC1.什么是IPC&#xff1f;Inter Process Communication2.進程間通信常用的幾種方式1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;無名管道2&#xff0c;信號- 系統開銷小3&#xff0c;消息隊列-內核的鏈表4&#xff0c;信號量-計數器5&#xff0c;共享內存6&#x…

【Springboot】Bean解釋

在 Spring Boot 中&#xff0c;Bean 就像是你餐廳里的一名員工。比如&#xff0c;你有一名服務員&#xff08;Service&#xff09;、一名廚師&#xff08;Chef&#xff09;和一名收銀員&#xff08;Cashier&#xff09;。這些員工都是餐廳正常運轉所必需的&#xff0c;他們各自…

axios的post請求,數據為什么要用qs處理?什么時候不用?

為什么使用 qs 處理 POST 數據axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式&#xff08;Content-Type: application/json&#xff09;。但某些后端接口&#xff08;尤其是傳統表單提交&#xff09;要求數據以 application/x-www-form-urlencoded 格式傳輸&…

【unitrix】 4.21 類型級二進制數基本結構體(types.rs)

一、源碼 這段代碼定義了一個類型級數值系統的 Rust 實現&#xff0c;主要用于在編譯時表示和操作各種數值類型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮點值枚舉 ///// 特殊浮點值&#xff08;NaN/∞&#x…

UI前端與數字孿生結合實踐案例:智慧零售的庫存管理優化系統

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;數字孿生重構零售庫存的 “人 - 貨 - 場” 協同在零售行業利潤率持續承壓的背景…

【Freertos實戰】零基礎制作基于stm32的物聯網溫濕度檢測(教程非常簡易)持續更新中.........

本次記錄采用Freertos的第二個DIY作品&#xff0c;基于Onenet的物聯網溫濕度檢測系統&#xff0c;此次代碼依然是全部開源。通過網盤分享的文件&#xff1a;物聯網溫濕度檢測.rar 鏈接: https://pan.baidu.com/s/1uj9UURVtGE6ZB6OsL2W8lw?pwdqm2e 提取碼: qm2e 大家也可以看看…

Matplotlib-多圖布局與網格顯示

Matplotlib-多圖布局與網格顯示一、多圖布局的核心組件二、基礎布局&#xff1a;plt.subplots()快速創建網格1. 均等分網格2. 不等分網格&#xff08;指定比例&#xff09;三、進階布局&#xff1a;GridSpec實現復雜嵌套1. 跨行列布局2. 嵌套GridSpec四、實用技巧&#xff1a;布…

GitHub上優秀的開源播放器項目介紹及優劣對比

ExoPlayer 項目地址:https://github.com/google/ExoPlayer 特點: 由Google開發,支持廣泛的視頻格式和流媒體傳輸協議,如DASH、HLS、SmoothStreaming。 提供靈活的媒體源架構和高級特性,如動態自適應流播放。 開發者可以輕松擴展和定制播放器組件,適應特定需求。 優點: 功…