使用方法
- 引入分頁(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è)查看蜂科。 - 配置攔截器插件
特別注意,新版攔截器是 com.github.pagehelper.PageInterceptor短条。 com.github.pagehelper.PageHelper 現(xiàn)在是一個(gè)特殊的 dialect 實(shí)現(xiàn)類导匣,是分頁(yè)插件的默認(rèn)實(shí)現(xiàn)類,提供了和以前相同的用法茸时。 - 在 MyBatis 配置 xml 中配置攔截器插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="param1" value="value1"/>
</plugin>
</plugins>
- 在 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> - 分頁(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ù)沒有任何作用鼎兽。 - 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)方法互捌。 - 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è)厚宰。
- rowBoundsWithCount:默認(rèn)值為false腌巾,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí)铲觉,使用 RowBounds 分頁(yè)會(huì)進(jìn)行 count 查詢澈蝙。
- pageSizeZero:默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時(shí)撵幽,如果 pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁(yè)查詢灯荧,但是返回結(jié)果仍然是 Page 類型)。
- 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)行查詢擦秽。
- 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链快。
- 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霉祸。
- 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)景五坪蚁。
- 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)決定。
- 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 方法不受影響们妥。 - 如何選擇配置這些參數(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)閉連接形娇。 - 如何在代碼中使用
閱讀前請(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)用
- 使用 RowBounds 和 PageRowBounds 參數(shù)方式是極其安全的
- 使用參數(shù)方式是極其安全的
- 使用 ISelect 接口調(diào)用是極其安全的
ISelect 接口方式除了可以保證安全外天吓,還特別實(shí)現(xiàn)了將查詢轉(zhuǎn)換為單純的 count 查詢方式贿肩,這個(gè)方法可以將任意的查詢方法,變成一個(gè) select count(*) 的查詢方法龄寞。 - 什么時(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>();
}
這么寫很不好看惩琉,而且沒有必要。 - MyBatis 和 Spring 集成示例
如果和Spring集成不熟悉夺荒,可以參考下面兩個(gè)
只有基礎(chǔ)的配置信息瞒渠,沒有任何現(xiàn)成的功能,作為新手入門搭建框架的基礎(chǔ)
? 集成 Spring 3.x
? 集成 Spring 4.x
這兩個(gè)集成框架集成了 PageHelper 和 通用 Mapper技扼。 - Spring Boot 集成示例
? https://github.com/abel533/MyBatis-Spring-Boot
轉(zhuǎn)載--http://mybatis.tk/