網(wǎng)站首頁 編程語言 正文
目錄
pageHelper是國內(nèi)非常優(yōu)秀的一款mybatis分頁插件,支持基本的主流與常用的數(shù)據(jù)庫.
使用pageHelper的步驟
一? 引入分頁插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
二? 配置攔截器插件
在dao層的applicationContext-dao.xml配置文件中,配置以下內(nèi)容
<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="cn.itcast.domain"/>
<!--配置spring和mybatis整合分頁插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面方式配置參數(shù),一行配置一個,可以不用配置可使用默認(rèn)值-->
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
分頁插件的可選參數(shù)介紹:
- 默認(rèn)情況下,我們會使用PageHelper的方式進(jìn)行分頁,pageHelper實(shí)現(xiàn)了dialect接口,,如果想要實(shí)現(xiàn)自己的分頁邏輯,也可以通過實(shí)現(xiàn)Dialect接口(com.github.pagehelper.Dialect),然后配置該屬性為實(shí)現(xiàn)類的全限定名稱.
? ? ? ? ? ? ? ?
- 在默認(rèn)dialect情況下,有以下幾個參數(shù)可以進(jìn)行設(shè)置,但是在實(shí)際的應(yīng)用過程中可以省略配置,使用默認(rèn)值即可.
- helperDialect:自動檢測當(dāng)前數(shù)據(jù)庫的連接,選擇合適的分頁方式.也可以配置此屬性指定使用哪種數(shù)據(jù)庫連接的分頁方式(oracle? ?mysql? ?db2? .....等)
- 注意:使用SqlServer2012數(shù)據(jù)庫時,需要手動指定為sqlserver2012,否則會使用SqlServer2015的方式進(jìn)行分頁
- offsetAsPageNum:默認(rèn)值為false,對使用RowsBounds作為分頁參數(shù)有效,當(dāng)參數(shù)為true時,會將RowBounds中的offset參數(shù)當(dāng)成pageNum使用,可以用頁碼和頁面大小兩個參數(shù)進(jìn)行分頁.
- rowBoundsWithCount:默認(rèn)值為false,對使用RowBounds作為分頁參數(shù)時有效,當(dāng)該參數(shù)設(shè)置為true時,使用RowBounds分頁會進(jìn)行count查詢
- pageSizeZero: 默認(rèn)值為false,當(dāng)該參數(shù)設(shè)置為true時,如果pageSize=0或者RowsBounds.limit=0就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回的結(jié)果仍然是page類型)
- reasonable:分頁合理化參數(shù),默認(rèn)值為false,當(dāng)該參數(shù)為true時,pageNum<=0時查詢第一頁,pageNum>pages(超過總數(shù)時),會查詢最后一頁,默認(rèn)為false,直接根據(jù)參數(shù)進(jìn)行查詢
- params:為了支持startPage(Object? params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值,可以配置pageNum, pageSize, count, pageSizeZero, reasonable ,不配置映射則使用默認(rèn)值,默認(rèn)值為:pageNum=pageNum, pageSize=pageSize, count=countSql,reasonable=reasonable; pageSizeZero=pageSizeZero
- supportMethodArguments:支持通過Mapper接口參數(shù)來傳遞分頁參數(shù),默認(rèn)值為false,分頁插件從查詢方法的參數(shù)中,自動根據(jù)上面params配置的字段中取值,查找到合適的值就會自動進(jìn)行分頁.
- autoRuntimeDialect:默認(rèn)值為false.設(shè)置為true時,允許在運(yùn)行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)的方言進(jìn)行分頁(不支持自動選擇SqlServer2012).
- closeConn:默認(rèn)值為true當(dāng)使用運(yùn)行時動態(tài)數(shù)據(jù)源或者設(shè)置helperDialect屬性自動獲取數(shù)據(jù)庫類型是,會自動獲取一個數(shù)據(jù)庫連接,通過該屬性來設(shè)置是否關(guān)閉獲取這個連接,默認(rèn)true關(guān)閉,設(shè)置為false后,不會關(guān)閉獲取的連接,參數(shù)的設(shè)置根據(jù)自己選擇的數(shù)據(jù)源來決定
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?參數(shù)的使用場景和參考連接:https://pagehelper.github.io/docs/howtouse/
三? 分頁插件在代碼中的使用
分頁插件的調(diào)用有多種方式,最用的有以下兩種調(diào)用方式.
- //第二種,Mapper接口方式的調(diào)用,pagehelper的startPage方法。
PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectIf(1);
- //第三種,Mapper接口方式的調(diào)用,pagehelper的offsetPage方法。
PageHelper.offsetPage(1, 10); List<Country> list = countryMapper.selectIf(1);
分頁插件的執(zhí)行原理:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?mybatis執(zhí)行SQL語句的時候,會首先在sqlsessionFactory工廠中創(chuàng)建sqlsession對象,然后sqlsession進(jìn)入Executor執(zhí)行器中執(zhí)行方法,在執(zhí)行方法之前,mybatis攔截器對方法進(jìn)行了攔截,判斷是否包含select查詢語句,如果包含了select查詢語句,則給語句后面拼接上limit條件語句,然后將拼接后的語句返回給執(zhí)行器去執(zhí)行,最后去數(shù)據(jù)庫中查詢結(jié)果然后返回
在實(shí)際應(yīng)用中查詢分頁代碼寫在service模塊中,代碼樣式如下:
service:
// PageInfo等同于我們自定義的pageBean 并且比pageBean更完善 public PageInfo<Company> findByPage(Integer page, Integer pageSize) { PageHelper.startPage(page,pageSize); //使用分頁插件 一定要緊跟一個查詢方法 List<Company> list = companyDao.findAll(); //表面上是查詢所有,但是執(zhí)行時已經(jīng)分頁了 return new PageInfo<Company>(list,5); }
controller:
@RequestMapping(value = "/list", name = "查詢用戶信息") @RequestParam(defalutValue):屬性值代表默認(rèn)值 public String findAdd(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer pageSize) { //根據(jù)分頁查詢用戶信息 PageInfo<User> pageInfo = userService.findByPage(getCompanyId(), page, pageSize); //將pageInfo信息保存到request域中 request.setAttribute("page", pageInfo); //重定向 return "system/user/user-list"; }
pageHelper的安全調(diào)用:
? ? ? ? pageHelper在使用startPage方法的時候,后面必須跟隨一個查詢的方法,因?yàn)閜ageHelper使用了靜態(tài)的ThreadLocal參數(shù),分頁參數(shù)和線程是綁定的,而在finally代碼中自動清除了ThreadLocal存儲的對象.如果代碼在進(jìn)入Executor前發(fā)生異常,就會導(dǎo)致線程不可用,同時也不會導(dǎo)致ThreadLocal參數(shù)被 錯誤的使用
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
PageInfo對象介紹
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//當(dāng)前頁
private int pageNum;
//每頁的數(shù)量
private int pageSize;
//當(dāng)前頁的數(shù)量
private int size;
//由于startRow和endRow不常用,這里說個具體的用法
//可以在頁面中"顯示startRow到endRow 共size條數(shù)據(jù)"
//當(dāng)前頁面第一個元素在數(shù)據(jù)庫中的行號
private int startRow;
//當(dāng)前頁面最后一個元素在數(shù)據(jù)庫中的行號
private int endRow;
//總記錄數(shù)
private long total;
//總頁數(shù)
private int pages;
//結(jié)果集
private List<T> list;
//前一頁
private int prePage;
//下一頁
private int nextPage;
//是否為第一頁
private boolean isFirstPage = false;
//是否為最后一頁
private boolean isLastPage = false;
//是否有前一頁
private boolean hasPreviousPage = false;
//是否有下一頁
private boolean hasNextPage = false;
//導(dǎo)航頁碼數(shù)
private int navigatePages;
//所有導(dǎo)航頁號
private int[] navigatepageNums;
//導(dǎo)航條上的第一頁
private int navigateFirstPage;
//導(dǎo)航條上的最后一頁
private int navigateLastPage;
}
?
原文鏈接:https://blog.csdn.net/weixin_43267344/article/details/109285537
相關(guān)推薦
- 2023-01-09 GO中優(yōu)雅編碼與降低圈復(fù)雜度詳析_Golang
- 2022-10-25 詳解redis在服務(wù)器linux下啟動的相關(guān)命令(安裝和配置)_Redis
- 2023-01-19 GO語言的數(shù)組array與切片slice詳解_Golang
- 2022-01-30 uniapp history路由配置,apache服務(wù)器簡單配置(刷新報404解決方法)
- 2022-01-17 計(jì)算屬性 computed與 watch 的區(qū)別
- 2022-05-12 Kotlin 判斷泛型類型 reified
- 2022-09-20 用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)_python
- 2023-03-16 Python?NumPy?數(shù)組索引的示例詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支