SpringBoot中分頁(yè)插件PageHelper的使用詳解
1.分頁(yè)概念
用戶(hù)查詢(xún)的數(shù)據(jù)不可能一次性全部展示給用戶(hù)(如果用戶(hù)有一萬(wàn)條數(shù)據(jù)呢),而是分頁(yè)展示給用戶(hù),這就是分頁(yè)查詢(xún)。
2.原生寫(xiě)法
步驟:
controller層:
- 接受請(qǐng)求,請(qǐng)求數(shù)據(jù)=頁(yè)碼+每頁(yè)數(shù)量+查詢(xún)條件(非必須)
- 調(diào)用業(yè)務(wù)層完成分頁(yè)查詢(xún)
- 將結(jié)果響應(yīng)給前端
service層:
- 換算起始查詢(xún)的行號(hào)(就是用戶(hù)點(diǎn)擊的第幾頁(yè),該頁(yè)的第一條是數(shù)據(jù)的第幾行)
- 調(diào)用數(shù)據(jù)層完成分頁(yè)查詢(xún)
- 調(diào)用數(shù)據(jù)層完成數(shù)量的查詢(xún)
- 封裝結(jié)果(數(shù)據(jù)+數(shù)量)【創(chuàng)建一個(gè)對(duì)象接受】
- 返回給controller層
mapper層:
- 動(dòng)態(tài)SQL拼接帶條件的分頁(yè)查詢(xún)數(shù)據(jù)(數(shù)據(jù))
- 動(dòng)態(tài)查詢(xún)符合條件的數(shù)據(jù)總數(shù)(數(shù)量)
為啥要封裝一個(gè)對(duì)象接受呢?
客戶(hù)端需要兩條數(shù)據(jù),一個(gè)是分頁(yè)查詢(xún)的數(shù)據(jù),還有一個(gè)是分頁(yè)查詢(xún)的總條數(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è)查詢(xún)出來(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ù)量+查詢(xún)的條件
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è)查詢(xún)
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è)查詢(xún)
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è)查詢(xún)符合條件的數(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>
//查詢(xún)總數(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è)查詢(xún)完成

3.PageHelper插件分頁(yè)查詢(xún)
3.1 介紹
步驟:
controller層(不變):
- 接受請(qǐng)求,請(qǐng)求數(shù)據(jù)=頁(yè)碼+每頁(yè)數(shù)量+查詢(xún)條件(非必須)
- 調(diào)用業(yè)務(wù)層完成分頁(yè)查詢(xún)
- 將結(jié)果響應(yīng)給前端
service層:
- 調(diào)用PageHelper中的 startPage(參數(shù)頁(yè)碼,每頁(yè)數(shù)量) 方法,然后返回一個(gè)Page對(duì)象。
- 調(diào)用數(shù)據(jù)層完成分頁(yè)查詢(xún)
- 直接用Page對(duì)象中的方法封裝結(jié)果(數(shù)據(jù)+數(shù)量)
- 返回給controller層
mapper層:
直接動(dòng)態(tài)SQL拼接帶查詢(xún)條件的查詢(xún)(SQL語(yǔ)句中不用使用limit)
【原理介紹】
- 會(huì)給查詢(xún)的SQL語(yǔ)句進(jìn)行語(yǔ)句拼接,添加limit,并賦值分頁(yè)條件
- 會(huì)動(dòng)態(tài)生成查詢(xún)數(shù)量的SQL語(yǔ)句并執(zhí)行。
- 會(huì)將分頁(yè)相關(guān)的所有結(jié)果(分頁(yè)數(shù)量+數(shù)量+頁(yè)碼數(shù)+起始查詢(xún)行號(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ù)為查詢(xún)條件,頁(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è)查詢(xún),當(dāng)執(zhí)行查詢(xún)時(shí),插件進(jìn)行相關(guān)的sql攔截進(jìn)行分頁(yè)操作,返回一個(gè)page對(duì)象
Page<Room> page = PageHelper.startPage(pageNo, pageSize);
// 調(diào)用mapper層完成查詢(xún)
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è)查詢(xún)
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è)查詢(xún)時(shí),查詢(xún)結(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)文章希望大家以后多多支持腳本之家!
- SpringBoot封裝實(shí)現(xiàn)分頁(yè)查詢(xún)工具
- SpringBoot+Mybatis-plus實(shí)現(xiàn)分頁(yè)查詢(xún)的示例代碼
- SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)示例
- Springboot整合mybatis-plus使用pageHelper進(jìn)行分頁(yè)(使用步驟)
- SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐
- SpringBoot3整合pageHelper實(shí)現(xiàn)分頁(yè)功能
- 從基礎(chǔ)到實(shí)戰(zhàn)詳解SpringBoot3實(shí)現(xiàn)分頁(yè)操作的完整指南
相關(guān)文章
Spring Boot集成Quartz注入Spring管理的類(lèi)的方法
本篇文章主要介紹了Spring Boot集成Quartz注入Spring管理的類(lèi)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Eclipse自定義啟動(dòng)畫(huà)面和圖標(biāo)的方法介紹
這篇文章主要介紹了Eclipse自定義啟動(dòng)畫(huà)面和圖標(biāo)的方法介紹,以及一些eclipse的快捷鍵,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化
大家好,本篇文章主要講的是關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
java后臺(tái)如何接收get請(qǐng)求傳過(guò)來(lái)的數(shù)組
這篇文章主要介紹了java后臺(tái)如何接收get請(qǐng)求傳過(guò)來(lái)的數(shù)組問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

