1. 程式人生 > >【MyBatis】MyBatis分頁外掛PageHelper的使用

【MyBatis】MyBatis分頁外掛PageHelper的使用

  好多天沒寫部落格了,因為最近在實習,大部分時間在熟悉實習相關的東西,也沒有怎麼學習新的東西,這週末學習了MyBatis的一個分頁外掛PageHelper,雖然沒有那麼的強大(我在最後會說明它的缺點),但還是挺不錯的。這篇博文主要來總結下如何使用PageHelper。
  我們知道,在mysql中,分頁的sql是使用limit來做,如果我們自己寫sql,那分頁肯定是沒有任何問題的。但是一旦model多了起來,複雜了起來,我們很自然的想到使用mybatis的逆向工程來生成相應的po和mapper,但是同時也會帶來弊端,比如這裡的分頁問題就不好解決了。
  可能有人會說,我可以修改生成的檔案,沒錯,這是可行的,但是一般我們通過逆向工程生成的檔案,都不會去動它,所以這個時候,就需要使用分頁外掛來解決了。在介紹如何使用這個分頁外掛之前,先介紹一下mybatis中的外掛是如何工作的,主要作用在哪個環節。我之前有寫過一篇mybatis的一篇入門文章:

巨集觀上把我mybatis框架。裡面有張mybatis的工作原理圖,為了方便敘述,我把圖也放在這:
這裡寫圖片描述
  從圖中可以看出,mybatis中首先要在配置檔案中配置一些東西,然後根據這些配置去建立一個會話工廠,再根據會話工廠建立會話,會話發出操作資料庫的sql語句,然後通過執行器操作資料,再使用mappedStatement對資料進行封裝,這就是整個mybatis框架的執行情況。那麼mybatis的外掛作用在哪一環節呢?它主要作用在Executor執行器與mappedeStatement之間,也就是說mybatis可以在外掛中獲得要執行的sql語句,在sql語句中新增limit語句,然後再去對sql進行封裝,從而可以實現分頁處理

  搞清楚了分頁外掛的執行情況,下面來總結下mybatis中PageHelper的使用。

1. 需要引入PageHelper的jar包

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

2. 在mybatis的全域性配置檔案SqlMapConfig.xml中配置該外掛

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置分頁外掛 -->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <!-- 設定資料庫型別 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫-->        
            <property name="dialect" value="mysql"/>
        </plugin>
    </plugins>

</configuration>

3. 在執行sql前新增外掛,完成分頁功能

  在查詢的sql語句執行之前,新增一行程式碼PageHelper.startPage(1, 10);第一個引數表示第幾頁,第二個引數表示每頁顯示的記錄數。這樣在執行sql後就會將記錄按照語句中設定的那樣進行分頁。如果需要獲取總記錄數的話,需要PageInfo類的物件,這個物件可以獲取總記錄數,下面看下測試的程式碼。

public class TestPageHelper {

    @Test
    public void testPageHelper() {
        // 建立一個spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*");
        // 從spring容器中獲取mapper代理物件
        TbItemMapper mapper = context.getBean(TbItemMapper.class);
        // 執行查詢並分頁,TbItemExample是逆向工程自動生成的,用來進行條件查詢,這裡不設定則表示無條件
        TbItemExample example = new TbItemExample();
        //分頁處理,顯示第一頁的10條資料
        PageHelper.startPage(1, 10);
        List<TbItem> list = mapper.selectByExample(example);//查詢
        // 取商品列表
        for(TbItem item : list) {
            System.out.println(item.getTitle());
        }
        // 取分頁資訊
        PageInfo<TbItem> pageInfo = new PageInfo<TbItem>(list);
        long total = pageInfo.getTotal(); //獲取總記錄數
        System.out.println("共有商品資訊:" + total);
    }
}

看下執行的結果:

夏普(SHARP)LCD-46DS40A 46英寸 日本原裝液晶面板 智慧全高清液晶電視
飛利浦 老人手機 (X2560) 深情藍 移動聯通2G手機 雙卡雙待
中興 U288 珠光白 移動3G手機
三星 SCH-W899 亮金色 電信3G手機 雙卡雙待雙通
飛利浦 老人手機 (X2560) 喜慶紅 移動聯通2G手機 雙卡雙待
飛利浦 老人手機 (X2560) 硬朗黑 移動聯通2G手機 雙卡雙待
三星 Galaxy S4 (I9500)16G版 皓月白 聯通3G手機
三星 Galaxy S4 (I9500) 16G版 星空黑 聯通3G手機
三星 I8552 白色 聯通3G手機 雙卡雙待
長虹(CHANGHONG) 3D51C1080i 51英寸 快門式3D智慧Android 電視(黑色)
共有商品資訊:3096

  可以看到,只顯示出了10條資料,但是我總共有3096條資料,如果將引數改成(2,10),那麼就會顯示第二頁不同的10條資料,在這就不測試了。這說明PageHelper外掛可以幫助我們實現分頁功能,例如EasyUI中就會傳到後臺分頁引數資訊,後臺就可以根據引數獲取分頁資料等等。
  正如前面所說,這個PageHelper其實也有缺點,因為它對逆向工程生成的程式碼支援不好,不能對有查詢條件的查詢分頁,會拋異常,上面是無條件查詢的。當然,我們自己可以修改這個PageHelper外掛,使其支援條件查詢,當然,我是修改不了的……網上有修改過後的PageHelper外掛,可以支援條件查詢,相對來說就比較強大了,可以在自己的工程中依賴修改過後的分頁外掛進行開發。

【友情提示】我的 Spring Boot 達人課上線了,您的支援是我創作的最大動力!

掃碼試讀或點此試讀
這裡寫圖片描述
文末福利:“程式設計師私房菜”,一個有溫度的公眾號~
程式設計師私房菜