1.邏輯分頁(假分頁)
邏輯分頁:邏輯分頁依賴于代碼。(例:Mybatis自帶的分頁插件就是邏輯分頁)
同時(shí)邏輯分頁是先查詢出所有的數(shù)據(jù),再根據(jù)代碼塊的所需(例:你需要拿到第幾頁,每頁幾條的數(shù)據(jù))篩選出合適的數(shù)據(jù)進(jìn)行分頁。
通過SQL將所有數(shù)據(jù)全部查詢出來,然后根據(jù)游標(biāo)進(jìn)行篩選,只是顯示出來部分而已。
好處是所有數(shù)據(jù)庫都統(tǒng)一,壞處就是效率低。
2.物理分頁(真分頁)
物理分頁:物理分頁依賴于數(shù)據(jù)庫。(更側(cè)重于sql語句)
例:MySQL數(shù)據(jù)庫提供的分頁關(guān)鍵字"limit",程序員只需要編寫帶有關(guān)鍵字的SQL語句,數(shù)據(jù)庫返回的數(shù)據(jù)就是分頁結(jié)果。
物理分頁就是數(shù)據(jù)庫本身提供了分頁方式,如MySQL的limit,oracle的rownum 。
好處是效率高,不好的地方就是不同數(shù)據(jù)庫有不同的搞法。
3.兩者對比
概念簡單點(diǎn)講:
邏輯分頁就是半自動(dòng)化的一個(gè)分頁步驟(因?yàn)樾枰獋鬟f相關(guān)參數(shù),所以是半自動(dòng)化的);
物理分頁就是手寫SQL語句實(shí)現(xiàn)的分頁。
1.數(shù)據(jù)庫方面
物理分頁是手寫SQL語句,故每一次分頁都需要訪問數(shù)據(jù)庫;邏輯分頁是將全部數(shù)據(jù)查詢出來后再進(jìn)行的分頁,只需訪問一次數(shù)據(jù)庫。所以說,物理分頁對于數(shù)據(jù)庫造成的負(fù)擔(dān)大。
2.服務(wù)器方面
邏輯分頁一次性將所有的數(shù)據(jù)讀取至內(nèi)存中,占用了較大的內(nèi)存空間;物理分頁每次只讀取所需的數(shù)據(jù),占用內(nèi)存比較小。
3.實(shí)時(shí)性
邏輯分頁一次性將數(shù)據(jù)全部查詢出來,如果數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了改變,邏輯分頁就不能夠獲取最新數(shù)據(jù)(不能自動(dòng)更新數(shù)據(jù)),可能導(dǎo)致臟數(shù)據(jù)的出現(xiàn),實(shí)時(shí)性較低
物理分頁每一次分頁都需要從數(shù)據(jù)庫中進(jìn)行查詢,這樣能夠獲取數(shù)據(jù)庫中數(shù)據(jù)的最新狀態(tài),實(shí)時(shí)性較高。
4.邏輯分頁代碼實(shí)現(xiàn);
導(dǎo)入pom的依賴;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency><!--導(dǎo)入分頁插件-->
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
注意版本依賴不然會(huì)使循環(huán) 報(bào)錯(cuò)