国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解

這篇具有很好參考價值的文章主要介紹了【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、前言

無論是自我學(xué)習(xí)中,還是在工作中,固然會遇到與前端搭配實現(xiàn)分頁的功能,發(fā)現(xiàn)有幾種方式,特此記錄一下。

二、實現(xiàn)方式

2.1、分頁功能直接交給前端實現(xiàn)

這種情況也是有的,(根據(jù)業(yè)務(wù)場景且僅僅只能用于數(shù)據(jù)量少的情況)。即后端不做任何數(shù)據(jù)的限制,直接把全部數(shù)據(jù)返回給前端,前端通過組件實現(xiàn)分頁,篩選等功能。請不要輕視該方式,好處即只需要前后端交互一次。

2.2、數(shù)據(jù)庫SQL的限制條件

即給搜索語句加上條件,限制查詢出來的數(shù)據(jù)個數(shù)。(這里不同數(shù)據(jù)庫可能sql語句寫法不一樣)

  • mysql數(shù)據(jù)庫是使用 limit n,m 從第n個開始,往后取m個(注 不包括第n個數(shù)據(jù))
  • oracle數(shù)據(jù)庫是使用 OFFSET n ROWS FETCH NEXT m ROWS ONLY 從第n行開始,往后取m行(注 不包括第n行數(shù)據(jù))

oracle的可以查看這篇文章:oracle中將數(shù)據(jù)進(jìn)行排序之后,獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)

2.3、使用List集合的截取功能實現(xiàn)?

即將數(shù)據(jù)都查到內(nèi)存中List集合,在內(nèi)存中找到要的數(shù)據(jù)。當(dāng)然有人說這種方式還不如第二點,但請具體情況具體分析,有可能需求要的數(shù)據(jù),是從數(shù)據(jù)庫中查詢不到的需要將原始數(shù)據(jù)查到內(nèi)存加工處理數(shù)據(jù)之后得到,才能進(jìn)行分頁處理。(同理,該方法,只能根據(jù)需求數(shù)據(jù)量少的情況)。

2.4、插件PageHelper

使用優(yōu)秀的插件PageHelper,真的很不錯。

如果想詳細(xì)了解PageHelper插件的,可以訪問:如何使用分頁插件

2.5、SpringData?

SpringData我還沒用過,這里就不展開詳細(xì)說明了,后期如果業(yè)務(wù)使用到了,會更新到這篇文章。

三、詳細(xì)介紹

分頁功能交給前端實現(xiàn)的這里就不展示了,比較我們標(biāo)題是后端實現(xiàn)分頁功能。

3.1、數(shù)據(jù)庫SQL的限制條件(limit,fetch)

sql語句

mysql寫法:
SELECT * FROM user2
LIMIT (#{pageNum} - 1) * #{pageSize}, #{pageSize}

oracle寫法:
SELECT * FROM user2
OFFSET (#{pageNum} - 1) * #{pageSize} ROWS FETCH NEXT #{pageSize} ROWS ONLY

Dao層(也可以叫Mapper層)

@Mapper
public interface PageTestDao {
	
	// 查數(shù)據(jù)
	// start:從第幾條開始,向后要數(shù)據(jù)
	// pageSize:一頁多少條數(shù)據(jù)
    List<UserEntity> getUserInfoByParams(@Param("nameParam") String name,
                                         @Param("start") int start,
                                         @Param("pageSize") int pageSize);
	// 返回總條數(shù)
    int getCountByParams(@Param("nameParam") String name);
}

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.csdn2.page_test.dao.PageTestDao">

    <sql id="nameCondition">
        <where>
            <if test="nameParam != null and nameParam != ''">
                name like CONCAT('%', #{nameParam}, '%')
            </if>
        </where>
    </sql>

    <select id="getUserInfoByParams" resultType="com.example.csdn2.page_test.entity.UserEntity">
        SELECT * FROM user2
        <include refid="nameCondition" />
        LIMIT #{start}, #{pageSize}
    </select>

    <select id="getCountByParams" resultType="int">
        SELECT COUNT(*) FROM user2
        <include refid="nameCondition" />
    </select>
</mapper>

Service實現(xiàn)層

@Service
@RequiredArgsConstructor
public class PageTestService {

    private final PageTestDao pageTestDao;

    public PageResponse<UserEntity> getPageTest(UserRequest userRequest) {
        final List<UserEntity> userEntityList = pageTestDao.getUserInfoByParams(userRequest.getNameParam(),
                userRequest.getStart(), userRequest.getPageSize());

        final int total = pageTestDao.getCountByParams(userRequest.getNameParam());

        return new PageResponse<>(userEntityList, total);
    }
}

PageRequest

// 若分頁的需求很多,可把分頁相關(guān)的參數(shù)抽出來
@Data
public class PageRequest {

    // 第幾頁
    private int pageNum;

    // 每頁幾行數(shù)據(jù)
    private int pageSize;

	// 計算從第幾行開始
	// 無論是limit、還是fetch 都是從某一行數(shù)據(jù)開始,向后取 pageSize 條數(shù)據(jù)
    public int getStart() {
        if (pageNum <= 0) {
            return 0;
        }
        return (pageNum - 1) * pageSize;
    }
}

UserRequest

// 入?yún)?@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRequest extends PageRequest {

    // 搜索參數(shù)
    private String nameParam;
}

PageResponse

我這邊只返回給前端查詢的某頁數(shù)據(jù)、和一共多少條數(shù)據(jù),如果前端需要知道可以分多少頁,需要前端自己計算一下,當(dāng)然后端其實也可以計算,只需要添加一個參數(shù)和一個方法。

// 返回實體類,因為分頁需要返回總條數(shù),前端好做下標(biāo)第幾頁
@Data
@AllArgsConstructor
public class PageResponse<T> {

    private List<T> data;

	// 總條數(shù)
    private int total;
}

Controller層

@RestController
@RequestMapping("/pageTest")
public class PageTestController {

    private final PageTestService pageTestService;

    @PostMapping("/page-test")
    public PageResponse<UserEntity> getPageTest(@RequestBody UserRequest userRequest){
       return pageTestService.getPageTest(userRequest);
    }
}

運行結(jié)果

【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解,Java干貨,Java分頁,PageHelper

3.2、使用List集合的截取功能(subList())實現(xiàn)

先看一下List的截取

// 從第幾個下標(biāo),到第幾個下標(biāo)
List<E> subList(int fromIndex, int toIndex);
    public void test_ListSub() {
    	// 創(chuàng)建模擬數(shù)據(jù),字符串 0-9的集合
        final List<String> list = IntStream.range(0, 10)
                .mapToObj(i -> i + "")
                .collect(Collectors.toList());
        System.out.println(list);
        // 截取從下標(biāo)0到5的數(shù)據(jù)
        System.out.println(list.subList(0, 5));
        // 截取從下標(biāo)3到5的數(shù)據(jù)
        System.out.println(list.subList(3, 5));
    }

【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解,Java干貨,Java分頁,PageHelper

回歸上述分頁例子,代碼改成如下:

dao層 不加 limit 條件

  SELECT * FROM user2
  name like CONCAT('%', #{nameParam}, '%')

server層

public PageResponse<UserEntity> getPageTestByListSub(UserRequest userRequest) {
        final List<UserEntity> allData = pageTestDao.getUserInfoByParamsNoLimit(userRequest.getNameParam());
        // 下標(biāo)開始
        final int start = userRequest.getStart();
        // 下標(biāo)結(jié)束
        final int end = start + userRequest.getPageSize();
        // 截取數(shù)據(jù)
        final List<UserEntity> userEntityList = allData.subList(start, end);

        final int total = pageTestDao.getCountByParams(userRequest.getNameParam());
        return new PageResponse<>(userEntityList, total);
    }

3.3、插件PageHelper

這是一個特別好用的分頁插件。

其實PageHelper官網(wǎng)中有詳細(xì)的文檔以及例子:https://pagehelper.github.io/docs/howtouse/

下面例子只是講其與springboot結(jié)合的核心內(nèi)容,即快速開發(fā)

引入相關(guān)jar包坐標(biāo)到pom.xml中

<dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.3.0</version>
</dependency>

配置項目application.yml文件

#bybatis分頁插件配置
pagehelper:
  helper-dialect: mysql  #數(shù)據(jù)庫
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

3.3.1、案例1?

前端所需要的數(shù)據(jù)就是數(shù)據(jù)庫中表的數(shù)據(jù)

dao層的sql不需要加 Limit 條件(因為PageHelper會自動幫忙加的)

  SELECT * FROM user2
  name like CONCAT('%', #{nameParam}, '%')

service層修改如下

   public PageInfo<UserEntity> getPageTest(UserRequest userRequest) {
        // 告訴PageHelper數(shù)據(jù)要從第幾頁,每頁多少條數(shù)據(jù)
        // 注:一定要在select查詢語句之前使用該方法,否則無效
        PageHelper.startPage(userRequest.getPageNum(), userRequest.getPageSize());
        
        // 查詢sql
        final List<UserEntity> userEntityList = 
pageTestDao.getUserInfoByParamsNotLimit(userRequest.getNameParam());

        // 返回dto,使用插件自帶的PageInfo
        return new PageInfo<>(userEntityList);

		// 上述邏輯還可以簡寫為:
		// return PageHelper.startPage(userRequest.getPageNum(), userRequest.getPageSize())
            // .doSelectPageInfo(() -> 
pageTestDao.getUserInfoByParamsNotLimit(userRequest.getNameParam()));
    }


結(jié)果如下(與之前查詢結(jié)果一致,沒問題)

{
    "total": 9,
    "list": [
        {
            "name": "4a",
            "pwd": "D"
        },
        {
            "name": "5a",
            "pwd": "E"
        },
        {
            "name": "6a",
            "pwd": "F"
        }
    ],
    "pageNum": 2,
    "pageSize": 3,
    "size": 3,
    "startRow": 4,
    "endRow": 6,
    "pages": 3,
    "prePage": 1,
    "nextPage": 3,
    "isFirstPage": false,
    "isLastPage": false,
    "hasPreviousPage": true,
    "hasNextPage": true,
    "navigatePages": 8,
    "navigatepageNums": [
        1,
        2,
        3
    ],
    "navigateFirstPage": 1,
    "navigateLastPage": 3
}

3.3.2、案例2

前端所需要的數(shù)據(jù)不只是數(shù)據(jù)庫中表的數(shù)據(jù),還有一些需要Java代碼邏輯計算得到的數(shù)據(jù)。那么上面的PageHelper.startPage(userRequest.getPageNum(), userRequest.getPageSize());就失效了。

 public PageInfo<UserEntityResp> getPageTest(UserRequest userRequest) {
        //分頁類的創(chuàng)建
        PageInfo<UserEntityResp> res = new PageInfo<>();
        
        // 查詢sql
        List<UserEntity> userEntityList = 
pageTestDao.getUserInfoByParamsNotLimit(userRequest.getNameParam());

        //對userEntityList中的數(shù)據(jù)進(jìn)行了一些算法操作,改變了原來從數(shù)據(jù)庫中查詢到的數(shù)據(jù)
        //或者以什么排序等等操作,最終得到result
        List<UserEntityResp> result = .....   ;              

        int total = result.size();

        //注意:這里的start,end是需要通過userRequest.getPageNum(), userRequest.getPageSize()
        //計算得到的
        Double index = (Double)Math.ceil(total * 1.0 / userRequest.getPageSize());
        
        if (index.intValue()>=userRequest.getPage()){
            start = (userRequest.getPage() - 1) * userRequest.getPageSize();
            end = Math.min(start + userRequest.getPageSize(), total);
        } else{
            start = 0;
            end = total;
        }
        
		List<InterfaceConfirmTimeResp> pageList = result.subList(start, end);

        //將分頁相關(guān)對象的屬性設(shè)置
        res.setList(pageList);
        res.setTotal(result.size());
        res.setPageNum(userRequest.getPage());
        res.setPageSize(userRequest.getPageSize());
        res.setPages((int)Math.ceil(result.size()*1.0/userRequest.getPageSize()));
        return res;
    }

這是通過PageHelp插件中的PageInfo類和List中的subList()方法實現(xiàn)的,其實一般這種情況用的也是比較多的。

3.3.3、為什么PageHelp插件優(yōu)秀

為什么說該插件很優(yōu)秀呢查看PageInfo的返回參數(shù),核心內(nèi)容:

	// 當(dāng)前頁
    private int pageNum;
    // 每頁的數(shù)量
    private int pageSize;
    // 當(dāng)前頁的數(shù)量
    private int size;

    // 總記錄數(shù)
    private long total;
    // 總頁數(shù)
    private int pages;
    // 結(jié)果集
    private List<T> list;
 
 	// 以下內(nèi)容都是其自動幫生成的
 	// 對于前端來說極其友好,前端分頁功能的全部參數(shù)都包含了
    // 前一頁的頁碼
    private int prePage;
    // 下一頁的頁碼
    private int nextPage;
    // 是否為第一頁
    private boolean isFirstPage = false;
    // 是否為最后一頁
    private boolean isLastPage = false;
    // 是否有前一頁
    private boolean hasPreviousPage = false;
    // 是否有下一頁
    private boolean hasNextPage = false;
    // 導(dǎo)航條上的第一頁的頁碼
    private int navigateFirstPage;
    // 導(dǎo)航條上的第一頁的頁碼
    private int navigateLastPage;

查看PageHelper執(zhí)行了什么sql語句

【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解,Java干貨,Java分頁,PageHelper

3.3.4、spring結(jié)合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ù),默認(rèn)值false,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配
                     置的字段中取值,查找到合適的值時就會自動分頁。-->
                            supportMethodsArguments=true
                    <!--默認(rèn)值為 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>

以上就是Java實現(xiàn)分頁的幾種方式,希望對你有所幫助,如果有其它方式可以在評論區(qū)留言?。?!

參考文章:java中實現(xiàn)分頁的常見幾種方式_java 分頁-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-783819.html

到了這里,關(guān)于【Java 干貨教程】Java實現(xiàn)分頁的幾種方式詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBoot實現(xiàn)分頁的三種方式

    一 自己封裝Page對象實現(xiàn) 博客鏈接 二 使用sql實現(xiàn)分頁 2.1 場景分析 前段傳遞給給后臺什么參數(shù)? 當(dāng)前頁碼 currentPage 每頁顯示條數(shù) pageSize 后臺給前端返回什么數(shù)據(jù)? 當(dāng)前頁數(shù)據(jù) List 總記錄數(shù) totalCount 2.2 前段代碼 2.3 后端代碼 PageBean mapper service impl controller 三 使用PageHelper插件

    2024年02月10日
    瀏覽(28)
  • Java實現(xiàn)異步的幾種方式

    Java實現(xiàn)異步的幾種方式

    普通線程實現(xiàn)異步,但頻繁創(chuàng)建、銷毀線程比較耗資源,所以一般交給線程池執(zhí)行 結(jié)果: Future異步 和普通線程實現(xiàn)異步區(qū)別不大,只是使用Future是要獲取執(zhí)行后的返回值 結(jié)果: Spring的@Async異步 使用@Async注解實現(xiàn)異步的前提是需要在啟動類上標(biāo)注@EnableAsync來開啟異步配置

    2024年02月04日
    瀏覽(38)
  • java 實現(xiàn)開啟異步線程的幾種方式

    在Java中,有多種方式可以實現(xiàn)異步線程以避免在主線程中執(zhí)行耗時操作導(dǎo)致界面卡頓的問題。以下是幾種常用的方式: 使用 Thread 類:可以使用 Thread 類來創(chuàng)建一個新的線程,并在其 run() 方法中執(zhí)行耗時操作。例如: 使用 Runnable 接口:可以通過實現(xiàn) Runnable 接口并在其中實現(xiàn)

    2024年02月14日
    瀏覽(25)
  • Java如何實現(xiàn)下載文件的幾種方式

    版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/Boy_Martin/article/details/126058565

    2024年02月13日
    瀏覽(30)
  • Java生成二維碼的幾種實現(xiàn)方式

    本文將基于Spring Boot介紹兩種生成二維碼的實現(xiàn)方式,一種是基于Google開發(fā)工具包,另一種是基于Hutool來實現(xiàn); 下面我們將基于Spring Boot,并采用兩種方式實現(xiàn)二維碼的生成,對于每一種方式還提供兩種類型的二維碼返回形式,即:物理文件 和 圖片響應(yīng)流 一、基于Google開發(fā)

    2024年02月17日
    瀏覽(19)
  • Java實現(xiàn)字符串排序的幾種方式

    創(chuàng)建實體類(此處引入了lombok) 一、使用List集合中自帶的sort方法(字符串的位數(shù)保持一致,不一致的情況可以在左邊補(bǔ)0,也可以使用String.format()方法補(bǔ)全) 1、在對象排序中使用 2、在字符串排序中使用 二、使用Stream流(字符串的位數(shù)保持一致,不一致的情況可以在左邊補(bǔ)

    2024年02月11日
    瀏覽(19)
  • java實現(xiàn)調(diào)用http請求的幾種常見方式

    java實現(xiàn)調(diào)用http請求的幾種常見方式

    ------ Oracle中文開發(fā)者社區(qū) ------ 如果你想要學(xué)習(xí)編程,關(guān)注本博客,持續(xù)獲得技術(shù)支持,持續(xù)獲得技術(shù)咨詢 java開發(fā)·企業(yè)官方賬號 Oracle中國官方賬號 Java中國管理部 全網(wǎng)粉絲30萬+ 華為云享專家 阿里專家博主 CSDN內(nèi)容合伙人 CSDN原力計劃作者 51CTO專家博主 CSDN博客V賬號 畢業(yè)于四川

    2024年02月04日
    瀏覽(21)
  • JAVA微服務(wù)分布式事務(wù)的幾種實現(xiàn)方式

    JAVA微服務(wù)分布式事務(wù)的幾種實現(xiàn)方式

    一致性(Consistency) :在分布式系統(tǒng)中所有的數(shù)據(jù)備份,在同一時刻都保持一致狀態(tài),如無法保證狀態(tài)一致,直接返回錯誤; 可用性(Availability):在集群中一部分節(jié)點故障,也能保證客戶端訪問系統(tǒng)并得到正確響應(yīng),允許一定時間內(nèi)數(shù)據(jù)狀態(tài)不一致; 分區(qū)容錯性(Partiti

    2024年02月12日
    瀏覽(20)
  • Java實現(xiàn)HTTP請求的幾種方式-CloseableHttpClient(三)

    Java實現(xiàn)HTTP請求的幾種方式-CloseableHttpClient(三)

    CloseableHttpClient是在HttpClient的基礎(chǔ)上修改更新而來的,這里還涉及到請求頭token的設(shè)置(請求驗證),利用fastjson轉(zhuǎn)換請求或返回結(jié)果字符串為json格式,當(dāng)然上面兩種方式也是可以設(shè)置請求頭token、json的,這里只在下面說明。 基于第一章的測試接口,建立以下程序 創(chuàng)建客戶端

    2023年04月20日
    瀏覽(100)
  • Java實現(xiàn)HTTP請求的幾種方式-HttpURLConnection(一)

    在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適。很多項目都會封裝規(guī)定好本身項目的接口規(guī)范,所以大多數(shù)需要去調(diào)用對方提供的接口或第三方接口(短信、天氣等)。 準(zhǔn)備兩個項目: 項目A: 服務(wù)提供者 項目B:服務(wù)消費者 在項目A中

    2024年02月16日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包