DoytoQuery中的分頁(yè)排序方案示例詳解
引言
分頁(yè)和排序是數(shù)據(jù)庫(kù)提供的兩項(xiàng)基本的查詢功能。
以MySQL為例,一條典型的SQL查詢語(yǔ)句如下:
SELECT * FROM t_user ORDER BY create_time DESC, username ASC LIMIT 10 OFFSET 20
那么在前后端交互中,前端應(yīng)該如何向后端傳遞分頁(yè)和排序有關(guān)的信息呢?需要傳遞哪些參數(shù)?參數(shù)的意義和格式又是什么?
分頁(yè)
分頁(yè)的語(yǔ)句為LIMIT 10 OFFSET 20
,其中10
為每頁(yè)的大小,20
為查詢的偏移量,也就是查詢表中的第21到30條共計(jì)10條數(shù)據(jù)。
但是在設(shè)計(jì)接口時(shí),通常不會(huì)要求前端直接傳入OFFSET
參數(shù),而是通過(guò)傳入頁(yè)號(hào)和分頁(yè)大小,來(lái)計(jì)算出OFFSET
的值。
在這個(gè)例子中,假設(shè)前端的頁(yè)號(hào)從1開始,那么需要查詢的數(shù)據(jù)就是分頁(yè)大小為10的第3頁(yè)數(shù)據(jù),對(duì)應(yīng)的OFFSET
的值的計(jì)算式為(3-1)*10 = 20
。
前端在調(diào)用后端查詢接口時(shí),通常會(huì)傳入頁(yè)號(hào)和每頁(yè)大小,由后端計(jì)算出OFFSET
用于分頁(yè)查詢。這里頁(yè)號(hào)的參數(shù)名稱定義為pageNumber
,分頁(yè)大小的參數(shù)名定義為pageSize
, 則以起始頁(yè)號(hào)為1為例,OFFSET
的計(jì)算公式為:
(pageNumber - 1) * pageSize
而前端的傳值應(yīng)為
?pageNumber=3&pageSize=10
分頁(yè)接口
不同的數(shù)據(jù)庫(kù)的分頁(yè)語(yǔ)句并不一致,但是一般都需要三個(gè)參數(shù):SQL語(yǔ)句,分頁(yè)大小,偏移量,所以定義一個(gè)構(gòu)建分頁(yè)語(yǔ)句的接口Dialect,根據(jù)訪問(wèn)的數(shù)據(jù)庫(kù)提供對(duì)應(yīng)的分頁(yè)實(shí)現(xiàn)。
public interface Dialect { String buildPageSql(String sql, int limit, long offset); }
排序
排序的語(yǔ)句為ORDER BY create_time DESC, username ASC
, 其中ORDER BY
為SQL的關(guān)鍵字,可以將其定義為參數(shù)名。因?yàn)槭怯糜谂判?,所以我將其取名?code>sort,對(duì)應(yīng)的值為create_time DESC, username ASC
。因?yàn)榍岸薌ET請(qǐng)求需要對(duì)參數(shù)值里的空格進(jìn)行轉(zhuǎn)義,為避免這個(gè)問(wèn)題,將值里的,
轉(zhuǎn)為;
,將DESC
/ASC
前的空格轉(zhuǎn)為,
,最終前端傳值如下:
?sort=create_time,desc;username,asc
請(qǐng)求對(duì)象
綜合以上分頁(yè)和排序的參數(shù)定義和說(shuō)明,前端的傳值如下:
?pageNumber=3&pageSize=10&sort=create_time,desc;username,asc
那么后端就可以定義如下PageQuery類用于分頁(yè)和排序參數(shù)的處理:
public class PageQuery { private Integer pageNumber; private Integer pageSize; private String sort; }
每條查詢都有進(jìn)行顯示或隱式的分頁(yè)和排序,比如:
SELECT * FROM t_user
和
SELECT * FROM t_user ORDER BY id ASC LIMIT ∞ OFFSET 0
等價(jià)。
所以PageQuery
應(yīng)當(dāng)作為所有查詢對(duì)象的父類,以便為數(shù)據(jù)查詢提供分頁(yè)和排序的能力。
響應(yīng)對(duì)象
對(duì)于前端的分頁(yè)查詢請(qǐng)求,除了返回對(duì)應(yīng)的數(shù)據(jù)列表外,還需要返回總的數(shù)據(jù)條數(shù)total
以幫助前端計(jì)算總頁(yè)數(shù),計(jì)算公式為⌈total/size⌉
。對(duì)應(yīng)的響應(yīng)對(duì)象定義如下:
public class PageList<T> { private final List<T> list; private final long total; }
小結(jié)
本篇主要介紹了DoytoQuery中對(duì)于數(shù)據(jù)庫(kù)查詢中分頁(yè)和排序功能的一種面向?qū)ο蟮慕鉀Q方案,就這。更多關(guān)于DoytoQuery分頁(yè)排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis?sqlMapConfig.xml中的mappers標(biāo)簽使用
這篇文章主要介紹了Mybatis?sqlMapConfig.xml中的mappers標(biāo)簽使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01Spring Boot Shiro在Web應(yīng)用中的作用詳解
這篇文章主要為大家介紹了Spring Boot Shiro在Web應(yīng)用中的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java數(shù)據(jù)庫(kù)操作庫(kù)DButils類的使用方法與實(shí)例詳解
這篇文章主要介紹了JDBC數(shù)據(jù)庫(kù)操作庫(kù)DButils類的使用方法詳解,需要的朋友可以參考下2020-02-02IDEA創(chuàng)建maven項(xiàng)目時(shí)在tomcat運(yùn)行瀏覽器404的問(wèn)題
這篇文章主要介紹了IDEA創(chuàng)建maven項(xiàng)目時(shí)在tomcat運(yùn)行瀏覽器404的問(wèn)題及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11java中mybatis和hibernate的用法總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于java中mybatis和hibernate的用法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-01-01java Hibernate多對(duì)多映射詳解及實(shí)例代碼
這篇文章主要介紹了java Hibernate多對(duì)多映射詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01