天天看點

mybatis 分頁插件 mysql_【MyBatis】MyBatis分頁插件PageHelper的使用

好多天沒寫部落格了,因為最近在實習,大部分時間在熟悉實習相關的東西,也沒有怎麼學習新的東西,這周末學習了MyBatis的一個分頁插件PageHelper,雖然沒有那麼的強大(我在最後會說明它的缺點),但還是挺不錯的。這篇博文主要來總結下如何使用PageHelper。

我們知道,在MySQL中,分頁的sql是使用limit來做,如果我們自己寫sql,那分頁肯定是沒有任何問題的。但是一旦model多了起來,複雜了起來,我們很自然的想到使用mybatis的逆向工程來生成相應的po和mapper,但是同時也會帶來弊端,比如這裡的分頁問題就不好解決了。

可能有人會說,我可以修改生成的檔案,沒錯,這是可行的,但是一般我們通過逆向工程生成的檔案,都不會去動它,是以這個時候,就需要使用分頁插件來解決了。在介紹如何使用這個分頁插件之前,先介紹一下mybatis中的插件是如何工作的,主要作用在哪個環節。我之前有寫過一篇mybatis的一篇入門文章:宏觀上把我mybatis架構。裡面有張mybatis的工作原理圖,為了友善叙述,我把圖也放在這:

mybatis 分頁插件 mysql_【MyBatis】MyBatis分頁插件PageHelper的使用

從圖中可以看出,mybatis中首先要在配置檔案中配置一些東西,然後根據這些配置去建立一個會話工廠,再根據會話工廠建立會話,會話發出操作資料庫的sql語句,然後通過執行器操作資料,再使用mappedStatement對資料進行封裝,這就是整個mybatis架構的執行情況。那麼mybatis的插件作用在哪一環節呢?它主要作用在Executor執行器與mappedeStatement之間,也就是說mybatis可以在插件中獲得要執行的sql語句,在sql語句中添加limit語句,然後再去對sql進行封裝,進而可以實作分頁處理。

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

1. 需要引入PageHelper的jar包

如果沒有使用maven,那直接把jar包導入到lib檔案夾下即可,這個PageHelper插件在github上有開源,位址為:https://github.com/pagehelper/Mybatis-PageHelper/tree/master/src/main/java/com/github/pagehelper。

如果使用了maven,那麼隻要在pom.xml中引入該插件即可,引入如下:

com.github.pagehelper

pagehelper

4.1.4

2. 在mybatis的全局配置檔案SqlMapConfig.xml中配置該插件

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

3. 在執行sql前添加插件,完成分頁功能

在查詢的sql語句執行之前,添加一行代碼PageHelper.startPage(1, 10);第一個參數表示第幾頁,第二個參數表示每頁顯示的記錄數。這樣在執行sql後就會将記錄按照語句中設定的那樣進行分頁。如果需要擷取總記錄數的話,需要PageInfo類的對象,這個對象可以擷取總記錄數,下面看下測試的代碼。

public classTestPageHelper {

@Testpublic voidtestPageHelper() {//建立一個spring容器

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*");//從spring容器中擷取mapper代理對象

TbItemMapper mapper = context.getBean(TbItemMapper.class);//執行查詢并分頁,TbItemExample是逆向工程自動生成的,用來進行條件查詢,這裡不設定則表示無條件

TbItemExample example = newTbItemExample();//分頁處理,顯示第一頁的10條資料

PageHelper.startPage(1, 10);

List list = mapper.selectByExample(example);//查詢//取商品清單

for(TbItem item : list) {

System.out.println(item.getTitle());

}//取分頁資訊

PageInfo pageInfo = new PageInfo(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插件,可以支援條件查詢,相對來說就比較強大了,可以在自己的工程中依賴修改過後的分頁插件進行開發。