亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中實(shí)現(xiàn)分頁(yè)的幾種常見方式總結(jié)

 更新時(shí)間:2022年12月21日 11:39:23   作者:搏·夢(mèng)  
在項(xiàng)目中經(jīng)常會(huì)查詢大量數(shù)據(jù),這就要用到分頁(yè)展示,下面這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)分頁(yè)的幾種常見方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. 前言

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

2. 先說(shuō)結(jié)論

  1. 分頁(yè)功能直接交給前端實(shí)現(xiàn)(根據(jù)業(yè)務(wù)場(chǎng)景且僅僅只能用于數(shù)據(jù)量少的情況)。即后端不做任何數(shù)據(jù)的限制,直接把全部數(shù)據(jù)返回給前端,前端通過組件實(shí)現(xiàn)分頁(yè),篩選等功能。請(qǐng)不要輕視該方式,好處即只需要前后端交互一次。
  2. 使用數(shù)據(jù)庫(kù)SQL的限制條件,即給搜索語(yǔ)句加上條件,限制查詢出來(lái)的數(shù)據(jù)個(gè)數(shù):
    1. mysql數(shù)據(jù)庫(kù)是使用 limit n,m 從第n個(gè)開始,往后取m個(gè)(注 不包括第n個(gè)數(shù)據(jù))
    2. oracle數(shù)據(jù)庫(kù)是使用 OFFSET n ROWS FETCH NEXT m ROWS ONLY 從第n行開始,往后取m行(注 不包括第n行數(shù)據(jù))
    3. oracle的可以查看這篇文章:oracle中將數(shù)據(jù)進(jìn)行排序之后,獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)
  3. 使用List集合的截取功能實(shí)現(xiàn),即將數(shù)據(jù)都查到內(nèi)存中List集合,在內(nèi)存中找到要的數(shù)據(jù)。當(dāng)然有人說(shuō)這種方式還不如第二點(diǎn),但請(qǐng)具體情況具體分析,有可能需求要的數(shù)據(jù),是從數(shù)據(jù)庫(kù)中查詢不到的,需要將原始數(shù)據(jù)查到內(nèi)存加工處理數(shù)據(jù)之后得到,才能進(jìn)行分頁(yè)處理。(同理,該方法,只能根據(jù)需求且數(shù)據(jù)量少的情況)
  4. 使用優(yōu)秀的插件PageHelper,真的很不錯(cuò)。

3. 例子

1. 數(shù)據(jù)庫(kù)SQL的限制條件(limit、fetch)

先說(shuō)結(jié)論

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

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

直接看代碼:

@Mapper
public interface PageTestDao {
	
	// 查數(shù)據(jù)
	// start:從第幾條開始,向后要數(shù)據(jù)
	// pageSize:一頁(yè)多少條數(shù)據(jù)
    List<UserEntity> getUserInfoByParams(@Param("nameParam") String name,
                                         @Param("start") int start,
                                         @Param("pageSize") int pageSize);
	// 返回總條數(shù)
    int getCountByParams(@Param("nameParam") String name);
}
<?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
@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);
    }
}
// 若分頁(yè)的需求很多,可把分頁(yè)相關(guān)的參數(shù)抽出來(lái)
@Data
public class PageRequest {

    // 第幾頁(yè)
    private int pageNum;

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

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

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

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

// 返回實(shí)體類,因?yàn)榉猪?yè)需要返回總條數(shù),前端好做下標(biāo)第幾頁(yè)
@Data
@AllArgsConstructor
public class PageResponse<T> {

    private List<T> data;

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

@RestController
@RequiredArgsConstructor
public class PageTestController {

    private final PageTestService pageTestService;

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

2. 使用List集合的截取功能實(shí)現(xiàn)

1.先看一下List的截取

// 從第幾個(gè)下標(biāo),到第幾個(gè)下標(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));
    }

2.回歸上述分頁(yè)例子,代碼改成如下:

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. 插件PageHelper

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

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

3.引入相關(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>

4.dao層的sql不需要加 Limit 條件(因?yàn)?strong>PageHelper會(huì)自動(dòng)幫忙加的)

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

5.service層修改如下:

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

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

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

6.結(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
}

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

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

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

8.查看PageHelper執(zhí)行了什么sql語(yǔ)句

總結(jié) 

到此這篇關(guān)于java中實(shí)現(xiàn)分頁(yè)的幾種常見方式的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)分頁(yè)方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot serverEndpoint導(dǎo)致@resource注解不生效

    springboot serverEndpoint導(dǎo)致@resource注解不生效

    在SpringBoot中,@Resource注解用于注入依賴,本文主要介紹了springboot serverEndpoint導(dǎo)致@resource注解不生效,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java String源碼分析并介紹Sting 為什么不可變

    Java String源碼分析并介紹Sting 為什么不可變

    這篇文章主要介紹了Java String源碼分析并介紹Sting 為什么不可變的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java 使用POI生成帶聯(lián)動(dòng)下拉框的excel表格實(shí)例代碼

    Java 使用POI生成帶聯(lián)動(dòng)下拉框的excel表格實(shí)例代碼

    本文通過實(shí)例代碼給大家分享Java 使用POI生成帶聯(lián)動(dòng)下拉框的excel表格,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • Java 改造ayui表格組件實(shí)現(xiàn)多重排序

    Java 改造ayui表格組件實(shí)現(xiàn)多重排序

    layui 的表格組件目前只支持單列排序,在實(shí)際應(yīng)用中并不能很好的支撐我們的業(yè)務(wù)需求。今天一時(shí)手癢,決定改造一番以支持多重排序。
    2021-04-04
  • 一篇文章詳解JAVA遠(yuǎn)程debug

    一篇文章詳解JAVA遠(yuǎn)程debug

    這篇文章主要給大家介紹了關(guān)于JAVA遠(yuǎn)程debug的相關(guān)資料,日常我們debug是經(jīng)常用的,但是本地還好說(shuō),遠(yuǎn)程debug就有點(diǎn)難度,需要的朋友可以參考下
    2023-08-08
  • JavaSE static final及abstract修飾符實(shí)例解析

    JavaSE static final及abstract修飾符實(shí)例解析

    這篇文章主要介紹了JavaSE static final及abstract修飾符實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java基礎(chǔ)詳解之內(nèi)存泄漏

    Java基礎(chǔ)詳解之內(nèi)存泄漏

    這篇文章主要介紹了Java基礎(chǔ)詳解之內(nèi)存泄漏,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-04-04
  • Java Optional解決空指針異常總結(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異??偨Y(jié)(java 8 功能),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring MVC 請(qǐng)求參數(shù)綁定實(shí)現(xiàn)方式

    Spring MVC 請(qǐng)求參數(shù)綁定實(shí)現(xiàn)方式

    Spring MVC 是一個(gè)用于構(gòu)建 Web 應(yīng)用程序的框架,它提供了一種方便的方式來(lái)處理 HTTP 請(qǐng)求和響應(yīng),Spring MVC 提供了多種方式來(lái)實(shí)現(xiàn)請(qǐng)求參數(shù)綁定,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧
    2023-09-09
  • 基于springboot bean的實(shí)例化過程和屬性注入過程

    基于springboot bean的實(shí)例化過程和屬性注入過程

    這篇文章主要介紹了基于springboot bean的實(shí)例化過程和屬性注入過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評(píng)論