1.邏輯分頁(假分頁)
邏輯分頁:邏輯分頁依賴于代碼。(例:Mybatis自帶的分頁插件就是邏輯分頁)
同時邏輯分頁是先查詢出所有的數(shù)據(jù),再根據(jù)代碼塊的所需(例:你需要拿到第幾頁,每頁幾條的數(shù)據(jù))篩選出合適的數(shù)據(jù)進行分頁。
通過SQL將所有數(shù)據(jù)全部查詢出來,然后根據(jù)游標進行篩選,只是顯示出來部分而已。
好處是所有數(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.兩者對比
概念簡單點講:
邏輯分頁就是半自動化的一個分頁步驟(因為需要傳遞相關(guān)參數(shù),所以是半自動化的);
物理分頁就是手寫SQL語句實現(xiàn)的分頁。
1.數(shù)據(jù)庫方面
物理分頁是手寫SQL語句,故每一次分頁都需要訪問數(shù)據(jù)庫;邏輯分頁是將全部數(shù)據(jù)查詢出來后再進行的分頁,只需訪問一次數(shù)據(jù)庫。所以說,物理分頁對于數(shù)據(jù)庫造成的負擔大。
2.服務器方面
邏輯分頁一次性將所有的數(shù)據(jù)讀取至內(nèi)存中,占用了較大的內(nèi)存空間;物理分頁每次只讀取所需的數(shù)據(jù),占用內(nèi)存比較小。
3.實時性
邏輯分頁一次性將數(shù)據(jù)全部查詢出來,如果數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了改變,邏輯分頁就不能夠獲取最新數(shù)據(jù)(不能自動更新數(shù)據(jù)),可能導致臟數(shù)據(jù)的出現(xiàn),實時性較低
物理分頁每一次分頁都需要從數(shù)據(jù)庫中進行查詢,這樣能夠獲取數(shù)據(jù)庫中數(shù)據(jù)的最新狀態(tài),實時性較高。
4.邏輯分頁代碼實現(xiàn);
導入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><!--導入分頁插件-->
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
注意版本依賴不然會使循環(huán) 報錯