DBAPI 實現分頁查詢的兩種方法
背景
在進行分頁查詢時,用戶通常需要傳入當前頁碼 pageNo
和每頁顯示的條數 pageSize
參數。根據這兩個參數,我們可以從數據庫中查詢出當前頁的數據。以 MySQL 為例,分頁查詢的 SQL 語句如下:
select * from t_user limit 30, 10
這里的 limit 30, 10
表示從第 31 條記錄開始,查詢 10 條記錄。
參數動態計算
在 DBAPI 中,參數注入 SQL 的寫法如下:
select * from t_user limit #{offset}, #{pageSize}
而這里的 offset
參數每次都要根據 pageNo
和 pageSize
動態計算,具體公式為 offset = (pageNo - 1) * pageSize
。
為了解決這個動態計算的需求,DBAPI 提供了兩種實現方案:第一種是使用參數處理插件,第二種是使用動態 SQL 中的 bind
標簽。
方案 1 - 參數處理插件
- 訪問插件市場,下載分頁插件,上傳到 DBAPI 的
extlib
目錄或者lib
目錄下,重啟 DBAPI 服務。
-
創建 API,添加參數
pageNo
和pageSize
。API 必須至少包含這兩個參數,且必須是bigint類型,
pageNo
表示當前第幾頁,pageSize
表示每頁顯示的條數。
-
SQL 編寫
SQL 中使用參數
offset
和pageSize
,offset
表示查詢記錄的開始位置,pageSize
表示每頁顯示的條數。select * from student limit #{offset}, #{pageSize}
-
在
全局插件-參數處理
中選擇分頁插件
。插件參數不用填寫,為非必填項。
使用此插件,系統會自動生成一個新的參數
offset
,值為(pageNo - 1) * pageSize
。 -
測試
保存 API,請求測試可以看到分頁成功。
注意此插件在個人版
4.0.16
及以上、企業版4.1.10
及以上版本支持。
方案 2 - 動態 SQL 中的 bind 標簽
-
創建 API,添加參數
pageNo
和pageSize
。API 必須至少包含這兩個參數,且必須是bigint類型,
pageNo
表示當前第幾頁,pageSize
表示每頁顯示的條數。
-
SQL 編寫
SQL 中使用參數
offset
和pageSize
,offset
表示查詢記錄的開始位置,pageSize
表示每頁顯示的條數。DBAPI 支持類似 mybatis 的動態 SQL 標簽語法,
offset
使用<bind>
標簽創建出來。<bind name="offset" value="(pageNo - 1) * pageSize" /> select * from student limit #{offset}, #{pageSize}
-
測試
保存 API,請求測試可以看到分頁成功。