Mybatis-PageHelper使用方法

使用方法

  1. 引入分頁(yè)插件
    引入分頁(yè)插件有下面2種方式岖圈,推薦使用 Maven 方式。
    1). 引入 Jar 包
    你可以從下面的地址中下載最新版本的 jar 包
    ? https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
    ? http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
    由于使用了sql 解析工具钙皮,你還需要下載 jsqlparser.jar(需要和PageHelper 依賴的版本一致) :
    ? http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/
    2). 使用 Maven
    在 pom.xml 中添加如下依賴:
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
    </dependency>
    最新版本號(hào)可以從首頁(yè)查看蜂科。
  2. 配置攔截器插件
    特別注意,新版攔截器是 com.github.pagehelper.PageInterceptor短条。 com.github.pagehelper.PageHelper 現(xiàn)在是一個(gè)特殊的 dialect 實(shí)現(xiàn)類导匣,是分頁(yè)插件的默認(rèn)實(shí)現(xiàn)類,提供了和以前相同的用法茸时。
  3. 在 MyBatis 配置 xml 中配置攔截器插件

<plugins>

<plugin interceptor="com.github.pagehelper.PageInterceptor">

<property name="param1" value="value1"/>
</plugin>
</plugins>

  1. 在 Spring 配置文件中配置攔截器插件
    使用 spring 的屬性配置方式贡定,可以使用 plugins 屬性像下面這樣配置:
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    <property name="plugins">
    <array>
    <bean class="com.github.pagehelper.PageInterceptor">
    <property name="properties">

    <value>
    params=value1
    </value>
    </property>
    </bean>
    </array>
    </property>
    </bean>
  2. 分頁(yè)插件參數(shù)介紹
    分頁(yè)插件提供了多個(gè)可選參數(shù),這些參數(shù)使用時(shí)可都,按照上面兩種配置方式中的示例配置即可缓待。
    分頁(yè)插件可選參數(shù)如下:
    ? dialect:默認(rèn)情況下會(huì)使用 PageHelper 方式進(jìn)行分頁(yè)蚓耽,如果想要實(shí)現(xiàn)自己的分頁(yè)邏輯,可以實(shí)現(xiàn) Dialect(com.github.pagehelper.Dialect) 接口旋炒,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱步悠。
    下面幾個(gè)參數(shù)都是針對(duì)默認(rèn) dialect 情況下的參數(shù)。使用自定義 dialect 實(shí)現(xiàn)時(shí)瘫镇,下面的參數(shù)沒有任何作用鼎兽。
  3. helperDialect:分頁(yè)插件會(huì)自動(dòng)檢測(cè)當(dāng)前的數(shù)據(jù)庫(kù)鏈接,自動(dòng)選擇合適的分頁(yè)方式铣除。 你可以配置helperDialect屬性來(lái)指定分頁(yè)插件使用哪種方言谚咬。配置時(shí),可以使用下面的縮寫值:
    oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
    特別注意:使用 SqlServer2012 數(shù)據(jù)庫(kù)時(shí)尚粘,需要手動(dòng)指定為 sqlserver2012序宦,否則會(huì)使用 SqlServer2005 的方式進(jìn)行分頁(yè)。
    你也可以實(shí)現(xiàn) AbstractHelperDialect背苦,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱即可使用自定義的實(shí)現(xiàn)方法互捌。
  4. offsetAsPageNum:默認(rèn)值為 false,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效行剂。 當(dāng)該參數(shù)設(shè)置為 true 時(shí)秕噪,會(huì)將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁(yè)碼和頁(yè)面大小兩個(gè)參數(shù)進(jìn)行分頁(yè)厚宰。
  5. rowBoundsWithCount:默認(rèn)值為false腌巾,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí)铲觉,使用 RowBounds 分頁(yè)會(huì)進(jìn)行 count 查詢澈蝙。
  6. pageSizeZero:默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時(shí)撵幽,如果 pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁(yè)查詢灯荧,但是返回結(jié)果仍然是 Page 類型)。
  7. reasonable:分頁(yè)合理化參數(shù)盐杂,默認(rèn)值為false逗载。當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會(huì)查詢第一頁(yè)链烈,pageNum>pages(超過總數(shù)時(shí))厉斟,會(huì)查詢最后一頁(yè)。默認(rèn)false 時(shí)强衡,直接根據(jù)參數(shù)進(jìn)行查詢擦秽。
  8. params:為了支持startPage(Object params)方法,增加了該參數(shù)來(lái)配置參數(shù)映射,用于從對(duì)象中根據(jù)屬性名取值感挥, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable缩搅,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero链快。
  9. supportMethodsArguments:支持通過 Mapper 接口參數(shù)來(lái)傳遞分頁(yè)參數(shù),默認(rèn)值false眉尸,分頁(yè)插件會(huì)從查詢方法的參數(shù)值中域蜗,自動(dòng)根據(jù)上面 params 配置的字段中取值,查找到合適的值時(shí)就會(huì)自動(dòng)分頁(yè)噪猾。 使用方法可以參考測(cè)試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest霉祸。
  10. autoRuntimeDialect:默認(rèn)值為 false。設(shè)置為 true 時(shí)袱蜡,允許在運(yùn)行時(shí)根據(jù)多數(shù)據(jù)源自動(dòng)識(shí)別對(duì)應(yīng)方言的分頁(yè) (不支持自動(dòng)選擇sqlserver2012丝蹭,只能使用sqlserver),用法和注意事項(xiàng)參考下面的場(chǎng)景五坪蚁。
  11. closeConn:默認(rèn)值為 true奔穿。當(dāng)使用運(yùn)行時(shí)動(dòng)態(tài)數(shù)據(jù)源或沒有設(shè)置 helperDialect 屬性自動(dòng)獲取數(shù)據(jù)庫(kù)類型時(shí),會(huì)自動(dòng)獲取一個(gè)數(shù)據(jù)庫(kù)連接敏晤, 通過該屬性來(lái)設(shè)置是否關(guān)閉獲取的這個(gè)連接贱田,默認(rèn)true關(guān)閉,設(shè)置為 false 后嘴脾,不會(huì)關(guān)閉獲取的連接男摧,這個(gè)參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來(lái)決定。
  12. aggregateFunctions(5.1.5+):默認(rèn)為所有常見數(shù)據(jù)庫(kù)的聚合函數(shù)译打,允許手動(dòng)添加聚合函數(shù)(影響行數(shù))耗拓,所有以聚合函數(shù)開頭的函數(shù),在進(jìn)行 count 轉(zhuǎn)換時(shí)奏司,會(huì)套一層乔询。其他函數(shù)和列會(huì)被替換為 count(0),其中count列可以自己配置韵洋。
    重要提示:
    當(dāng) offsetAsPageNum=false 的時(shí)候哥谷,由于 PageNum 問題,RowBounds查詢的時(shí)候 reasonable 會(huì)強(qiáng)制為 false麻献。使用 PageHelper.startPage 方法不受影響们妥。
  13. 如何選擇配置這些參數(shù)
    單獨(dú)看每個(gè)參數(shù)的說(shuō)明可能是一件讓人不爽的事情,這里列舉一些可能會(huì)用到某些參數(shù)的情況勉吻。
    場(chǎng)景一
    如果你仍然在用類似ibatis式的命名空間調(diào)用方式监婶,你也許會(huì)用到rowBoundsWithCount, 分頁(yè)插件對(duì)RowBounds支持和 MyBatis 默認(rèn)的方式是一致,默認(rèn)情況下不會(huì)進(jìn)行 count 查詢惑惶,如果你想在分頁(yè)查詢時(shí)進(jìn)行 count 查詢煮盼, 以及使用更強(qiáng)大的 PageInfo類,你需要設(shè)置該參數(shù)為 true带污。
    注: PageRowBounds 想要查詢總數(shù)也需要配置該屬性為 true僵控。
    場(chǎng)景二
    如果你仍然在用類似ibatis式的命名空間調(diào)用方式,你覺得 RowBounds 中的兩個(gè)參數(shù) offset,limit 不如 pageNum,pageSize 容易理解鱼冀, 你可以使用 offsetAsPageNum 參數(shù)报破,將該參數(shù)設(shè)置為 true 后,offset會(huì)當(dāng)成 pageNum 使用千绪,limit 和 pageSize 含義相同充易。
    場(chǎng)景三
    如果覺得某個(gè)地方使用分頁(yè)后,你仍然想通過控制參數(shù)查詢?nèi)康慕Y(jié)果荸型,你可以配置 pageSizeZero 為 true盹靴, 配置后,當(dāng) pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果瑞妇。
    場(chǎng)景四
    如果你分頁(yè)插件使用于類似分頁(yè)查看列表式的數(shù)據(jù)稿静,如新聞列表,軟件列表辕狰, 你希望用戶輸入的頁(yè)數(shù)不在合法范圍(第一頁(yè)到最后一頁(yè)之外)時(shí)能夠正確的響應(yīng)到正確的結(jié)果頁(yè)面自赔, 那么你可以配置 reasonable 為 true,這時(shí)如果 pageNum<=0 會(huì)查詢第一頁(yè)柳琢,如果 pageNum>總頁(yè)數(shù) 會(huì)查詢最后一頁(yè)装畅。
    場(chǎng)景五
    如果你在 Spring 中配置了動(dòng)態(tài)數(shù)據(jù)源银受,并且連接不同類型的數(shù)據(jù)庫(kù)邢羔,這時(shí)你可以配置 autoRuntimeDialect 為 true妄均,這樣在使用不同數(shù)據(jù)源時(shí),會(huì)使用匹配的分頁(yè)進(jìn)行查詢倒堕。 這種情況下灾测,你還需要特別注意 closeConn 參數(shù),由于獲取數(shù)據(jù)源類型會(huì)獲取一個(gè)數(shù)據(jù)庫(kù)連接垦巴,所以需要通過這個(gè)參數(shù)來(lái)控制獲取連接后媳搪,是否關(guān)閉該連接。 默認(rèn)為 true骤宣,有些數(shù)據(jù)庫(kù)連接關(guān)閉后就沒法進(jìn)行后續(xù)的數(shù)據(jù)庫(kù)操作秦爆。而有些數(shù)據(jù)庫(kù)連接不關(guān)閉就會(huì)很快由于連接數(shù)用完而導(dǎo)致數(shù)據(jù)庫(kù)無(wú)響應(yīng)。所以在使用該功能時(shí)憔披,特別需要注意你使用的數(shù)據(jù)源是否需要關(guān)閉數(shù)據(jù)庫(kù)連接等限。
    當(dāng)不使用動(dòng)態(tài)數(shù)據(jù)源而只是自動(dòng)獲取 helperDialect 時(shí)爸吮,數(shù)據(jù)庫(kù)連接只會(huì)獲取一次,所以不需要擔(dān)心占用的這一個(gè)連接是否會(huì)導(dǎo)致數(shù)據(jù)庫(kù)出錯(cuò)望门,但是最好也根據(jù)數(shù)據(jù)源的特性選擇是否關(guān)閉連接形娇。
  14. 如何在代碼中使用
    閱讀前請(qǐng)注意看重要提示
    分頁(yè)插件支持以下幾種調(diào)用方式:
    //第一種,RowBounds方式的調(diào)用
    List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//第二種筹误,Mapper接口方式的調(diào)用桐早,推薦這種使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第三種厨剪,Mapper接口方式的調(diào)用哄酝,推薦這種使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);

//第四種丽惶,參數(shù)方法調(diào)用
//存在以下 Mapper 接口方法炫七,你不需要在 xml 處理后兩個(gè)參數(shù)
public interface CountryMapper {
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代碼中直接調(diào)用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

//第五種爬立,參數(shù)對(duì)象
//如果 pageNum 和 pageSize 存在于 User 對(duì)象中钾唬,只要參數(shù)有值,也會(huì)被分頁(yè)
//有如下 User 對(duì)象
public class User {
//其他fields
//下面兩個(gè)參數(shù)名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法侠驯,你不需要在 xml 處理后兩個(gè)參數(shù)
public interface CountryMapper {
List<Country> selectByPageNumSize(User user);
}
//當(dāng) user 中的 pageNum!= null && pageSize!= null 時(shí)抡秆,會(huì)自動(dòng)分頁(yè)
List<Country> list = countryMapper.selectByPageNumSize(user);

//第六種,ISelect 接口方式
//jdk6,7用法吟策,創(chuàng)建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

//也可以直接返回PageInfo儒士,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//對(duì)應(yīng)的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

//count查詢,返回一個(gè)查詢語(yǔ)句的count數(shù)
long total = PageHelper.count(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectLike(country);
}
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));
下面對(duì)最常用的方式進(jìn)行詳細(xì)介紹
1). RowBounds方式的調(diào)用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));
使用這種調(diào)用方式時(shí)檩坚,你可以使用RowBounds參數(shù)進(jìn)行分頁(yè)着撩,這種方式侵入性最小,我們可以看到匾委,通過RowBounds方式調(diào)用只是使用了這個(gè)參數(shù)拖叙,并沒有增加其他任何內(nèi)容。
分頁(yè)插件檢測(cè)到使用了RowBounds參數(shù)時(shí)赂乐,就會(huì)對(duì)該查詢進(jìn)行物理分頁(yè)薯鳍。
關(guān)于這種方式的調(diào)用,有兩個(gè)特殊的參數(shù)是針對(duì) RowBounds 的挨措,你可以參看上面的 場(chǎng)景一 和 場(chǎng)景二
注:不只有命名空間方式可以用RowBounds挖滤,使用接口的時(shí)候也可以增加RowBounds參數(shù),例如:
//這種情況下也會(huì)進(jìn)行物理分頁(yè)查詢
List<Country> selectAll(RowBounds rowBounds);
注意: 由于默認(rèn)情況下的 RowBounds 無(wú)法獲取查詢總數(shù)浅役,分頁(yè)插件提供了一個(gè)繼承自 RowBounds 的 PageRowBounds斩松,這個(gè)對(duì)象中增加了 total 屬性,執(zhí)行分頁(yè)查詢后觉既,可以從該屬性得到查詢總數(shù)砸民。
2). PageHelper.startPage 靜態(tài)方法調(diào)用
除了 PageHelper.startPage 方法外,還提供了類似用法的 PageHelper.offsetPage 方法。
在你需要進(jìn)行分頁(yè)的 MyBatis 查詢方法前調(diào)用 PageHelper.startPage 靜態(tài)方法即可岭参,緊跟在這個(gè)方法后的第一個(gè)MyBatis 查詢方法會(huì)被進(jìn)行分頁(yè)反惕。
例一:
//獲取第1頁(yè),10條內(nèi)容演侯,默認(rèn)查詢總數(shù)count
PageHelper.startPage(1, 10);
//緊跟著的第一個(gè)select方法會(huì)被分頁(yè)
List<Country> list = countryMapper.selectIf(1);
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁(yè)時(shí)姿染,實(shí)際返回的結(jié)果list類型是Page<E>,如果想取出分頁(yè)信息秒际,需要強(qiáng)制轉(zhuǎn)換為Page<E>
assertEquals(182, ((Page) list).getTotal());
例二:
//request: url?pageNum=1&pageSize=10
//支持 ServletRequest,Map,POJO 對(duì)象悬赏,需要配合 params 參數(shù)
PageHelper.startPage(request);
//緊跟著的第一個(gè)select方法會(huì)被分頁(yè)
List<Country> list = countryMapper.selectIf(1);

//后面的不會(huì)被分頁(yè),除非再次調(diào)用PageHelper.startPage
List<Country> list2 = countryMapper.selectIf(null);
//list1
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁(yè)時(shí)娄徊,實(shí)際返回的結(jié)果list類型是Page<E>闽颇,如果想取出分頁(yè)信息,需要強(qiáng)制轉(zhuǎn)換為Page<E>寄锐,
//或者使用PageInfo類(下面的例子有介紹)
assertEquals(182, ((Page) list).getTotal());
//list2
assertEquals(1, list2.get(0).getId());
assertEquals(182, list2.size());
例三兵多,使用PageInfo的用法:
//獲取第1頁(yè),10條內(nèi)容橄仆,默認(rèn)查詢總數(shù)count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo對(duì)結(jié)果進(jìn)行包裝
PageInfo page = new PageInfo(list);
//測(cè)試PageInfo全部屬性
//PageInfo包含了非常全面的分頁(yè)屬性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());
3). 使用參數(shù)方式
想要使用參數(shù)方式剩膘,需要配置 supportMethodsArguments 參數(shù)為 true,同時(shí)要配置 params 參數(shù)盆顾。 例如下面的配置:
<plugins>

<plugin interceptor="com.github.pagehelper.PageInterceptor">

<property name="supportMethodsArguments" value="true"/>
<property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
</plugin>
</plugins>
在 MyBatis 方法中:
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNumKey") int pageNum,
@Param("pageSizeKey") int pageSize);
當(dāng)調(diào)用這個(gè)方法時(shí)怠褐,由于同時(shí)發(fā)現(xiàn)了 pageNumKey 和 pageSizeKey 參數(shù),這個(gè)方法就會(huì)被分頁(yè)您宪。params 提供的幾個(gè)參數(shù)都可以這樣使用奈懒。
除了上面這種方式外,如果 User 對(duì)象中包含這兩個(gè)參數(shù)值宪巨,也可以有下面的方法:
List<Country> selectByPageNumSize(User user);
當(dāng)從 User 中同時(shí)發(fā)現(xiàn)了 pageNumKey 和 pageSizeKey 參數(shù)磷杏,這個(gè)方法就會(huì)被分頁(yè)。
注意:pageNum 和 pageSize 兩個(gè)屬性同時(shí)存在才會(huì)觸發(fā)分頁(yè)操作揖铜,在這個(gè)前提下茴丰,其他的分頁(yè)參數(shù)才會(huì)生效。
3). PageHelper 安全調(diào)用

  1. 使用 RowBounds 和 PageRowBounds 參數(shù)方式是極其安全的
  2. 使用參數(shù)方式是極其安全的
  3. 使用 ISelect 接口調(diào)用是極其安全的
    ISelect 接口方式除了可以保證安全外天吓,還特別實(shí)現(xiàn)了將查詢轉(zhuǎn)換為單純的 count 查詢方式贿肩,這個(gè)方法可以將任意的查詢方法,變成一個(gè) select count(*) 的查詢方法龄寞。
  4. 什么時(shí)候會(huì)導(dǎo)致不安全的分頁(yè)汰规?
    PageHelper 方法使用了靜態(tài)的 ThreadLocal 參數(shù),分頁(yè)參數(shù)和線程是綁定的物邑。
    只要你可以保證在 PageHelper 方法調(diào)用后緊跟 MyBatis 查詢方法溜哮,這就是安全的滔金。因?yàn)?PageHelper 在 finally 代碼段中自動(dòng)清除了 ThreadLocal 存儲(chǔ)的對(duì)象。
    如果代碼在進(jìn)入 Executor 前發(fā)生異常茂嗓,就會(huì)導(dǎo)致線程不可用餐茵,這屬于人為的 Bug(例如接口方法和 XML 中的不匹配,導(dǎo)致找不到 MappedStatement 時(shí))述吸, 這種情況由于線程不可用忿族,也不會(huì)導(dǎo)致 ThreadLocal 參數(shù)被錯(cuò)誤的使用。
    但是如果你寫出下面這樣的代碼蝌矛,就是不安全的用法:
    PageHelper.startPage(1, 10);
    List<Country> list;
    if(param1 != null){
    list = countryMapper.selectIf(param1);
    } else {
    list = new ArrayList<Country>();
    }
    這種情況下由于 param1 存在 null 的情況道批,就會(huì)導(dǎo)致 PageHelper 生產(chǎn)了一個(gè)分頁(yè)參數(shù),但是沒有被消費(fèi)入撒,這個(gè)參數(shù)就會(huì)一直保留在這個(gè)線程上隆豹。當(dāng)這個(gè)線程再次被使用時(shí),就可能導(dǎo)致不該分頁(yè)的方法去消費(fèi)這個(gè)分頁(yè)參數(shù)茅逮,這就產(chǎn)生了莫名其妙的分頁(yè)璃赡。
    上面這個(gè)代碼,應(yīng)該寫成下面這個(gè)樣子:
    List<Country> list;
    if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
    } else {
    list = new ArrayList<Country>();
    }
    這種寫法就能保證安全氮唯。
    如果你對(duì)此不放心鉴吹,你可以手動(dòng)清理 ThreadLocal 存儲(chǔ)的分頁(yè)參數(shù)姨伟,可以像下面這樣使用:
    List<Country> list;
    if(param1 != null){
    PageHelper.startPage(1, 10);
    try{
    list = countryMapper.selectAll();
    } finally {
    PageHelper.clearPage();
    }
    } else {
    list = new ArrayList<Country>();
    }
    這么寫很不好看惩琉,而且沒有必要。
  5. MyBatis 和 Spring 集成示例
    如果和Spring集成不熟悉夺荒,可以參考下面兩個(gè)
    只有基礎(chǔ)的配置信息瞒渠,沒有任何現(xiàn)成的功能,作為新手入門搭建框架的基礎(chǔ)
    ? 集成 Spring 3.x
    ? 集成 Spring 4.x
    這兩個(gè)集成框架集成了 PageHelper 和 通用 Mapper技扼。
  6. Spring Boot 集成示例
    ? https://github.com/abel533/MyBatis-Spring-Boot

轉(zhuǎn)載--http://mybatis.tk/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伍玖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剿吻,更是在濱河造成了極大的恐慌窍箍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽旅,死亡現(xiàn)場(chǎng)離奇詭異椰棘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榄笙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門邪狞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人茅撞,你說(shuō)我怎么就攤上這事帆卓【揠” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵剑令,是天一觀的道長(zhǎng)糊啡。 經(jīng)常有香客問我,道長(zhǎng)吁津,這世上最難降的妖魔是什么悔橄? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮腺毫,結(jié)果婚禮上癣疟,老公的妹妹穿的比我還像新娘。我一直安慰自己潮酒,他們只是感情好睛挚,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著急黎,像睡著了一般扎狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勃教,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天淤击,我揣著相機(jī)與錄音,去河邊找鬼故源。 笑死污抬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绳军。 我是一名探鬼主播印机,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼门驾!你這毒婦竟也來(lái)了射赛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奶是,失蹤者是張志新(化名)和其女友劉穎楣责,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聂沙,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秆麸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逐纬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛔屹。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖豁生,靈堂內(nèi)的尸體忽然破棺而出兔毒,到底是詐尸還是另有隱情漫贞,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布育叁,位于F島的核電站迅脐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豪嗽。R本人自食惡果不足惜谴蔑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望龟梦。 院中可真熱鬧隐锭,春花似錦、人聲如沸计贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躁倒。三九已至荞怒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秧秉,已是汗流浹背褐桌。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留象迎,地道東北人荧嵌。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挖帘,于是被迫代替她去往敵國(guó)和親完丽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恋技,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容