相比有接觸過或者對編程有自己了解的人來說對 java 并不會很陌生,那么就拿 java 來說對于“在Java中怎么實(shí)現(xiàn)分頁功能?”這個(gè)問題是我們在開發(fā)和學(xué)習(xí)中會遇到的,下面是一些有關(guān)于這個(gè)問題的相關(guān)內(nèi)容和代碼,希望對大家有所幫助。
一、limit關(guān)鍵字
通過使用這個(gè)方法我們來看下相關(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);
}
}
對應(yīng)的相關(guān) 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);
}
跟 limit 關(guān)鍵字方法不同的是,在 hibernate 方法中使用的是 dao層,代碼如下所示:
@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);
}
三、截取List查詢結(jié)果分頁
對于這個(gè)方法會顯得比較的簡單我們直接來看代碼:
@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);
}
四、mybatis框架pageHelper插件分頁
首先我們來看 Spring整合部分:
導(dǎo)入pom.xml 代碼如下所示:
@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);
}
我們通過配置項(xiàng)目的配置文件代碼如下所示:
<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整合:
@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);
}
配置項(xiàng)目 ?application.xml
?文件,代碼如下所示:
@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);
}
對于在分頁插件中為我們也提供了下面這些參數(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)然在這些方法參數(shù)中,當(dāng) ?offsetAsPageNum=false
? 的時(shí)候,由于代碼中 ?PageNum
?的問題 ?RowBound
?在查詢的時(shí)候 ?reasonable
?會強(qiáng)制為 ?false
?,但是使用?PageHelper.startPage
? 方法不受影響。我們來看下相關(guān)內(nèi)容的 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異常");
}
這就是有關(guān)于在service層的代碼,那么對于dao層的話,接口繼承的是?PagingAndSortingRepository
?接口,所以我們注意要加?@Repository
?注解。
總結(jié):
以上就是有關(guān)于在java中“怎么實(shí)現(xiàn)分頁功能?”這個(gè)問題的相關(guān)內(nèi)容當(dāng)然如果你有更好的方法和見解也可以和大家一起分享,更多有關(guān)于在java這方面的相關(guān)內(nèi)容我們都可以在W3Cschool中進(jìn)行學(xué)習(xí)和了解。