網站首頁 編程語言 正文
目錄
pageHelper是國內非常優秀的一款mybatis分頁插件,支持基本的主流與常用的數據庫.
使用pageHelper的步驟
一? 引入分頁插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
二? 配置攔截器插件
在dao層的applicationContext-dao.xml配置文件中,配置以下內容
<!--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">
<!--使用下面方式配置參數,一行配置一個,可以不用配置可使用默認值-->
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
分頁插件的可選參數介紹:
- 默認情況下,我們會使用PageHelper的方式進行分頁,pageHelper實現了dialect接口,,如果想要實現自己的分頁邏輯,也可以通過實現Dialect接口(com.github.pagehelper.Dialect),然后配置該屬性為實現類的全限定名稱.
? ? ? ? ? ? ? ?
- 在默認dialect情況下,有以下幾個參數可以進行設置,但是在實際的應用過程中可以省略配置,使用默認值即可.
- helperDialect:自動檢測當前數據庫的連接,選擇合適的分頁方式.也可以配置此屬性指定使用哪種數據庫連接的分頁方式(oracle? ?mysql? ?db2? .....等)
- 注意:使用SqlServer2012數據庫時,需要手動指定為sqlserver2012,否則會使用SqlServer2015的方式進行分頁
- offsetAsPageNum:默認值為false,對使用RowsBounds作為分頁參數有效,當參數為true時,會將RowBounds中的offset參數當成pageNum使用,可以用頁碼和頁面大小兩個參數進行分頁.
- rowBoundsWithCount:默認值為false,對使用RowBounds作為分頁參數時有效,當該參數設置為true時,使用RowBounds分頁會進行count查詢
- pageSizeZero: 默認值為false,當該參數設置為true時,如果pageSize=0或者RowsBounds.limit=0就會查詢出全部的結果(相當于沒有執行分頁查詢,但是返回的結果仍然是page類型)
- reasonable:分頁合理化參數,默認值為false,當該參數為true時,pageNum<=0時查詢第一頁,pageNum>pages(超過總數時),會查詢最后一頁,默認為false,直接根據參數進行查詢
- params:為了支持startPage(Object? params)方法,增加了該參數來配置參數映射,用于從對象中根據屬性名取值,可以配置pageNum, pageSize, count, pageSizeZero, reasonable ,不配置映射則使用默認值,默認值為:pageNum=pageNum, pageSize=pageSize, count=countSql,reasonable=reasonable; pageSizeZero=pageSizeZero
- supportMethodArguments:支持通過Mapper接口參數來傳遞分頁參數,默認值為false,分頁插件從查詢方法的參數中,自動根據上面params配置的字段中取值,查找到合適的值就會自動進行分頁.
- autoRuntimeDialect:默認值為false.設置為true時,允許在運行時根據多數據源自動識別對應的方言進行分頁(不支持自動選擇SqlServer2012).
- closeConn:默認值為true當使用運行時動態數據源或者設置helperDialect屬性自動獲取數據庫類型是,會自動獲取一個數據庫連接,通過該屬性來設置是否關閉獲取這個連接,默認true關閉,設置為false后,不會關閉獲取的連接,參數的設置根據自己選擇的數據源來決定
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?參數的使用場景和參考連接:https://pagehelper.github.io/docs/howtouse/
三? 分頁插件在代碼中的使用
分頁插件的調用有多種方式,最用的有以下兩種調用方式.
- //第二種,Mapper接口方式的調用,pagehelper的startPage方法。
PageHelper.startPage(1, 10); List<Country> list = countryMapper.selectIf(1);
- //第三種,Mapper接口方式的調用,pagehelper的offsetPage方法。
PageHelper.offsetPage(1, 10); List<Country> list = countryMapper.selectIf(1);
分頁插件的執行原理:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?mybatis執行SQL語句的時候,會首先在sqlsessionFactory工廠中創建sqlsession對象,然后sqlsession進入Executor執行器中執行方法,在執行方法之前,mybatis攔截器對方法進行了攔截,判斷是否包含select查詢語句,如果包含了select查詢語句,則給語句后面拼接上limit條件語句,然后將拼接后的語句返回給執行器去執行,最后去數據庫中查詢結果然后返回
在實際應用中查詢分頁代碼寫在service模塊中,代碼樣式如下:
service:
// PageInfo等同于我們自定義的pageBean 并且比pageBean更完善 public PageInfo<Company> findByPage(Integer page, Integer pageSize) { PageHelper.startPage(page,pageSize); //使用分頁插件 一定要緊跟一個查詢方法 List<Company> list = companyDao.findAll(); //表面上是查詢所有,但是執行時已經分頁了 return new PageInfo<Company>(list,5); }
controller:
@RequestMapping(value = "/list", name = "查詢用戶信息") @RequestParam(defalutValue):屬性值代表默認值 public String findAdd(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer pageSize) { //根據分頁查詢用戶信息 PageInfo<User> pageInfo = userService.findByPage(getCompanyId(), page, pageSize); //將pageInfo信息保存到request域中 request.setAttribute("page", pageInfo); //重定向 return "system/user/user-list"; }
pageHelper的安全調用:
? ? ? ? pageHelper在使用startPage方法的時候,后面必須跟隨一個查詢的方法,因為pageHelper使用了靜態的ThreadLocal參數,分頁參數和線程是綁定的,而在finally代碼中自動清除了ThreadLocal存儲的對象.如果代碼在進入Executor前發生異常,就會導致線程不可用,同時也不會導致ThreadLocal參數被 錯誤的使用
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
PageInfo對象介紹
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//當前頁
private int pageNum;
//每頁的數量
private int pageSize;
//當前頁的數量
private int size;
//由于startRow和endRow不常用,這里說個具體的用法
//可以在頁面中"顯示startRow到endRow 共size條數據"
//當前頁面第一個元素在數據庫中的行號
private int startRow;
//當前頁面最后一個元素在數據庫中的行號
private int endRow;
//總記錄數
private long total;
//總頁數
private int pages;
//結果集
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;
//導航頁碼數
private int navigatePages;
//所有導航頁號
private int[] navigatepageNums;
//導航條上的第一頁
private int navigateFirstPage;
//導航條上的最后一頁
private int navigateLastPage;
}
?
原文鏈接:https://blog.csdn.net/weixin_43267344/article/details/109285537
相關推薦
- 2023-01-31 MongoDB?入門指南_MongoDB
- 2023-04-01 解讀opencv->tensorrt的數據排列方式_python
- 2022-05-11 【GitUtils】獲取gitee倉庫具體路徑下的內容
- 2022-05-02 Python的os包與os.path模塊的用法詳情_python
- 2022-08-16 Golang輕量級IoC容器安裝使用示例_Golang
- 2022-05-09 pytorch中的廣播語義_python
- 2022-11-28 golang進程內存控制避免docker內oom_Golang
- 2022-10-07 C語言折半查找法介紹及使用示例_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支