Mybatis-plus之RowBounds實現分頁查詢

物理分頁和邏輯分頁

物理分頁:直接從數據庫中拿出我們需要的數據,例如在Mysql中使用limit。

邏輯分頁:從數據庫中拿出所有符合要求的數據,然后再從這些數據中拿到我們需要的分頁數據。

優缺點

物理分頁每次都要訪問數據庫,邏輯分頁只訪問一次。

物理分頁占用內存少,邏輯分頁相對較多。

物理分頁數據每次都是最新的,邏輯分頁有可能滯后。

一般用法

1 public List<Order> queryListByPage(RowBounds rowBounds);
1 dao.queryListPage(new RowBounds(offset,limit));

RowBounds對象有2個屬性,offset和limit。

offset:起始行數

limit:需要的數據行數

因此,取出來的數據就是:從第offset+1行開始,取limit行

Mybatis中使用RowBounds實現分頁的大體思路:

先取出所有數據,然后游標移動到offset位置,循環取limit條數據,然后把剩下的數據舍棄。

 1 private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler<?> resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException {
 2     DefaultResultContext<Object> resultContext = new DefaultResultContext();
 3     this.skipRows(rsw.getResultSet(), rowBounds);  //游標跳到offset位置
 4     //取出limit條數據
 5     while(this.shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) {
 6         ResultMap discriminatedResultMap = this.resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, (String)null);
 7         Object rowValue = this.getRowValue(rsw, discriminatedResultMap);
 8         this.storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
 9     }
10 
11 }
 1 private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
 2     if (rs.getType() != 1003) {
 3         if (rowBounds.getOffset() != 0) {
 4             rs.absolute(rowBounds.getOffset());
 5         }
 6     } else {     //從頭開始移動游標,直至offset位置
 7         for(int i = 0; i < rowBounds.getOffset(); ++i) {
 8             rs.next();
 9         }
10     }
11 
12 }

在Mybatis-Plus中的應用

Controller層

 1 @RequestMapping(value = "list", method = { RequestMethod.GET, RequestMethod.POST })
 2 @PageableDefaults(sort = "createDate=desc")
 3 private void getList(Queryable queryable,String queryStr, PropertyPreFilterable propertyPreFilterable, HttpServletRequest request,
 4                       HttpServletResponse response) throws IOException {
 5     //前端傳過來需要的參數,加上id,fastjson會在得到結果集時過濾數據
 6     propertyPreFilterable.addQueryProperty("id");
 7     QueryableConvertUtils.convertQueryValueToEntityValue(queryable, entityClass);
 8     SerializeFilter filter = propertyPreFilterable.constructFilter(entityClass);
 9     //調用service層的分頁查詢
10     PageJson<OprPrintOrder> pagejson = new PageJson<OprPrintOrder>(service.list(queryable));
11     //得到需要的結果集后的數據過濾操作
12     String content = JSON.toJSONString(pagejson, filter);
13     JSONObject result = JSONObject.parseObject(content);
14     StringUtils.printJson(response, result.toString());
15 }

Service層

 1 @Override
 2 public Page<Order> list(Queryable queryable) {
 3     //pageable中有數據查詢的要求
 4     Pageable pageable = queryable.getPageable();
 5     //封裝新的分頁查詢類
 6     com.baomidou.mybatisplus.plugins.Page<Order> page = new com.baomidou.mybatisplus.plugins.Page<Order>(pageable.getPageNumber(), pageable.getPageSize());
 7     //傳入RowBounds,page就是RowBounds的子類,這樣查詢后page就有了總頁數與總條數
 8     page.setRecords(mapper.selectList(page));
 9     return new PageImpl<Order>(page.getRecords(), pageable, page.getTotal());
10 }

Mapper層

1 List<Order> selectList(RowBounds rowBounds);
1 <select id="selectList" resultType="Order">
2   select * from order
3 </select>

轉載于:https://www.cnblogs.com/guanghe/p/10026099.html

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

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

相關文章

常見的6種JavaScript設計模式

常見的6種JavaScript設計模式 構造函數模式 /*** 構造一個動物的函數 */ function Animal(name, color){this.name name;this.color color;this.getName function(){return this.name;} } // 實例一個對象 var cat new Animal(貓, 白色); console.log( cat.getName() );工…

峰度(Kurtosis)和偏度(Skewness)

峰度&#xff08;Kurtosis&#xff09; 定義峰度又稱峰態系數&#xff0c;表征概率密度分布曲線在平均值處峰值高低的特征數&#xff0c;即是描述總體中所有取值分布形態陡緩程度的統計量。直觀看來&#xff0c;峰度反映了峰部的尖度。這個統計量需要與正態分布相比較。 公式定…

1.27

測試程序提出問題并解決轉載于:https://www.cnblogs.com/JustinTimberlake/p/10028870.html

javascript設計模式系列 - LukeLin - 博客園

javascript設計模式系列 創建型&#xff1a; 1.抽象工廠模式&#xff08;Abstract Factory&#xff09; 2.構建者模式&#xff08;Builder&#xff09; 3.工廠方法模式&#xff08;Factory Method&#xff09; 4.原型模式&#xff08;Prototype&#xff09; 5.單例模式&a…

多功能嵌入式解碼軟件(2)

多功能嵌入式解碼軟件&#xff08;2&#xff09; 驗證類庫 通信協議 下面進行一個示例&#xff1a; 下位機需要向上位機發送3中數據幀&#xff0c;數據幀以功能碼來識別&#xff0c;每種數據幀的協議如下3個表格所示&#xff0c;上位機需要把這些數據按照協議解碼出來&#xff…

vue項目如何打包扔向服務器 - Hi-Sen - 博客園

當我們將 vue 項目完成后&#xff0c;面臨的就是如何將項目進行打包上線&#xff0c;放到服務器中。我使用的是 vue-cli&#xff08;simple&#xff09; 腳手架&#xff0c;所以就講一下如何將項目進行打包&#xff0c;并放到 tomcat 上。 如果是 vue-cli (非 simple 腳手架…

MySQL備份與恢復-mysqldump備份與恢復

這片博文主要用來介紹MySQL的備份與恢復&#xff1a; MySQL的備份形式可以分為如下幾種&#xff1a; 熱備----即不停機備份冷備----需要關閉MySQL&#xff0c;然后備份其數據文件。&#xff08;停機備份一般是直接拷貝其datadir目錄&#xff09;溫備----在線備份&#xff0c;對…

第六次實訓作業異常處理

第六次實訓作業異常處理 編寫一個類ExceptionTest&#xff0c;在main方法中使用try-catch-finally語句結構實現&#xff1a;在try語句塊中&#xff0c;編寫兩個數相除操作&#xff0c;相除的兩個操作數要求程序運行時用戶輸入&#xff1b;在catch語句塊中&#xff0c;捕獲被0除…

k8s學習筆記-調度之Affinity

Kubernetes中的調度策略可以大致分為兩種 一種是全局的調度策略&#xff0c;要在啟動調度器時配置&#xff0c;包括kubernetes調度器自帶的各種predicates和priorities算法&#xff0c;具體可以參看上一篇文章&#xff1b; 另一種是運行時調度策略&#xff0c;包括nodeAffinity…

vue-cli webpack配置分析 - chenBright - SegmentFault 思否

相信vue使用者對vue-cli都不會陌生&#xff0c;甚至可以說&#xff0c;很熟悉了&#xff0c;但對其webpack的配置可能知之甚少吧。 過完年回來后&#xff0c;我接手了公司的新項目。新項目是一個spa。很自然&#xff0c;我就想到了vue-cli腳手架了&#xff0c;當時研究一下它的…

[Xcode 實際操作]六、媒體與動畫-(6)使用UIBlurEffect給圖片添加模糊效果

目錄&#xff1a;[Swift]Xcode實際操作 本文將演示如何給圖像添加模糊效果。 在項目導航區&#xff0c;打開視圖控制器的代碼文件【ViewController.swift】 1 import UIKit2 3 class ViewController: UIViewController {4 5 override func viewDidLoad() {6 super.…

MapReduce編程實踐

一、MapReduce編程思想 學些MapRedcue主要是學習它的編程思想&#xff0c;在MR的編程模型中&#xff0c;主要思想是把對數據的運算流程分成map和reduce兩個階段&#xff1a; Map階段&#xff1a;讀取原始數據&#xff0c;形成key-value數據&#xff08;map方法&#xff09;。即…

webpack基礎+webpack配置文件常用配置項介紹+webpack-dev-server - QxQstar - 博客園

一.webpack基礎 1.在項目中生成package.json&#xff1a;在項目根目錄中輸入npm init&#xff0c;根據提示輸入相應信息。&#xff08;也可以不生成package.json文件&#xff0c;但是package.json是很有用的&#xff0c;所有建議生成&#xff09; 2.安裝webpaack a.在全局中安裝…

(十)

空轉載于:https://www.cnblogs.com/shanae/p/10034479.html

編譯原理--NFA/DFA

現成的, 講義: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241031.html 一個例子, 寫得非常好. 一下子就全明白了, 尤其是像我這種沒有聽過編譯原理課程的人. https://blog.csdn.net/tyler_download/article/details/53139240 …

Python中pass的用法

空語句 do nothing保證格式完整保證語義完整以if語句為例&#xff0c;在c或c/java中&#xff1a; if(true); //do nothingelse{ //do something}對應于python就要這樣寫&#xff1a; if true: pass #do nothingelse: #do something 1 pass語句在函數中的作用當你在編寫一個程序…

express路由管理的幾種自動化方法分享-js教程-PHP中文網

我們平時在使用express寫代碼的過程中&#xff0c;會根據類別&#xff0c;將路由分為多個不同的文件&#xff0c;然后在項目的入口文件&#xff08;例如app.js&#xff09;中將其依次掛載&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 const index require(./routes/index) con…

dotnet不是內部或外部的命令,也不是可運行的程序或批處理文件

>>這臺電腦>>屬性>>高級系統設置>>環境變量>>系統變量>>Path>>編輯>> 變量值中添加 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem; 即可。轉載于:https://www.cnblogs.com/ZCrystal/p/10894591.html

轉載 vue的基礎使用

轉載https://www.cnblogs.com/majj/p/9957597.html#top vue的介紹 前端框架和庫的區別nodejs的簡單使用vue的起步指令系統組件的使用過濾器的使用watch和computed鉤子函數漸進式的JavaScript框架 vue react angualr作者:尤雨溪 facebook 谷歌公…

Express實現路由分發控制、RESTful API

Express實現路由分發控制、RESTful API 標簽&#xff08;空格分隔&#xff09;&#xff1a; Node.js 最近在用Express作為自己的WEB應用框架&#xff0c;其中最為迷惑的就是Express的路由控制和分發&#xff0c;在網上搜了很多資料&#xff0c;但是大部分的資料都是將Express的…