首頁(yè)技術(shù)文章正文

分頁(yè)查詢?cè)趺磳??Mybatis分頁(yè)插件PageHelper

更新時(shí)間:2023-07-26 來(lái)源:黑馬程序員 瀏覽量:

如果數(shù)據(jù)庫(kù)中的數(shù)據(jù)有很多(假設(shè)有十幾萬(wàn)條)的時(shí)候,將數(shù)據(jù)全部展示出來(lái)肯定不現(xiàn)實(shí),這時(shí)使用分頁(yè)解決這個(gè)問題,每次只展示一頁(yè)的數(shù)據(jù),比如:一頁(yè)展示10條數(shù)據(jù),如果還想看其他的數(shù)據(jù),可以通過點(diǎn)擊頁(yè)碼進(jìn)行查詢。

分頁(yè)查詢

要想從數(shù)據(jù)庫(kù)中進(jìn)行分頁(yè)查詢,我們要使用LIMIT關(guān)鍵字,格式為:limit 開始索引 每頁(yè)顯示的條數(shù)。

查詢第1頁(yè)數(shù)據(jù)的SQL語(yǔ)句是:

select * from emp  limit 0,10;

查詢第2頁(yè)數(shù)據(jù)的SQL語(yǔ)句是:

select * from emp  limit 10,10;

查詢第3頁(yè)數(shù)據(jù)的SQL語(yǔ)句是:

select * from emp  limit 20,10;

觀察以上SQL語(yǔ)句,發(fā)現(xiàn): 開始索引一直在改變 , 每頁(yè)顯示條數(shù)是固定的開始索引的計(jì)算公式:

開始索引 = (當(dāng)前頁(yè)碼 - 1) * 每頁(yè)顯示條數(shù)

我們繼續(xù)基于頁(yè)面原型,繼續(xù)分析,得出以下結(jié)論:

前端在請(qǐng)求服務(wù)端時(shí),傳遞的參數(shù)

       當(dāng)前頁(yè)碼 page

       每頁(yè)顯示條數(shù) pageSize

后端需要響應(yīng)什么數(shù)據(jù)給前端

       所查詢到的數(shù)據(jù)列表(存儲(chǔ)到List 集合中)

       總記錄數(shù)
1690352900807_圖2.png

后臺(tái)給前端返回的數(shù)據(jù)包含:List集合(數(shù)據(jù)列表)、total(總記錄數(shù)),而這兩部分我們通常封裝到PageBean對(duì)象中,并將該對(duì)象轉(zhuǎn)換為json格式的數(shù)據(jù)響應(yīng)回給瀏覽器。

以上是基礎(chǔ)的分頁(yè)查詢,大家會(huì)發(fā)現(xiàn),分頁(yè)查詢功能編寫起來(lái)比較繁瑣。而在Mapper接口中定義兩個(gè)方法執(zhí)行兩條不同的SQL語(yǔ)句:

       ? 查詢總記錄數(shù)

       ? 指定頁(yè)碼的數(shù)據(jù)列表

在Service當(dāng)中,調(diào)用Mapper接口的兩個(gè)方法,分別獲取:總記錄數(shù)、查詢結(jié)果列表,然后在將獲取的數(shù)據(jù)結(jié)果封裝到PageBean對(duì)象中。

在未來(lái)開發(fā)其他項(xiàng)目,只要涉及到分頁(yè)查詢功能(例:訂單、用戶、支付、商品),都必須按照以上操作完成功能開發(fā),原始方式的分頁(yè)查詢,存在著"步驟固定"、"代碼頻繁"的問題。

可以使用一些現(xiàn)成的分頁(yè)插件完成。對(duì)于Mybatis來(lái)講現(xiàn)在最主流的就是PageHelper。PageHelper是Mybatis的一款功能強(qiáng)大、方便易用的分頁(yè)插件,支持任何形式的單標(biāo)、多表的分頁(yè)查詢。

官網(wǎng):https://pagehelper.github.io/
PageHelper

在執(zhí)行empMapper.list()方法時(shí),就是執(zhí)行:select * from emp 語(yǔ)句,怎么能夠?qū)崿F(xiàn)分頁(yè)操作呢?

分頁(yè)插件幫我們完成了以下操作:

       ? 先獲取到要執(zhí)行的SQL語(yǔ)句:select * from emp

       ? 把SQL語(yǔ)句中的字段列表,變?yōu)椋篶ount(*)

       ? 執(zhí)行SQL語(yǔ)句:select count(*) from emp //獲取到總記錄數(shù)

       ? 再對(duì)要執(zhí)行的SQL語(yǔ)句:select * from emp 進(jìn)行改造,在末尾添加 limit ? , ?

       ? 執(zhí)行改造后的SQL語(yǔ)句:select * from emp limit ? , ?

代碼實(shí)現(xiàn)

當(dāng)使用了PageHelper分頁(yè)插件進(jìn)行分頁(yè),就無(wú)需再M(fèi)apper中進(jìn)行手動(dòng)分頁(yè)了。 在Mapper中我們只需要進(jìn)行正常的列表查詢即可。在Service層中,調(diào)用Mapper的方法之前設(shè)置分頁(yè)參數(shù),在調(diào)用Mapper方法執(zhí)行查詢之后,解析分頁(yè)結(jié)果,并將結(jié)果封裝到PageBean對(duì)象中返回。

1、在pom.xml引入依賴

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

2、EmpMapper

@Mapper
public interface EmpMapper {
    //獲取當(dāng)前頁(yè)的結(jié)果列表
    @Select("select * from emp")
    public List<Emp> page(Integer start, Integer pageSize);
}

3、EmpServiceImpl

@Override
public PageBean page(Integer page, Integer pageSize) {
    // 設(shè)置分頁(yè)參數(shù)
    PageHelper.startPage(page, pageSize); 
    // 執(zhí)行分頁(yè)查詢
    List<Emp> empList = empMapper.list(name,gender,begin,end); 
    // 獲取分頁(yè)結(jié)果
    Page<Emp> p = (Page<Emp>) empList;   
    //封裝PageBean
    PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); 
    return pageBean;
}

功能開發(fā)完成后,我們重啟項(xiàng)目工程,打開postman,發(fā)起GET請(qǐng)求,訪問 :http://localhost:8080/emps?page=1&pageSize=5

發(fā)起GET請(qǐng)求

后端程序SQL輸出:

實(shí)現(xiàn)分頁(yè)查詢.png

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!