SpringBoot中分頁(yè)插件PageHelper的使用詳解
1.分頁(yè)概念
用戶查詢的數(shù)據(jù)不可能一次性全部展示給用戶(如果用戶有一萬(wàn)條數(shù)據(jù)呢),而是分頁(yè)展示給用戶,這就是分頁(yè)查詢。
2.原生寫(xiě)法
步驟:
controller層:
- 接受請(qǐng)求,請(qǐng)求數(shù)據(jù)=頁(yè)碼+每頁(yè)數(shù)量+查詢條件(非必須)
- 調(diào)用業(yè)務(wù)層完成分頁(yè)查詢
- 將結(jié)果響應(yīng)給前端
service層:
- 換算起始查詢的行號(hào)(就是用戶點(diǎn)擊的第幾頁(yè),該頁(yè)的第一條是數(shù)據(jù)的第幾行)
- 調(diào)用數(shù)據(jù)層完成分頁(yè)查詢
- 調(diào)用數(shù)據(jù)層完成數(shù)量的查詢
- 封裝結(jié)果(數(shù)據(jù)+數(shù)量)【創(chuàng)建一個(gè)對(duì)象接受】
- 返回給controller層
mapper層:
- 動(dòng)態(tài)SQL拼接帶條件的分頁(yè)查詢數(shù)據(jù)(數(shù)據(jù))
- 動(dòng)態(tài)查詢符合條件的數(shù)據(jù)總數(shù)(數(shù)量)
為啥要封裝一個(gè)對(duì)象接受呢?
客戶端需要兩條數(shù)據(jù),一個(gè)是分頁(yè)查詢的數(shù)據(jù),還有一個(gè)是分頁(yè)查詢的總條數(shù),但是返回值只能返回一個(gè),因此要封裝在一個(gè)對(duì)象中,代碼如下。
package com.its.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class PageResult { private Object data; private Long total; }
案例測(cè)試
需求:將所有的房間分頁(yè)查詢出來(lái)展示。
controller層方法
package com.its.controller; import com.its.domain.PageResult; import com.its.domain.Result; import com.its.domain.Room; import com.its.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @PostMapping("/selectAllRoom") public Result selectAllRoom(Room room, Integer pageNo, Integer pageSize){ // 1.接受請(qǐng)求,請(qǐng)求數(shù)據(jù)為 頁(yè)碼數(shù)+每頁(yè)的數(shù)量+查詢的條件 return testService.selectAllRoom(room,pageNo,pageSize); } }
service層代碼
package com.its.mapper; import com.its.domain.PageResult; import com.its.domain.Room; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface TestMapper { // 原生分頁(yè)查詢 List<Room> selectAllRoom(@Param("room") Room room, @Param("pageStart") Integer pageStart, @Param("pageSize") Integer pageSize); int selectTotal(@Param("room") Room room); }
mapper
package com.its.mapper; import com.its.domain.PageResult; import com.its.domain.Room; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface TestMapper { // 原生分頁(yè)查詢 List<Room> selectAllRoom(@Param("room") Room room, @Param("pageStart") Integer pageStart, @Param("pageSize") Integer pageSize); int selectTotal(@Param("room") Room room); }
xml映射SQL文件
<?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.its.mapper.TestMapper"> //分頁(yè)查詢符合條件的數(shù)據(jù) <select id="selectAllRoom" resultType="com.its.domain.Room"> select * from room <where> <if test="room.info!=null and room.info!=''"> info like concat('%',#{room.info},'%') </if> </where> limit #{pageStart},#{pageSize} </select> //查詢總數(shù)量 <select id="selectTotal" resultType="java.lang.Integer"> select count(1) from room <where> <if test="room.info!=null and room.info!=''"> info like concat('%',#{room.info},'%') </if> </where> </select> </mapper>
在postMan中測(cè)試得到如下結(jié)果,分頁(yè)查詢完成
3.PageHelper插件分頁(yè)查詢
3.1 介紹
步驟:
controller層(不變):
- 接受請(qǐng)求,請(qǐng)求數(shù)據(jù)=頁(yè)碼+每頁(yè)數(shù)量+查詢條件(非必須)
- 調(diào)用業(yè)務(wù)層完成分頁(yè)查詢
- 將結(jié)果響應(yīng)給前端
service層:
- 調(diào)用PageHelper中的 startPage(參數(shù)頁(yè)碼,每頁(yè)數(shù)量) 方法,然后返回一個(gè)Page對(duì)象。
- 調(diào)用數(shù)據(jù)層完成分頁(yè)查詢
- 直接用Page對(duì)象中的方法封裝結(jié)果(數(shù)據(jù)+數(shù)量)
- 返回給controller層
mapper層:
直接動(dòng)態(tài)SQL拼接帶查詢條件的查詢(SQL語(yǔ)句中不用使用limit)
【原理介紹】
- 會(huì)給查詢的SQL語(yǔ)句進(jìn)行語(yǔ)句拼接,添加limit,并賦值分頁(yè)條件
- 會(huì)動(dòng)態(tài)生成查詢數(shù)量的SQL語(yǔ)句并執(zhí)行。
- 會(huì)將分頁(yè)相關(guān)的所有結(jié)果(分頁(yè)數(shù)量+數(shù)量+頁(yè)碼數(shù)+起始查詢行號(hào)+每頁(yè)的數(shù)量等)封裝到一個(gè)Page對(duì)象中。
Page中方法介紹:
3.2 使用
代碼書(shū)寫(xiě),還是以上面為例。
(1)導(dǎo)入PageHelper所需依賴(lài)
<!--分頁(yè)插件依賴(lài)--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency>
(2)controller層
package com.its.controller; import com.its.domain.PageResult; import com.its.domain.Result; import com.its.domain.Room; import com.its.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Autowired TestService testService; @PostMapping("/selectAll") //參數(shù)為查詢條件,頁(yè)數(shù),每頁(yè)的展示數(shù) public PageResult selectAll(Room room,Integer pageNo,Integer pageSize){ PageResult pageResult = testService.selectAll(room, pageNo, pageSize); return pageResult; } }
(3)service層
package com.its.service.Impl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.its.domain.PageResult; import com.its.domain.Result; import com.its.domain.Room; import com.its.mapper.TestMapper; import com.its.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class TestServiceImpl implements TestService { @Autowired TestMapper testMapper; @Override public PageResult selectAll(Room room, Integer pageNo, Integer pageSize) { // 開(kāi)啟分頁(yè)查詢,當(dāng)執(zhí)行查詢時(shí),插件進(jìn)行相關(guān)的sql攔截進(jìn)行分頁(yè)操作,返回一個(gè)page對(duì)象 Page<Room> page = PageHelper.startPage(pageNo, pageSize); // 調(diào)用mapper層完成查詢 testMapper.selectAll(room); // 封裝結(jié)果 PageResult pageResult = new PageResult(page.getResult(), page.getEndRow()); System.out.println(pageResult); System.out.println(page); return pageResult; } }
(4)mapper層
package com.its.mapper; import com.its.domain.PageResult; import com.its.domain.Room; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface TestMapper { // 使用分頁(yè)插件分頁(yè)查詢 List<Room> selectAll(@Param("room") Room room); }
(5)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.its.mapper.TestMapper"> <select id="selectAll" resultType="com.its.domain.Room"> select * from room </select> </mapper>
(6)測(cè)試結(jié)果:
3.3 Page對(duì)象和PageInf對(duì)象
在 PageHelper 中,Page 和 PageInfo 都是用來(lái)處理分頁(yè)數(shù)據(jù)的重要類(lèi)。
Page對(duì)象
Page 是一個(gè)接口,它包含分頁(yè)數(shù)據(jù)以及一些基本的分頁(yè)信息(如總記錄數(shù)、當(dāng)前頁(yè)等)。當(dāng)使用 PageHelper 進(jìn)行分頁(yè)查詢時(shí),查詢結(jié)果會(huì)被自動(dòng)封裝到一個(gè)實(shí)現(xiàn)了 Page 接口的對(duì)象中。
PageInfo對(duì)象
PageInfo 是 PageHelper 提供的一個(gè)類(lèi),用于封裝更詳細(xì)的分頁(yè)信息。它不僅包含了分頁(yè)數(shù)據(jù),還提供了更多的輔助信息,如是否為第一頁(yè)、最后一頁(yè)、導(dǎo)航頁(yè)碼等。
使用PageInfo進(jìn)行上面的替換,業(yè)務(wù)層代碼為
到此這篇關(guān)于SpringBoot中分頁(yè)插件(PageHelper)的使用的文章就介紹到這了,更多相關(guān)SpringBoot分頁(yè)插件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot 2 快速整合 Filter過(guò)程解析
這篇文章主要介紹了SpringBoot 2 快速整合 Filter過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Java讀取resources中資源文件路徑以及jar中文件無(wú)法讀取的解決
這篇文章主要介紹了Java讀取resources中資源文件路徑以及jar中文件無(wú)法讀取的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式
這篇文章主要介紹了詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式的相關(guān)資料,需要的朋友可以參考下2017-06-06Spring如何替換掉默認(rèn)common-logging.jar
這篇文章主要介紹了Spring如何替換掉默認(rèn)common-logging.jar,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析
這篇文章主要介紹了HashMap底層數(shù)據(jù)結(jié)構(gòu)詳細(xì)解析,HashMap作為開(kāi)發(fā)中常用的數(shù)據(jù)結(jié)構(gòu),也是面試中經(jīng)常被問(wèn)的知識(shí)點(diǎn),因此作為開(kāi)發(fā)者應(yīng)該盡可能多的理解其底層的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2023-11-11flutter?TabBarView?動(dòng)態(tài)添加刪除頁(yè)面的示例代碼
在Flutter中使用TabBarView動(dòng)態(tài)添加和刪除頁(yè)面時(shí),如果未為每個(gè)頁(yè)面設(shè)置唯一的key,會(huì)導(dǎo)致刪除頁(yè)面時(shí)出現(xiàn)狀態(tài)錯(cuò)誤或刪除錯(cuò)誤的頁(yè)面,正確的做法是為每個(gè)頁(yè)面指定全局唯一的key,這樣可以確保頁(yè)面在添加和刪除時(shí)狀態(tài)正確,感興趣的朋友跟隨小編一起看看吧2024-11-11java編程數(shù)據(jù)類(lèi)型全面詳解教程新手必入
這篇文章主要為大家介紹了java編程數(shù)據(jù)類(lèi)型全面詳解教程,強(qiáng)烈推薦新手入,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10SpringBoot實(shí)現(xiàn)文件壓縮處理詳解
在工作我們經(jīng)常會(huì)出現(xiàn)有多個(gè)文件,為了節(jié)省資源會(huì)將多個(gè)文件放在一起進(jìn)行壓縮處理,本文將使用SpringBoot實(shí)現(xiàn)文件壓縮處理,感興趣的可以了解下2024-11-11