App下載

在Java中怎么實現分頁功能?實現分頁功能常見的方法!

猿友 2021-07-07 16:11:10 瀏覽數 (5184)
反饋

相比有接觸過或者對編程有自己了解的人來說對 java 并不會很陌生,那么就拿 java 來說對于“在Java中怎么實現分頁功能?”這個問題是我們在開發(fā)和學習中會遇到的,下面是一些有關于這個問題的相關內容和代碼,希望對大家有所幫助。


一、limit關鍵字

通過使用這個方法我們來看下相關的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 {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

跟 limit 關鍵字方法不同的是,在 hibernate 方法中使用的是 dao層,代碼如下所示:

  @Override
  public List getStudents(Integer  pageNo,Integer  pageSize) throws Exception {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

三、截取List查詢結果分頁

對于這個方法會顯得比較的簡單我們直接來看代碼:

  @Override
  public List getStudents(Integer  pageNo,Integer  pageSize) throws Exception {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

四、mybatis框架pageHelper插件分頁

首先我們來看 Spring整合部分:

導入pom.xml 代碼如下所示:

  @Override
  public List getStudents(Integer  pageNo,Integer  pageSize) throws Exception {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

我們通過配置項目的配置文件代碼如下所示:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 依賴數據源 -->

        <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">

                        <!--使用下面的方式配置參數,一行配置一個,后面會有所有的參數介紹 -->

                        <value>

                    <!--helperDialect屬性來指定分頁插件使用哪種方言。-->

                            helperDialect=mysql

                    <!--分頁合理化參數,設置為true時,pageNum<=0時會查詢第一頁,pageNum>pages(超過總數時),會查詢最后一頁。-->

                            reasonable=true

                    <!--為了支持startPage(Object params)方法,增加了該參數來配置參數映射,用于從對象中根據屬性名取值,

                        可以配置 pageNum,pageSize,count,pageSizeZero,reasonable-->

                            params=count=countSql

                    <!--支持通過Mapper接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配

                     置的字段中取值,查找到合適的值時就會自動分頁。-->

                            supportMethodsArguments=true

                    <!--默認值為 false。設置為 true 時,允許在運行時根據多數據源自動識別對應方言的分頁-->

                            autoRuntimeDialect=true

                        </value>

                    </property>

                </bean>

            </array>

        </property>

        <!-- 給數據庫實體起別名 -->

        <property name="typeAliasesPackage" value="com.yyz.entity;"/>

 </bean>

SpringBoot整合:

  @Override
  public List getStudents(Integer  pageNo,Integer  pageSize) throws Exception {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

配置項目 ?application.xml ?文件,代碼如下所示:

  @Override
  public List getStudents(Integer  pageNo,Integer  pageSize) throws Exception {
  // 分頁數據
  int[] startIdAndCount = new int[2];
  startIdAndCount[0] = pageNo * pageSize;
  startIdAndCount[1] = pageSize;
  return studentDao.selectStudentsByPage(startIdAndCount);
 }

對于在分頁插件中為我們也提供了下面這些參數:

  • ?dialect:?默認情況下會使用 ?PageHelper ?方式進行分頁,如果想要實現自己的分頁邏輯,可以實現 。
  • ?Dialect?(com.github.pagehelper.Dialect) 接口,然后配置該屬性為實現類的全限定名稱。 使用自定義 ?dialect ?實現時,下面的參數沒有任何作用。 
  • ?helperDialect?:分頁插件會自動檢測當前的數據庫鏈接,自動選擇合適的分頁方式?oracle?,?mysql?,?mariadb?,?sqlite?,?hsqldb?,?postgresql?,?db2?,?sqlserver?,?informix?,?h2?,?sqlserver2012?,?derby ?。特別注意:使用 SqlServer2012 數據庫時,需要手動指定為 sqlserver2012,否則會使用 SqlServer2005 的方式進行分頁。 ?offsetAsPageNum?:默認值為 ?false?,該參數對使用 ?RowBounds ?作為分頁參數時有效。 當該參數設置為 ?true ? 時,會將 ?RowBounds ?中的 ?offset ?參數當成 ?pageNum ?使用,可以用頁碼和頁面大小兩個參數進行分頁。 
  • ?rowBoundsWithCount?:默認值為?false?,該參數對使用 ?RowBounds ?作為分頁參數時有效。 當該參數設置為?true?時,使用 ?RowBounds ?分頁會進行 ?count ?查詢。
  • ? pageSizeZero?:默認值為 false,當該參數設置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果(相當于沒有執(zhí)行分頁查詢,但是返回結果仍然是 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?。 ?
  • supportMethodsArguments?:支持通過 ?Mapper? 接口參數來傳遞分頁參數,默認值?false?,分頁插件會從查詢方法的參數值中,自動根據上面 ?params? 配置的字段中取值,查找到合適的值時就會自動分頁。
  • ? aggregateFunctions?:默認為所有常見數據庫的聚合函數,允許手動添加聚合函數(影響行數),所有以聚合函數開頭的函數,在進行 ?count? 轉換時,會套一層。其他函數和列會被替換為 ?count(0)?,其中?count?列可以自己配置。  

當然在這些方法參數中,當 ?offsetAsPageNum=false? 的時候,由于代碼中 ?PageNum ?的問題 ?RowBound ?在查詢的時候 ?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異常");

}

這就是有關于在service層的代碼,那么對于dao層的話,接口繼承的是?PagingAndSortingRepository?接口,所以我們注意要加?@Repository?注解。


總結:

以上就是有關于在java中“怎么實現分頁功能?”這個問題的相關內容當然如果你有更好的方法和見解也可以和大家一起分享,更多有關于在java這方面的相關內容我們都可以在W3Cschool中進行學習和了解。


1 人點贊