SpringBoot中分頁插件PageHelper的使用詳解
1.分頁概念
用戶查詢的數(shù)據(jù)不可能一次性全部展示給用戶(如果用戶有一萬條數(shù)據(jù)呢),而是分頁展示給用戶,這就是分頁查詢。
2.原生寫法
步驟:
controller層:
- 接受請求,請求數(shù)據(jù)=頁碼+每頁數(shù)量+查詢條件(非必須)
- 調用業(yè)務層完成分頁查詢
- 將結果響應給前端
service層:
- 換算起始查詢的行號(就是用戶點擊的第幾頁,該頁的第一條是數(shù)據(jù)的第幾行)
- 調用數(shù)據(jù)層完成分頁查詢
- 調用數(shù)據(jù)層完成數(shù)量的查詢
- 封裝結果(數(shù)據(jù)+數(shù)量)【創(chuàng)建一個對象接受】
- 返回給controller層
mapper層:
- 動態(tài)SQL拼接帶條件的分頁查詢數(shù)據(jù)(數(shù)據(jù))
- 動態(tài)查詢符合條件的數(shù)據(jù)總數(shù)(數(shù)量)
為啥要封裝一個對象接受呢?
客戶端需要兩條數(shù)據(jù),一個是分頁查詢的數(shù)據(jù),還有一個是分頁查詢的總條數(shù),但是返回值只能返回一個,因此要封裝在一個對象中,代碼如下。
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;
}案例測試
需求:將所有的房間分頁查詢出來展示。
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.接受請求,請求數(shù)據(jù)為 頁碼數(shù)+每頁的數(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 {
// 原生分頁查詢
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 {
// 原生分頁查詢
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">
//分頁查詢符合條件的數(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中測試得到如下結果,分頁查詢完成

3.PageHelper插件分頁查詢
3.1 介紹
步驟:
controller層(不變):
- 接受請求,請求數(shù)據(jù)=頁碼+每頁數(shù)量+查詢條件(非必須)
- 調用業(yè)務層完成分頁查詢
- 將結果響應給前端
service層:
- 調用PageHelper中的 startPage(參數(shù)頁碼,每頁數(shù)量) 方法,然后返回一個Page對象。
- 調用數(shù)據(jù)層完成分頁查詢
- 直接用Page對象中的方法封裝結果(數(shù)據(jù)+數(shù)量)
- 返回給controller層
mapper層:
直接動態(tài)SQL拼接帶查詢條件的查詢(SQL語句中不用使用limit)
【原理介紹】
- 會給查詢的SQL語句進行語句拼接,添加limit,并賦值分頁條件
- 會動態(tài)生成查詢數(shù)量的SQL語句并執(zhí)行。
- 會將分頁相關的所有結果(分頁數(shù)量+數(shù)量+頁碼數(shù)+起始查詢行號+每頁的數(shù)量等)封裝到一個Page對象中。
Page中方法介紹:

3.2 使用
代碼書寫,還是以上面為例。
(1)導入PageHelper所需依賴
<!--分頁插件依賴-->
<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ù)為查詢條件,頁數(shù),每頁的展示數(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) {
// 開啟分頁查詢,當執(zhí)行查詢時,插件進行相關的sql攔截進行分頁操作,返回一個page對象
Page<Room> page = PageHelper.startPage(pageNo, pageSize);
// 調用mapper層完成查詢
testMapper.selectAll(room);
// 封裝結果
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 {
// 使用分頁插件分頁查詢
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)測試結果:

3.3 Page對象和PageInf對象
在 PageHelper 中,Page 和 PageInfo 都是用來處理分頁數(shù)據(jù)的重要類。
Page對象
Page 是一個接口,它包含分頁數(shù)據(jù)以及一些基本的分頁信息(如總記錄數(shù)、當前頁等)。當使用 PageHelper 進行分頁查詢時,查詢結果會被自動封裝到一個實現(xiàn)了 Page 接口的對象中。

PageInfo對象
PageInfo 是 PageHelper 提供的一個類,用于封裝更詳細的分頁信息。它不僅包含了分頁數(shù)據(jù),還提供了更多的輔助信息,如是否為第一頁、最后一頁、導航頁碼等。

使用PageInfo進行上面的替換,業(yè)務層代碼為

到此這篇關于SpringBoot中分頁插件(PageHelper)的使用的文章就介紹到這了,更多相關SpringBoot分頁插件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java讀取resources中資源文件路徑以及jar中文件無法讀取的解決
這篇文章主要介紹了Java讀取resources中資源文件路徑以及jar中文件無法讀取的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
詳解Kotlin 高階函數(shù) 與 Lambda 表達式
這篇文章主要介紹了詳解Kotlin 高階函數(shù) 與 Lambda 表達式的相關資料,需要的朋友可以參考下2017-06-06
Spring如何替換掉默認common-logging.jar
這篇文章主要介紹了Spring如何替換掉默認common-logging.jar,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
flutter?TabBarView?動態(tài)添加刪除頁面的示例代碼
在Flutter中使用TabBarView動態(tài)添加和刪除頁面時,如果未為每個頁面設置唯一的key,會導致刪除頁面時出現(xiàn)狀態(tài)錯誤或刪除錯誤的頁面,正確的做法是為每個頁面指定全局唯一的key,這樣可以確保頁面在添加和刪除時狀態(tài)正確,感興趣的朋友跟隨小編一起看看吧2024-11-11

