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

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

這篇具有很好參考價(jià)值的文章主要介紹了java中實(shí)現(xiàn)分頁(yè)的常見(jiàn)幾種方式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 前言

  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ù)返回給前端,前端通過(guò)組件實(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è)開(kāi)始,往后取m個(gè)(注 不包括第n個(gè)數(shù)據(jù))
    2. oracle數(shù)據(jù)庫(kù)是使用 OFFSET n ROWS FETCH NEXT m ROWS ONLY 從第n行開(kāi)始,往后取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)

  1. 先說(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
    
  2. 直接看代碼:

    @Mapper
    public interface PageTestDao {
    	
    	// 查數(shù)據(jù)
    	// start:從第幾條開(kāi)始,向后要數(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ì)算從第幾行開(kāi)始
    	// 無(wú)論是limit、還是fetch 都是從某一行數(shù)據(jù)開(kāi)始,向后取 pageSize 條數(shù)據(jù)
        public int getStart() {
            if (pageNum <= 0) {
                return 0;
            }
            return (pageNum - 1) * pageSize;
        }
    }
    
    // 入?yún)?/span>
    @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);
        }
    }
    

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

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));
        }
    

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

  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)開(kāi)始
            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)容,即快速開(kā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é)果一致,沒(méi)問(wèn)題):

    {
        "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ǔ)句
    java中實(shí)現(xiàn)分頁(yè)的常見(jiàn)幾種方式文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-409157.html

到了這里,關(guān)于java中實(shí)現(xiàn)分頁(yè)的常見(jiàn)幾種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

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

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

    2024年02月10日
    瀏覽(28)
  • java實(shí)現(xiàn)調(diào)用http請(qǐng)求的幾種常見(jiàn)方式

    java實(shí)現(xiàn)調(diào)用http請(qǐng)求的幾種常見(jiàn)方式

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

    2024年02月04日
    瀏覽(23)
  • 【java緩存、redis緩存、guava緩存】java中實(shí)現(xiàn)緩存的幾種方式

    【java緩存、redis緩存、guava緩存】java中實(shí)現(xiàn)緩存的幾種方式

    這種方式可以簡(jiǎn)單實(shí)現(xiàn)本地緩存,但是實(shí)際開(kāi)發(fā)中不推薦使用,下面我們來(lái)實(shí)現(xiàn)一下這種方式。 首先創(chuàng)建一個(gè)管理緩存的類 這個(gè)類中有一個(gè)靜態(tài)代碼塊,靜態(tài)代碼塊會(huì)在類加載時(shí)就執(zhí)行,我們可以在這里完成對(duì)緩存的初始化,決定緩存內(nèi)一開(kāi)始就有哪些數(shù)據(jù) 另外我們還可以

    2024年02月16日
    瀏覽(15)
  • Java求質(zhì)數(shù)常見(jiàn)幾種方式

    該方法的作用是判斷一個(gè)整數(shù)是否是質(zhì)數(shù)(即只能被1和自身整除的正整數(shù))。方法接收一個(gè)整數(shù)參數(shù)num,返回一個(gè)布爾值,表示num是否為質(zhì)數(shù)。 方法的實(shí)現(xiàn)原理是使用for循環(huán)從2到num的平方根(簡(jiǎn)單思考就可以想到不需要遍歷到num-1)進(jìn)行遍歷,判斷num是否能被這個(gè)數(shù)整除。

    2024年02月15日
    瀏覽(22)
  • Java中常見(jiàn)的幾種HttpClient調(diào)用方式

    一、HttpURLConnection調(diào)用 方式一: 方式二: 缺點(diǎn):不能直接使用池化技術(shù),需要自行處理輸入輸出流 二、apache common封裝HttpClient 引入依賴 實(shí)現(xiàn) 三、CloseableHttpClient 可以使用連接池保持連接,并且過(guò)期自動(dòng)釋放。引入jar包 引入依賴 實(shí)現(xiàn) 非連接池連接: 四、OkHttp3 引入依賴 實(shí)

    2024年02月04日
    瀏覽(30)
  • Java中String類的幾種常見(jiàn)遍歷方式

    今天小小的給自己總結(jié)一下String類的幾種常見(jiàn)遍歷方式,如下。 charAt(): charAt(int index) :返回 char指定索引處的值。 toCharArray() : toCharArray() :將此字符串轉(zhuǎn)換為新的字符數(shù)組。 然后按照遍歷字符串?dāng)?shù)組的方式遍歷即可,可采用普通for循環(huán)遍歷,也可以采用增強(qiáng)for循環(huán)遍歷。 sub

    2024年02月16日
    瀏覽(29)
  • Java分頁(yè)查詢的幾種實(shí)現(xiàn)方法

    Java分頁(yè)查詢的幾種實(shí)現(xiàn)方法

    最近在做需求的過(guò)程中遇到幾個(gè)需要分頁(yè)查詢的需求,我也對(duì)分頁(yè)有了較深的了解。分頁(yè)一般分為兩種一種是直接在sql中分頁(yè),一種是在內(nèi)存中分頁(yè)。本文僅針對(duì)內(nèi)存中分頁(yè)做記錄。 第一種 ? ?如果是一個(gè)查詢接口,向接口中傳入page,和size(page默認(rèn)值1,size默認(rèn)值10)即可

    2024年02月06日
    瀏覽(32)
  • Linux 下通過(guò) java 命令啟動(dòng) jar 包的幾種常見(jiàn)方式

    Linux 下通過(guò) java 命令啟動(dòng) jar 包的幾種常見(jiàn)方式 一、后臺(tái)啟動(dòng)jar包命令 方法一:直接啟動(dòng) jar 包服務(wù) 方法二:后臺(tái)啟動(dòng) jar 包服務(wù) 方法三:后臺(tái)不掛斷啟動(dòng) 方式四:指定日志輸出的啟動(dòng) 方式五:指定配置文件啟動(dòng) 方式六:指定配置文件,使用系統(tǒng)默認(rèn)的log配置,不另行指定

    2024年02月13日
    瀏覽(15)
  • C# 讀取Excel的幾種常見(jiàn)方式及實(shí)現(xiàn)步驟

    目錄 1.使用 Microsoft Office Interop Excel 庫(kù) 2.使用 OLEDB 數(shù)據(jù)庫(kù)連接方式 3. 使用 EPPlus 庫(kù) 在 C# 中,我們可以使用以下幾種方式將 Excel 文件中的數(shù)據(jù)讀取到 DataTable 中: 1.使用 Microsoft Office Interop Excel 庫(kù) 這種方法需要安裝 Microsoft Office,并且性能較低。具體實(shí)現(xiàn)步驟如下: 2.使用 O

    2024年02月12日
    瀏覽(17)
  • Windows Bat實(shí)現(xiàn)延時(shí)功能的幾種常見(jiàn)方式

    Windows Bat實(shí)現(xiàn)延時(shí)功能的幾種常見(jiàn)方式

    在 bat 批處理中實(shí)現(xiàn)延時(shí)功能的幾種常用方式 使用ping命令可以實(shí)現(xiàn)延時(shí)的效果,命令如下: -n 指定 ping 的次數(shù),每次大概間隔1s, nul 將 ping 過(guò)程回顯信息給屏蔽 ping 命令實(shí)現(xiàn)的延時(shí),時(shí)間精度:大約1s,內(nèi)存占用: ping 命令所占用空間 注意閉坑:ping 從第1次發(fā)出請(qǐng)求到接收

    2024年02月11日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包