Java實(shí)現(xiàn)分頁的幾種方法詳細(xì)解析
一、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>
配置項(xiàng)目配置文件(我在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ù),一行配置一個(gè),后面會有所有的參數(shù)介紹 -->
<value>
<!--helperDialect屬性來指定分頁插件使用哪種方言。-->
helperDialect=mysql
<!--分頁合理化參數(shù),設(shè)置為true時(shí),pageNum<=0時(shí)會查詢第一頁,pageNum>pages(超過總數(shù)時(shí)),會查詢最后一頁。-->
reasonable=true
<!--為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值,
可以配置 pageNum,pageSize,count,pageSizeZero,reasonable-->
params=count=countSql
<!--支持通過Mapper接口參數(shù)來傳遞分頁參數(shù),默認(rèn)值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配
置的字段中取值,查找到合適的值時(shí)就會自動分頁。-->
supportMethodsArguments=true
<!--默認(rèn)值為 false。設(shè)置為 true 時(shí),允許在運(yùn)行時(shí)根據(jù)多數(shù)據(jù)源自動識別對應(yīng)方言的分頁-->
autoRuntimeDialect=true
</value>
</property>
</bean>
</array>
</property>
<!-- 給數(shù)據(jù)庫實(shí)體起別名 -->
<property name="typeAliasesPackage" value="com.yyz.entity;"/>
</bean>
SpringBoot整合:
<!--分頁插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
配置項(xiàng)目application.yml文件
#bybatis分頁插件配置 pagehelper: helper-dialect: mysql #數(shù)據(jù)庫 reasonable: true support-methods-arguments: true params: count=countSql
標(biāo)題分頁插件參數(shù):
分頁插件提供了多個(gè)可選參數(shù),這些參數(shù)使用時(shí),按照上面配置方式中的示例配置即可。
分頁插件可選參數(shù)如下:
- dialect:默認(rèn)情況下會使用 PageHelper 方式進(jìn)行分頁,如果想要實(shí)現(xiàn)自己的分頁邏輯,可以實(shí)現(xiàn) Dialect(com.github.pagehelper.Dialect) 接口,然后配置該屬性為實(shí)現(xiàn)類的全限定名稱。 使用自定義 dialect 實(shí)現(xiàn)時(shí),下面的參數(shù)沒有任何作用。
- helperDialect:分頁插件會自動檢測當(dāng)前的數(shù)據(jù)庫鏈接,自動選擇合適的分頁方式。 oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby 特別注意:使用 SqlServer2012 數(shù)據(jù)庫時(shí),需要手動指定為 sqlserver2012,否則會使用 SqlServer2005 的方式進(jìn)行分頁。
- offsetAsPageNum:默認(rèn)值為 false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為 true 時(shí),會將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁碼和頁面大小兩個(gè)參數(shù)進(jìn)行分頁。
- rowBoundsWithCount:默認(rèn)值為false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí),使用 RowBounds 分頁會進(jìn)行 count 查詢。
- pageSizeZero:默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時(shí),如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是 Page 類型)。
- reasonable:分頁合理化參數(shù),默認(rèn)值為false。當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會查詢第一頁,pageNum>pages(超過總數(shù)時(shí)),會查詢最后一頁。默認(rèn)false 時(shí),直接根據(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。
- supportMethodsArguments:支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù),默認(rèn)值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配置的字段中取值,查找到合適的值時(shí)就會自動分頁。
- aggregateFunctions:默認(rèn)為所有常見數(shù)據(jù)庫的聚合函數(shù),允許手動添加聚合函數(shù)(影響行數(shù)),所有以聚合函數(shù)開頭的函數(shù),在進(jìn)行 count 轉(zhuǎn)換時(shí),會套一層。其他函數(shù)和列會被替換為 count(0),其中count列可以自己配置。
重要提示:
當(dāng) offsetAsPageNum=false 的時(shí)候,由于 PageNum 問題,RowBounds查詢的時(shí)候 reasonable 會強(qiáng)制為 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實(shí)現(xiàn)分頁的幾種方法詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java分頁的方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot調(diào)用SOAP接口全流程(含多服務(wù)配置)
本文主要介紹了SpringBoot調(diào)用SOAP接口全流程(含多服務(wù)配置),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-06-06
IDEA創(chuàng)建Servlet并配置web.xml的實(shí)現(xiàn)
這篇文章主要介紹了IDEA創(chuàng)建Servlet并配置web.xml的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Java 后端HTTP 請求(GET/POST)傳輸規(guī)范
文章詳細(xì)闡述了RESTful API設(shè)計(jì)的最佳實(shí)踐,涵蓋了GET和POST請求的規(guī)范、參數(shù)傳遞、響應(yīng)體、版本控制、日志記錄等,本文介紹實(shí)例代碼介紹了Java后端HTTP請求(GET/POST)傳輸規(guī)范,感興趣的朋友一起看看吧2026-04-04
深入解析Java的設(shè)計(jì)模式編程中單例模式的使用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來說將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下2016-02-02
JavaFX桌面應(yīng)用未響應(yīng)問題解決方案
這篇文章主要介紹了JavaFX桌面應(yīng)用未響應(yīng)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
總結(jié)十個(gè)實(shí)用但偏執(zhí)的Java編程技術(shù)
Java是世界上最流行的程序語言,從1995年問世以來,Java的生態(tài)系統(tǒng)在一直在蓬勃的發(fā)展著。下面這篇文章主要總結(jié)了十個(gè)實(shí)用但偏執(zhí)的Java編程技術(shù),需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01
SpringBoot接口返回結(jié)果封裝方法實(shí)例詳解
在實(shí)際項(xiàng)目中,一般會把結(jié)果放在一個(gè)封裝類中,封裝類中包含http狀態(tài)值,狀態(tài)消息,以及實(shí)際的數(shù)據(jù)。這里主要記錄兩種方式,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-09-09

