更新時間:2023-07-26 來源:黑馬程序員 瀏覽量:
如果數(shù)據(jù)庫中的數(shù)據(jù)有很多(假設(shè)有十幾萬條)的時候,將數(shù)據(jù)全部展示出來肯定不現(xiàn)實,這時使用分頁解決這個問題,每次只展示一頁的數(shù)據(jù),比如:一頁展示10條數(shù)據(jù),如果還想看其他的數(shù)據(jù),可以通過點擊頁碼進(jìn)行查詢。
要想從數(shù)據(jù)庫中進(jìn)行分頁查詢,我們要使用LIMIT關(guān)鍵字,格式為:limit 開始索引 每頁顯示的條數(shù)。
查詢第1頁數(shù)據(jù)的SQL語句是:
select * from emp limit 0,10;
查詢第2頁數(shù)據(jù)的SQL語句是:
select * from emp limit 10,10;
查詢第3頁數(shù)據(jù)的SQL語句是:
select * from emp limit 20,10;
觀察以上SQL語句,發(fā)現(xiàn): 開始索引一直在改變 , 每頁顯示條數(shù)是固定的開始索引的計算公式:
開始索引 = (當(dāng)前頁碼 - 1) * 每頁顯示條數(shù)
我們繼續(xù)基于頁面原型,繼續(xù)分析,得出以下結(jié)論:
前端在請求服務(wù)端時,傳遞的參數(shù)
當(dāng)前頁碼 page
每頁顯示條數(shù) pageSize
后端需要響應(yīng)什么數(shù)據(jù)給前端
所查詢到的數(shù)據(jù)列表(存儲到List 集合中)
總記錄數(shù)
后臺給前端返回的數(shù)據(jù)包含:List集合(數(shù)據(jù)列表)、total(總記錄數(shù)),而這兩部分我們通常封裝到PageBean對象中,并將該對象轉(zhuǎn)換為json格式的數(shù)據(jù)響應(yīng)回給瀏覽器。
以上是基礎(chǔ)的分頁查詢,大家會發(fā)現(xiàn),分頁查詢功能編寫起來比較繁瑣。而在Mapper接口中定義兩個方法執(zhí)行兩條不同的SQL語句:
? 查詢總記錄數(shù)
? 指定頁碼的數(shù)據(jù)列表
在Service當(dāng)中,調(diào)用Mapper接口的兩個方法,分別獲取:總記錄數(shù)、查詢結(jié)果列表,然后在將獲取的數(shù)據(jù)結(jié)果封裝到PageBean對象中。
在未來開發(fā)其他項目,只要涉及到分頁查詢功能(例:訂單、用戶、支付、商品),都必須按照以上操作完成功能開發(fā),原始方式的分頁查詢,存在著"步驟固定"、"代碼頻繁"的問題。
可以使用一些現(xiàn)成的分頁插件完成。對于Mybatis來講現(xiàn)在最主流的就是PageHelper。PageHelper是Mybatis的一款功能強大、方便易用的分頁插件,支持任何形式的單標(biāo)、多表的分頁查詢。
官網(wǎng):https://pagehelper.github.io/
在執(zhí)行empMapper.list()方法時,就是執(zhí)行:select * from emp 語句,怎么能夠?qū)崿F(xiàn)分頁操作呢?
分頁插件幫我們完成了以下操作:
? 先獲取到要執(zhí)行的SQL語句:select * from emp
? 把SQL語句中的字段列表,變?yōu)椋篶ount(*)
? 執(zhí)行SQL語句:select count(*) from emp //獲取到總記錄數(shù)
? 再對要執(zhí)行的SQL語句:select * from emp 進(jìn)行改造,在末尾添加 limit ? , ?
? 執(zhí)行改造后的SQL語句:select * from emp limit ? , ?
代碼實現(xiàn)
當(dāng)使用了PageHelper分頁插件進(jìn)行分頁,就無需再Mapper中進(jìn)行手動分頁了。 在Mapper中我們只需要進(jìn)行正常的列表查詢即可。在Service層中,調(diào)用Mapper的方法之前設(shè)置分頁參數(shù),在調(diào)用Mapper方法執(zhí)行查詢之后,解析分頁結(jié)果,并將結(jié)果封裝到PageBean對象中返回。
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)前頁的結(jié)果列表 @Select("select * from emp") public List<Emp> page(Integer start, Integer pageSize); }
3、EmpServiceImpl
@Override public PageBean page(Integer page, Integer pageSize) { // 設(shè)置分頁參數(shù) PageHelper.startPage(page, pageSize); // 執(zhí)行分頁查詢 List<Emp> empList = empMapper.list(name,gender,begin,end); // 獲取分頁結(jié)果 Page<Emp> p = (Page<Emp>) empList; //封裝PageBean PageBean pageBean = new PageBean(p.getTotal(), p.getResult()); return pageBean; }
功能開發(fā)完成后,我們重啟項目工程,打開postman,發(fā)起GET請求,訪問 :http://localhost:8080/emps?page=1&pageSize=5
后端程序SQL輸出: