最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis實(shí)現(xiàn)分頁全過程

 更新時(shí)間:2025年08月27日 08:44:49   作者:Java自學(xué)之旅  
MyBatis分頁有三種方式:手動(dòng)SQL分頁(性能高但需處理數(shù)據(jù)庫差異)、RowBounds(簡單但不推薦)、PageHelper分頁插件(自動(dòng)改寫SQL,推薦生產(chǎn)環(huán)境),PageHelper適合百萬級(jí)數(shù)據(jù)優(yōu)化,是終極解決方案

下面我將詳細(xì)講解MyBatis實(shí)現(xiàn)分頁的幾種方式,通過通俗易懂的故事和代碼示例幫助理解:

故事背景

假設(shè)我們經(jīng)營一個(gè)"圖書管理系統(tǒng)",數(shù)據(jù)庫中有10萬本圖書。

當(dāng)用戶查看圖書列表時(shí),一次性加載所有數(shù)據(jù)會(huì)導(dǎo)致系統(tǒng)崩潰(就像把整個(gè)圖書館的書都堆在收銀臺(tái)上)。

這時(shí)就需要分頁功能——每次只展示"一架子書"(如每頁20本)。

一、MyBatis實(shí)現(xiàn)分頁的三種方式

1.手動(dòng)SQL分頁(物理分頁)

SELECT * FROM books LIMIT #{start}, #{pageSize}

原理

直接在SQL中通過LIMIT(MySQL)或ROWNUM(Oracle)控制數(shù)據(jù)范圍。

代碼示例

// Mapper接口
List<Book> getBooksByPage(@Param("start") int start, @Param("pageSize") int pageSize);

// 調(diào)用方式(獲取第3頁,每頁20條)
int pageNum = 3;
int pageSize = 20;
List<Book> books = bookMapper.getBooksByPage((pageNum-1)*pageSize, pageSize);

? 優(yōu)點(diǎn)

  • 性能最佳(數(shù)據(jù)庫只返回所需數(shù)據(jù))
  • 完全掌控SQL邏輯

? 缺點(diǎn)

  • 需手動(dòng)計(jì)算偏移量(如(pageNum-1)*pageSize
  • 不同數(shù)據(jù)庫語法不同(MySQL用LIMIT,Oracle用ROWNUM)

2.RowBounds分頁(邏輯分頁)

RowBounds rowBounds = new RowBounds(40, 20); // 跳過前40條,取20條
List<Book> books = sqlSession.selectList("getAllBooks", null, rowBounds);

原理
先查詢所有數(shù)據(jù)到內(nèi)存,再在Java層截取指定范圍(像把整個(gè)圖書館的書運(yùn)到倉庫,再挑出20本)。

? 優(yōu)點(diǎn)

  • 使用簡單,無需改SQL

? 缺點(diǎn)

  • 性能災(zāi)難(數(shù)據(jù)量大時(shí)內(nèi)存溢出)
  • 實(shí)際工作中禁止使用!

3.分頁插件(推薦方案)

使用PageHelper插件(最主流方案):

// 只需在查詢前設(shè)置分頁參數(shù)
PageHelper.startPage(3, 20); // 第3頁,每頁20條
List<Book> books = bookMapper.selectAllBooks();

// 獲取分頁信息
PageInfo<Book> pageInfo = new PageInfo<>(books);
System.out.println("總頁數(shù):" + pageInfo.getPages());

原理

通過MyBatis攔截器自動(dòng)改寫SQL,添加LIMIT語句(像有個(gè)智能機(jī)器人幫你從書架上拿指定范圍的書)。

配置步驟

  1. 添加依賴:
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.2</version>
</dependency>
  1. 配置攔截器(mybatis-config.xml):
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

? 優(yōu)點(diǎn)

  • 零侵入(不改動(dòng)原SQL)
  • 自動(dòng)適配不同數(shù)據(jù)庫
  • 返回豐富分頁信息(總頁數(shù)/當(dāng)前頁等)

二、分頁原理對(duì)比表

方式性能易用性適用場景
手動(dòng)SQL分頁??????簡單SQL,明確數(shù)據(jù)庫類型
RowBounds?????禁止生產(chǎn)使用
PageHelper?????????99%的生產(chǎn)場景

三、總結(jié)

絕對(duì)避免使用RowBounds邏輯分頁(除非數(shù)據(jù)量極小)

簡單場景可用手動(dòng)SQL分頁(需處理數(shù)據(jù)庫差異)

PageHelper是終極解決方案

  • 自動(dòng)生成分頁SQL
  • 統(tǒng)一不同數(shù)據(jù)庫行為
  • 返回完整分頁元數(shù)據(jù)

百萬級(jí)數(shù)據(jù)分頁優(yōu)化:

-- 使用索引覆蓋優(yōu)化
SELECT * FROM books 
WHERE id >= (SELECT id FROM books ORDER BY id LIMIT 1000000, 1)
LIMIT 20

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring注入Map集合實(shí)現(xiàn)策略模式詳解

    Spring注入Map集合實(shí)現(xiàn)策略模式詳解

    這篇文章主要介紹了Spring注入Map集合實(shí)現(xiàn)策略模式詳解,Spring提供通過@Resource注解將相同類型的對(duì)象注入到Map集合,并將對(duì)象的名字作為key,對(duì)象作為value封裝進(jìn)入Map,需要的朋友可以參考下
    2023-11-11
  • JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn)

    JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn)

    這篇文章主要介紹了JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn),需要的朋友可以參考下
    2020-12-12
  • Java使用?Spire.PDF?for?Java輕松搞定拆分PDF

    Java使用?Spire.PDF?for?Java輕松搞定拆分PDF

    有時(shí)我們需要對(duì)大型?PDF?文檔進(jìn)行精細(xì)化管理,例如,將一個(gè)多頁的合同拆分成單頁以便逐頁審批,本文將為您介紹如何使用?Spire.PDF?for?Java?庫來輕松實(shí)現(xiàn)?PDF?拆分,感興趣的小伙伴可以了解下
    2025-12-12
  • Spring Boot優(yōu)雅地處理404異常問題

    Spring Boot優(yōu)雅地處理404異常問題

    這篇文章主要介紹了Spring Boot優(yōu)雅地處理404異常問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • IDEA中java: 找不到符號(hào) 符號(hào): 變量log

    IDEA中java: 找不到符號(hào) 符號(hào): 變量log

    這篇文章主要介紹了使用@Slf4j注解時(shí)出現(xiàn)log變量找不到符號(hào)問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • java中Calendar與Date類型互相轉(zhuǎn)換的方法

    java中Calendar與Date類型互相轉(zhuǎn)換的方法

    這篇文章主要介紹了java中Calendar與Date類型互相轉(zhuǎn)換的方法,Calendar與Date類型是我們?nèi)粘i_發(fā)中常用的兩種數(shù)據(jù)類型,它們用于不同的場景,兩者具有不同的方法,接下來通過實(shí)例給大家詳解,需要的朋友可以參考下
    2022-09-09
  • java中JDeps命令使用

    java中JDeps命令使用

    jdeps是一個(gè)Java類依賴分析工具,用于分析Java應(yīng)用程序的依賴情況,包括類、包、模塊以及JDK內(nèi)部API的使用,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • Java object類及正則表達(dá)式原理解析

    Java object類及正則表達(dá)式原理解析

    這篇文章主要介紹了Java object類及正則表達(dá)式原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解Maven環(huán)境的搭建與idea配置

    詳解Maven環(huán)境的搭建與idea配置

    本篇文章主要介紹了詳解Maven環(huán)境的搭建與idea配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • 防止SpringMVC攔截器攔截js等靜態(tài)資源文件的解決方法

    防止SpringMVC攔截器攔截js等靜態(tài)資源文件的解決方法

    本篇文章主要介紹了防止SpringMVC攔截器攔截js等靜態(tài)資源文件的解決方法,具有一定的參考價(jià)值,有興趣的同學(xué)可以了解一下
    2017-09-09

最新評(píng)論

嘉鱼县| 崇义县| 宝坻区| 巴塘县| 巢湖市| 松滋市| 邛崃市| 玉溪市| 乌拉特前旗| 望城县| 车险| 黄骅市| 滨海县| 南漳县| 民权县| 奎屯市| 申扎县| 读书| 安国市| 车险| 千阳县| 疏附县| 江陵县| 双辽市| 峨山| 涟源市| 普兰店市| 台安县| 昭平县| 阳高县| 治县。| 怀来县| 新兴县| 彩票| 平和县| 中西区| 万安县| 香格里拉县| 平陆县| 平原县| 文昌市|