使用偏移量的方式進行分頁查詢

来源:https://www.cnblogs.com/MorningBell/archive/2022/10/18/16803938.html
-Advertisement-
Play Games

使用這種分頁方式,好像是比jpa或者MyBatis自帶的分頁工具有更好的性能和安全性。 需要接收的參數 public ApiResponse getBlackList( @RequestParam(name = "pageSize", required = false) Integer pageSi ...


使用這種分頁方式,好像是比jpa或者MyBatis自帶的分頁工具有更好的性能和安全性。

需要接收的參數

public ApiResponse getBlackList(
           @RequestParam(name = "pageSize", required = false) Integer pageSize,
           @RequestParam(name = "cursor", required = false) String cursor) {
  //pageSize 頁面容量
  /*cursor 即偏移量,使用數據id或者某個專門用來分頁的欄位,比如上次查詢了id為5-10的數據,下一頁數據cursor的值應為10,service層的代碼查詢id >= cursor+1的數據,查詢的數量為pageSize個,如果沒有攜帶cursor,按照查詢第一頁處理*/
}

service

// 註:查詢的時候傳pageSize + 1是為了獲取下一頁第一條數據的id,返回給前端作為下一頁的cursor傳過來
List<pojo> result = new ArrayList();
if(StringUtils.isBlank(cursor)) {
  //查詢首頁
  result = repository.findFirstPage(pageSize + 1);
}else {
  Long longCursor = null;
  try {
    //解密cursor
    byte[] decode = Base64.getUrlDecoder().decode(cursor);
    //轉成Long類型
    longCursor = new Long(new String(decode));
  } catch (IllegalArgumentException e) {
    log.warn("parameter [{}] type exception", cursor);
    throw new IllegalArgumentException("Unexpeted value: cursor [" + cursor + "]");
  }
  //查詢
  result = repository.findPage(pageSize + 1, longCursor);
if (result.size() > pageSize) {
    // 刪除最後一條數據,因為那是下一頁的第一條
    Pojo pojo= result.get(result.size() - 1);
    result.remove(pojo);
    //獲取下一頁第一條id
    Long id = pojo.getId();
    //加密該id返回給前端,用作下一頁的查詢
    String newCursor = Base64.getUrlEncoder().encodeToString(String.valueOf(id).getBytes());

    resultMap.put("cursor", newCursor);
  }
}

repository

/*查找首頁*/
select * from table where '查詢條件' order by model.id limit :pageSize

/*分頁查詢*/
select * from table where '查詢條件' model.id>=:cursor order by model.id limit :pageSize

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Minifilter 是一種文件過濾驅動,該驅動簡稱為微過濾驅動,相對於傳統的`sfilter`文件過濾驅動來說,微過濾驅動編寫時更簡單,其不需要考慮底層RIP如何派發且無需要考慮相容性問題,微過濾驅動使用過濾管理器`FilterManager`提供介面,由於提供了管理結構以及一系列管理API函數,... ...
  • Spring與Dubbo整合原理與源碼分析 【1】註解@EnableDubbo @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @EnableDubboConfig // @ ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 為瞭解決標準Java I/O令人難以忍受的效率問題,從JDK1.4開始,NIO出現了(Non-blocking I/O,官方稱之為New I/O)。NIO不但新增加了許多全新的類,而且還對原來的很多類進行了改寫。之所以是NIO,是因為使用它的場 ...
  • 1.題目 給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。 子數組 是數組中的一個連續部分。 示例 1: 輸入:nums = [-2,1,-3,4,-1,2,1,-5,4] 輸出:6 解釋:連續子數組 [4,-1,2,1] 的和最大,為 6 ...
  • mybatis-plugin插件執行原理 今天主要是在看mybatis的主流程源碼,其中比較感興趣的是mybatis的plugin功能,這裡主要記錄下mybatis-plugin的插件功能原理。 plugin集合列表:在構建SqlSessionFactory時,通過解析配置或者plugin-bean ...
  • 什麼是集合? 集合就是由若幹個確定的元素所構成的整體。例如,5只小兔構成的集合: 在數學中,我們經常遇到集合的概念。例如: ● 有限集合 ○ 一個班所有的同學構成的集合; ○ 一個網站所有的商品構成的集合; ● 無限集合 ○ 整數集合 ○ 有理數集合 ○ 實數集合 為什麼要在電腦中引入集合呢? 這 ...
  • 平常我們爬的評論、彈幕等等,數量又多又密,根本看不過來,這時候數據分析的作用來了,今天我們就試試用Python根據這些數據,來繪製詞雲圖進行熱詞分析。 知識點 文件讀寫 基礎語法 字元串處理 文件生成 數據構建 代碼展示 # 導入系統包 import platform from flask impo ...
  • 1、print() print()函數的作用是輸出數據到控制台,就是列印在你能看到的界面上。 2、return return語句[表達式]退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。 return作為腳本單獨運行時則需要print函數才能顯示,但是在交互模式下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...