欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis分頁的四種方式

 更新時間:2024年08月04日 09:55:43   作者:Itmastergo  
分頁查詢是非常常見的需求,本文主要介紹了MyBatis分頁的四種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

MyBatis 是一個優(yōu)秀的持久層框架,它為開發(fā)人員提供了一種通過簡單的 XML 或注解方式來操作數(shù)據(jù)庫的工具。在日常開發(fā)中,分頁查詢是非常常見的需求。MyBatis 提供了多種實現(xiàn)分頁的方法,主要包括以下三種:

  • 物理分頁(Physical Pagination)
  • 邏輯分頁(Logical Pagination)
  • 使用插件分頁(Pagination with Plugins)

下面將詳細講解這三種分頁方式的原理、實現(xiàn)步驟和各自的優(yōu)缺點。

1、物理分頁(Physical Pagination)

物理分頁是指在 SQL 查詢中直接使用數(shù)據(jù)庫的分頁語法,例如 LIMIT 和 OFFSET,通過 SQL 語句控制返回的數(shù)據(jù)范圍。物理分頁直接由數(shù)據(jù)庫執(zhí)行分頁操作,性能相對較好。

1.1、原理

物理分頁通過在 SQL 查詢中加入分頁條件,利用數(shù)據(jù)庫的分頁功能進行數(shù)據(jù)截取,返回所需的數(shù)據(jù)集。例如在 MySQL 中使用 LIMIT 和 OFFSET 實現(xiàn)分頁。

1.2、實現(xiàn)步驟

1.2.1、在 XML 映射文件中配置分頁 SQL

<select id="selectUsers" parameterType="map" resultType="User">
    SELECT * FROM users
    ORDER BY id
    LIMIT #{offset}, #{limit}
</select>

1.2.2、在 Java 代碼中調用分頁查詢

Map<String, Object> params = new HashMap<>();
int page = 1;  // 頁碼
int pageSize = 10;  // 每頁顯示條數(shù)
int offset = (page - 1) * pageSize;

params.put("offset", offset);
params.put("limit", pageSize);

List<User> users = session.selectList("selectUsers", params);

1.3、優(yōu)點

  • 性能高:分頁操作在數(shù)據(jù)庫端完成,減少了網(wǎng)絡傳輸?shù)臄?shù)據(jù)量。
  • 簡單直接:實現(xiàn)方式簡單,直接在 SQL 中添加分頁參數(shù)。

1.4、缺點

  • 數(shù)據(jù)庫依賴:分頁語法依賴于具體的數(shù)據(jù)庫實現(xiàn),不同數(shù)據(jù)庫的分頁語法不同。
  • 代碼重復:每個分頁查詢都需要重復編寫分頁 SQL。

2、邏輯分頁(Logical Pagination)

邏輯分頁是指在內存中進行分頁操作,先查詢出所有數(shù)據(jù),然后在應用層進行分頁。邏輯分頁適用于數(shù)據(jù)量較小的情況,數(shù)據(jù)量較大時不推薦使用。

2.1、原理

邏輯分頁通過在應用層對查詢結果進行截取,返回所需的分頁數(shù)據(jù)。先執(zhí)行不帶分頁條件的查詢,獲取所有數(shù)據(jù)后,再根據(jù)分頁參數(shù)截取子集。

2.2、實現(xiàn)步驟

2.2.1、在 XML 映射文件中配置查詢 SQL

<select id="selectAllUsers" resultType="User">
    SELECT * FROM users
</select>

2.2.2、在 Java 代碼中進行邏輯分頁

List<User> allUsers = session.selectList("selectAllUsers");

int page = 1;  // 頁碼
int pageSize = 10;  // 每頁顯示條數(shù)
int start = (page - 1) * pageSize;
int end = Math.min(start + pageSize, allUsers.size());

List<User> usersPage = allUsers.subList(start, end);

2.3、優(yōu)點

  • 數(shù)據(jù)庫無關:不依賴于具體的數(shù)據(jù)庫分頁語法,具有良好的兼容性。
  • 簡單實現(xiàn):無需修改 SQL 語句,分頁邏輯在應用層實現(xiàn)。

2.4、缺點

  • 性能低:需要一次性查詢出所有數(shù)據(jù),當數(shù)據(jù)量大時會占用大量內存,查詢性能較差。
  • 適用范圍有限:僅適用于數(shù)據(jù)量較小的場景。

3、使用插件分頁(Pagination with Plugins)

MyBatis 支持通過插件機制實現(xiàn)分頁,這種方式在性能和使用方便性上具有很大優(yōu)勢。常用的分頁插件有 PageHelper 和 MyBatis-Plus 提供的分頁插件。

3.1、原理

分頁插件通過攔截 MyBatis 執(zhí)行的 SQL 語句,在執(zhí)行查詢前自動添加分頁參數(shù),從而實現(xiàn)透明的分頁功能。開發(fā)者只需配置插件并調用分頁方法,無需手動編寫分頁 SQL。

3.2、實現(xiàn)步驟(以 PageHelper 為例)

3.2.1、引入 PageHelper 依賴

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.2.0</version>
</dependency>

3.2.2、配置 PageHelper 插件

@Configuration
public class MyBatisConfig {
    @Bean
    public PageInterceptor pageInterceptor() {
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        properties.setProperty("reasonable", "true");
        pageInterceptor.setProperties(properties);
        return pageInterceptor;
    }
}

3.2.3、在 Java 代碼中使用分頁插件

PageHelper.startPage(1, 10);
List<User> users = session.selectList("selectUsers");
PageInfo<User> pageInfo = new PageInfo<>(users);

3.3、優(yōu)點

  • 高性能:分頁操作在數(shù)據(jù)庫端完成,減少網(wǎng)絡傳輸?shù)臄?shù)據(jù)量,性能優(yōu)于邏輯分頁。
  • 使用方便:開發(fā)者無需編寫分頁 SQL,只需調用插件提供的方法即可實現(xiàn)分頁功能。
  • 功能豐富:插件通常提供了豐富的分頁功能,如自動計算總記錄數(shù)、分頁導航等。

3.4、缺點

  • 依賴第三方庫:需要引入額外的依賴,并進行相應的配置。
  • 學習成本:需要學習和理解插件的使用方法和配置方式。

MyBatis 提供的三種分頁方式各有優(yōu)缺點,開發(fā)者應根據(jù)具體的業(yè)務需求和場景選擇合適的分頁方式:

  • 物理分頁:適用于數(shù)據(jù)量較大、對性能要求較高的場景,分頁操作在數(shù)據(jù)庫端完成。
  • 邏輯分頁:適用于數(shù)據(jù)量較小、不依賴數(shù)據(jù)庫分頁語法的場景,分頁操作在應用層完成。
  • 使用插件分頁:通過插件實現(xiàn)透明分頁,適用于大多數(shù)場景,兼具高性能和易用性。

在實際開發(fā)中,建議優(yōu)先考慮使用分頁插件,因為這種方式既保證了高性能,又簡化了開發(fā)過程。同時,分頁插件通常提供了更多的功能和更好的擴展性,能夠滿足復雜的分頁需求。無論選擇哪種分頁方式,都需要綜合考慮系統(tǒng)的性能、易用性和維護成本,做出最適合業(yè)務需求的決策。

4、RowBounds實現(xiàn)分頁

RowBounds原理

  • Mybatis可以通過傳遞RowBounds對象,來進行數(shù)據(jù)庫數(shù)據(jù)的分頁操作,然而遺憾的是,該分頁操作是對ResultSet結果集進行分頁,也就是人們常說的邏輯分頁,而非物理分頁(物理分頁當然就是我們在sql語句中指定limit和offset值)。
  • 不再使用SQL實現(xiàn)分頁

RowBounds使用

1、接口

List<Map> getUserByRowBounds(Map<String,Integer> map);

2、mapper.xml

 <!--分頁-->
    <select id="getUserByRowBounds" parameterType="map"  resultType="map" >
        select *
        from mybatis01.user ;
    </select>

3、測試

 @Test
    public void getUserByRowBounds(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //RowBounds實現(xiàn)
        RowBounds rowBounds = new RowBounds(1,2);

        //通過java代碼層面實現(xiàn)分頁
        List<Map> userList = sqlSession.selectList("com.jin.mapper.UserMapper.getUserByRowBounds", null, rowBounds);
        for (Map map1 : userList) {
            System.out.println(map1);
        }


        sqlSession.close();
    }

RowBounds大坑

RowBounds是將所有符合條件的數(shù)據(jù)全都查詢到內存中,然后在內存中對數(shù)據(jù)進行分頁如我們查詢user表中id>0的數(shù)據(jù),然后分頁查詢sql如下:

select * from user where id >0 limit 3,10

但使用RowBounds后,會將id>0的所有數(shù)據(jù)都加載到內存中,然后跳過offset=3條數(shù)據(jù),截取10條數(shù)據(jù)出來,若id>0的數(shù)據(jù)有100萬,則100w數(shù)據(jù)都會被加載到內存中,從而造成內存OOM。

所以當數(shù)據(jù)量非常大時,一定要慎用RowBounds類。切記!切記!

到此這篇關于MyBatis分頁的四種方式的文章就介紹到這了,更多相關MyBatis分頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 同步器SynchronousQueue詳解及實例

    java 同步器SynchronousQueue詳解及實例

    這篇文章主要介紹了java 同步器SynchronousQueue詳解及實例的相關資料,需要的朋友可以參考下
    2017-05-05
  • Spring中HandlerAdapter接口源碼解析

    Spring中HandlerAdapter接口源碼解析

    這篇文章主要介紹了Spring中HandlerAdapter接口源碼解析,HandlerAdapter是一個適配器接口類,適配器模式是指兩個不兼容接口之間的橋梁,要想讓一個接口使用另外一個接口的實現(xiàn)中間可以加一層適配器類,需要的朋友可以參考下
    2023-11-11
  • Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別

    Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別

    這篇文章主要介紹了Java中l(wèi)ock和tryLock及l(fā)ockInterruptibly的區(qū)別,文章介紹詳細,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Java實現(xiàn)快速排序過程分析

    Java實現(xiàn)快速排序過程分析

    今天小編就為大家分享一篇關于Java實現(xiàn)快速排序過程分析,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Java實現(xiàn)的貸款金額計算功能示例

    Java實現(xiàn)的貸款金額計算功能示例

    這篇文章主要介紹了Java實現(xiàn)的貸款金額計算功能,結合實例形式分析了Java簡單數(shù)值運算及類型轉換等相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java對象轉json JsonFormat注解

    Java對象轉json JsonFormat注解

    這篇文章主要介紹了Java對象轉json JsonFormat注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Spring?boot異步任務原理全面分析

    Spring?boot異步任務原理全面分析

    這篇文章主要介紹了Spring?boot異步任務原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • idea全局搜索快捷鍵超詳細總結(推薦!)

    idea全局搜索快捷鍵超詳細總結(推薦!)

    在實際開發(fā)中項目會非常多,如何在項目中快速定位,你說需要找到的類或方法,可以利用idea的全局搜索功能,下面這篇文章主要給大家分享介紹了關于idea全局搜索快捷鍵超詳細總結的相關資料,需要的朋友可以參考下
    2023-01-01
  • MyBatis動態(tài)Sql之if標簽的用法詳解

    MyBatis動態(tài)Sql之if標簽的用法詳解

    這篇文章主要介紹了MyBatis動態(tài)Sql之if標簽的用法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-07-07
  • Java實戰(zhàn)項目 醫(yī)院預約掛號系統(tǒng)

    Java實戰(zhàn)項目 醫(yī)院預約掛號系統(tǒng)

    本文是一個Java語言編寫的實戰(zhàn)項目,是一個醫(yī)院預約掛號系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術,技術含量比較高,感興趣的童鞋跟著小編往下看吧
    2021-09-09

最新評論