Java實現(xiàn)分頁的幾種方法詳細解析
一、limit關(guān)鍵字
service層
@Service @Transactional public class ImplStudentService implements StudentService { @Resource private StudentDao studentDao; @Override public List<Student> selectAllStudent(String province, Integer offset, Integer limit) { return studentDao.selectAll(province,offset,limit); } }
sql語句
select * from student where province = #{province} limit #{offset},#{limit}
二、hibernate分頁
service層
@Override public List getStudents(Integer pageNo,Integer pageSize) throws Exception { // 分頁數(shù)據(jù) int[] startIdAndCount = new int[2]; startIdAndCount[0] = pageNo * pageSize; startIdAndCount[1] = pageSize; return studentDao.selectStudentsByPage(startIdAndCount); }
dao層
@Override public List findByHqlPage(int[] startIdAndCount) throws Exception { String hql = "..."; try { Query query = getSession().createQuery(hql); // 設(shè)置分頁 if (startIdAndCount != null && startIdAndCount.length > 0) { int rowStartIdx = Math.max(0, startIdAndCount[0]); if (rowStartIdx > 0) { query.setFirstResult(rowStartIdx);// 設(shè)置開始取值的索引 } if (startIdAndCount.length > 1) { int rowCount = Math.max(0, startIdAndCount[1]); if (rowCount > 0) { query.setMaxResults(rowCount);// 設(shè)置結(jié)束取值的索引 } } } return query.list(); } catch (RuntimeException re) { log.error("分頁查詢失?。?, re); throw re; } }
三、截取List查詢結(jié)果分頁(簡單粗暴)
List<StudentEnroll> students = studentlDao.getAllStudents(); int count = 0; if(studentEnrolls != null && studentEnrolls.size() > 0) { count = studentEnrolls.size(); int fromIndex = pageNo * pageSize; int toIndex = (pageNo + 1) * pageSize; if(toIndex > count) { toIndex = count; } List<StudentEnroll> pageList = studentEnrolls.subList(fromIndex, toIndex);
四、mybatis框架pageHelper插件分頁
Spring整合:
導(dǎo)入pom.xml
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
配置項目配置文件(我在spring和mybatis整合的配置文件中配置的,如果在mybatis核心配置文件中配置,百度一下)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 依賴數(shù)據(jù)源 --> <property name="dataSource" ref="dataSource"/> <!-- 注冊加載myBatis映射文件 --> <property name="mapperLocations"> <array> <value>classpath*:com/yyz/mapper/*Mapper.xml</value> </array> </property> <!-- PageHelper分頁配置 --> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <!--使用下面的方式配置參數(shù),一行配置一個,后面會有所有的參數(shù)介紹 --> <value> <!--helperDialect屬性來指定分頁插件使用哪種方言。--> helperDialect=mysql <!--分頁合理化參數(shù),設(shè)置為true時,pageNum<=0時會查詢第一頁,pageNum>pages(超過總數(shù)時),會查詢最后一頁。--> reasonable=true <!--為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable--> params=count=countSql <!--支持通過Mapper接口參數(shù)來傳遞分頁參數(shù),默認值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配 置的字段中取值,查找到合適的值時就會自動分頁。--> supportMethodsArguments=true <!--默認值為 false。設(shè)置為 true 時,允許在運行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)方言的分頁--> autoRuntimeDialect=true </value> </property> </bean> </array> </property> <!-- 給數(shù)據(jù)庫實體起別名 --> <property name="typeAliasesPackage" value="com.yyz.entity;"/> </bean>
SpringBoot整合:
<!--分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>最新版本</version> </dependency>
配置項目application.yml文件
#bybatis分頁插件配置 pagehelper: helper-dialect: mysql #數(shù)據(jù)庫 reasonable: true support-methods-arguments: true params: count=countSql
標(biāo)題分頁插件參數(shù):
分頁插件提供了多個可選參數(shù),這些參數(shù)使用時,按照上面配置方式中的示例配置即可。
分頁插件可選參數(shù)如下:
- dialect:默認情況下會使用 PageHelper 方式進行分頁,如果想要實現(xiàn)自己的分頁邏輯,可以實現(xiàn) Dialect(com.github.pagehelper.Dialect) 接口,然后配置該屬性為實現(xiàn)類的全限定名稱。 使用自定義 dialect 實現(xiàn)時,下面的參數(shù)沒有任何作用。
- helperDialect:分頁插件會自動檢測當(dāng)前的數(shù)據(jù)庫鏈接,自動選擇合適的分頁方式。 oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby 特別注意:使用 SqlServer2012 數(shù)據(jù)庫時,需要手動指定為 sqlserver2012,否則會使用 SqlServer2005 的方式進行分頁。
- offsetAsPageNum:默認值為 false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為 true 時,會將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁碼和頁面大小兩個參數(shù)進行分頁。
- rowBoundsWithCount:默認值為false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為true時,使用 RowBounds 分頁會進行 count 查詢。
- pageSizeZero:默認值為 false,當(dāng)該參數(shù)設(shè)置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是 Page 類型)。
- reasonable:分頁合理化參數(shù),默認值為false。當(dāng)該參數(shù)設(shè)置為 true 時,pageNum<=0 時會查詢第一頁,pageNum>pages(超過總數(shù)時),會查詢最后一頁。默認false 時,直接根據(jù)參數(shù)進行查詢。
- params:為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
- supportMethodsArguments:支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù),默認值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。
- aggregateFunctions:默認為所有常見數(shù)據(jù)庫的聚合函數(shù),允許手動添加聚合函數(shù)(影響行數(shù)),所有以聚合函數(shù)開頭的函數(shù),在進行 count 轉(zhuǎn)換時,會套一層。其他函數(shù)和列會被替換為 count(0),其中count列可以自己配置。
重要提示:
當(dāng) offsetAsPageNum=false 的時候,由于 PageNum 問題,RowBounds查詢的時候 reasonable 會強制為 false。使用 PageHelper.startPage 方法不受影響。
service層
@Override public ResponseResult selectAllStudent(Integer pageNum, Integer pageSize) { Map<String,Object> map = new HashMap<>(); PageHelper.startPage(pageNum,pageSize); List<Student> students = studentMapper.selectAllStudents(); PageInfo pageInfo = new PageInfo(students); long total = pageInfo.getTotal(); map.put("result",pageInfo); map.put("count",total); return ResponseResultUtil.success(map); }
五、springData分頁
service層
Sort.Order travelDate = new Sort.Order(Sort.Direction.DESC, "travelDate"); Sort.Order createdTime = new Sort.Order(Sort.Direction.DESC, "createdTime"); Sort sort = new Sort(travelDate, createdTime); Pageable pageable = new PageRequest(page, pageSize, sort); List<TravelItem> items = null; try { items = travelRepository.getTravelItemsByTravelDateBetweenAndUserId(theStartDate, theEndDate, openId, pageable); } catch (Exception e) { throw new DatabaseRelatedException("TravelRepository異常"); }
dao層:接口繼承的是PagingAndSortingRepository接口,注意要加@Repository注解
到此這篇關(guān)于Java實現(xiàn)分頁的幾種方法詳細解析的文章就介紹到這了,更多相關(guān)Java分頁的方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用訪問者模式解決公司層級結(jié)構(gòu)圖問題詳解
這篇文章主要介紹了Java使用訪問者模式解決公司層級結(jié)構(gòu)圖問題,結(jié)合實例形式分析了訪問者模式的概念、原理及Java使用訪問者模式解決公司曾經(jīng)結(jié)構(gòu)圖問題的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2018-04-04Java實戰(zhàn)之藥品管理系統(tǒng)的實現(xiàn)
這篇文章主要介紹了利用Java實現(xiàn)的藥品管理系統(tǒng),本項目屬于前后端分離的項目,分為兩個角色藥品管理員和取藥處人員,感興趣的小伙伴可以學(xué)習(xí)一下2022-04-04Mybatis自定義攔截器實現(xiàn)權(quán)限功能
本文主要介紹了Mybatis自定義攔截器實現(xiàn)權(quán)限功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12Mybatis事務(wù)如何跟Spring結(jié)合(數(shù)據(jù)庫事務(wù)特性和Spring事務(wù)管理源碼)
MyBatis與Spring的事務(wù)結(jié)合主要是通過Spring的事務(wù)管理和MyBatis的數(shù)據(jù)庫操作來實現(xiàn)的,在本文中,我們將從數(shù)據(jù)庫事務(wù)特性和Spring事務(wù)管理源碼兩個角度來分析MyBatis事務(wù)如何與Spring結(jié)合到一起的原理,感興趣的朋友一起看看吧2024-01-01springboot如何重定向攜帶數(shù)據(jù) RedirectAttributes
這篇文章主要介紹了springboot如何重定向攜帶數(shù)據(jù) RedirectAttributes,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09swagger2隱藏在API文檔顯示某些參數(shù)的操作
這篇文章主要介紹了swagger2隱藏在API文檔顯示某些參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Java中為什么重寫equals()也需要重寫hashCode方法
這篇文章主要介紹了Java中為什么重寫equals()也需要重寫hashCode(),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04