最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 前言

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

2. 先說結(jié)論

  1. 分頁功能直接交給前端實(shí)現(xiàn)(根據(jù)業(yè)務(wù)場(chǎng)景且僅僅只能用于數(shù)據(jù)量少的情況)。即后端不做任何數(shù)據(jù)的限制,直接把全部數(shù)據(jù)返回給前端,前端通過組件實(shí)現(xiàn)分頁,篩選等功能。請(qǐng)不要輕視該方式,好處即只需要前后端交互一次。
  2. 使用數(shù)據(jù)庫SQL的限制條件,即給搜索語句加上條件,限制查詢出來的數(shù)據(jù)個(gè)數(shù):
    1. mysql數(shù)據(jù)庫是使用 limit n,m 從第n個(gè)開始,往后取m個(gè)(注 不包括第n個(gè)數(shù)據(jù))
    2. oracle數(shù)據(jù)庫是使用 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)然有人說這種方式還不如第二點(diǎn),但請(qǐng)具體情況具體分析,有可能需求要的數(shù)據(jù),是從數(shù)據(jù)庫中查詢不到的,需要將原始數(shù)據(jù)查到內(nèi)存加工處理數(shù)據(jù)之后得到,才能進(jìn)行分頁處理。(同理,該方法,只能根據(jù)需求且數(shù)據(jù)量少的情況)
  4. 使用優(yōu)秀的插件PageHelper,真的很不錯(cuò)。

3. 例子

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

先說結(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:一頁多少條數(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);
    }
}
// 若分頁的需求很多,可把分頁相關(guān)的參數(shù)抽出來
@Data
public class PageRequest {

    // 第幾頁
    private int pageNum;

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

	// 計(jì)算從第幾行開始
	// 無論是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)榉猪撔枰祷乜倵l數(shù),前端好做下標(biāo)第幾頁
@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.回歸上述分頁例子,代碼改成如下:

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ù)要從第幾頁,每頁多少條數(shù)據(jù)
        // 注:一定要在select查詢語句之前使用該方法,否則無效
        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.為什么說該插件很優(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)容都是其自動(dòng)幫生成的
 	// 對(duì)于前端來說極其友好,前端分頁功能的全部參數(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;

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

總結(jié) 

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

相關(guān)文章

  • spring事務(wù)的propagation傳播屬性示例詳解

    spring事務(wù)的propagation傳播屬性示例詳解

    這篇文章主要為大家介紹了spring事務(wù)的propagation傳播屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • java性能優(yōu)化之代碼緩存優(yōu)化

    java性能優(yōu)化之代碼緩存優(yōu)化

    這篇文章主要介紹了java性能優(yōu)化之代碼緩存優(yōu)化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 如何利用Map與函數(shù)式接口來實(shí)現(xiàn)去除if else

    如何利用Map與函數(shù)式接口來實(shí)現(xiàn)去除if else

    這篇文章主要介紹了如何利用Map與函數(shù)式接口來實(shí)現(xiàn)去除if else問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java泛型枚舉Annotation接口詳細(xì)解讀與Eclipse發(fā)展

    Java泛型枚舉Annotation接口詳細(xì)解讀與Eclipse發(fā)展

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關(guān)系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內(nèi)部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關(guān)于Java11中基于嵌套關(guān)系的訪問控制優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Eclipse遠(yuǎn)程debug的步驟與注意事項(xiàng)

    Eclipse遠(yuǎn)程debug的步驟與注意事項(xiàng)

    今天小編就為大家分享一篇關(guān)于Eclipse遠(yuǎn)程debug的步驟與注意事項(xiàng),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java快速掌握Vector類方法

    Java快速掌握Vector類方法

    Vector?類實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)數(shù)組。和?ArrayList?很相似,但是兩者是不同的:Vector?是同步訪問的;Vector?包含了許多傳統(tǒng)的方法,這些方法不屬于集合框架
    2022-03-03
  • SpringData實(shí)現(xiàn)自定義Redis緩存的序列化機(jī)制和過期策略

    SpringData實(shí)現(xiàn)自定義Redis緩存的序列化機(jī)制和過期策略

    Spring Data Redis緩存通過提供靈活的配置選項(xiàng),使開發(fā)者能夠根據(jù)業(yè)務(wù)需求自定義序列化方式和過期策略,下面就來具體介紹一下,感興趣的可以了解一下
    2025-04-04
  • 詳解Java Ajax jsonp 跨域請(qǐng)求

    詳解Java Ajax jsonp 跨域請(qǐng)求

    本篇文章主要介紹了詳解Java Ajax jsonp 跨域請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Mybatis邏輯分頁與物理分頁P(yáng)ageHelper使用解析

    Mybatis邏輯分頁與物理分頁P(yáng)ageHelper使用解析

    這篇文章主要為大家介紹了Mybatis邏輯分頁與物理分頁P(yáng)ageHelper使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

恩施市| 广灵县| 信丰县| 海晏县| 酉阳| 巴南区| 平武县| 白朗县| 富民县| 永昌县| 淮北市| 建宁县| 张家口市| 临泉县| 长治县| 乃东县| 陆丰市| 邻水| 连云港市| 铜陵市| 伊通| 宁南县| 普定县| 诏安县| 萨嘎县| 资讯 | 东兴市| 神池县| 丰县| 临朐县| 隆安县| 中卫市| 武宁县| 内乡县| 新乡县| 平江县| 稷山县| 拉孜县| 光山县| 阳谷县| 包头市|