【MyBatis框架】MyBatis實現物理分頁和邏輯(記憶體)分頁

haohaoxuexiyai發表於2020-11-25

實現查詢分頁有兩種思路,一種是在SQL語句中直接完成分頁,查詢出來後直接使用,例如在SQL語句中使用LIMIT關鍵字;另外一種是SQL語句只做查詢,其他諸如分頁、數值處理的操作都由程式語言來完成,在MyBatis中就採用了這種方法。

下面來介紹兩種MyBatis中支援的分頁方法:

方式1:使用RowBounds物件實現邏輯分頁

Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁。

使用方式就是在調取sql語句的時候,加上RowBounds物件來指定分頁開始的位置和要顯示的條數。

//調取sql語句,selectList("方法的完整路徑"),路徑=namespace+id
List<Student> list = session.selectList("com.maven.dao.StudentDao.getall",null,new RowBounds(0,3));// rowBounds(開始位置,顯示條數)

方式2:使用.pageHelper分頁外掛

分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。

步驟一:匯入jar包

分頁外掛:pagehelper.jar

sql 解析工具:jsqlparser.jar

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.6</version>
</dependency>

步驟二、在mybatis.xml配置檔案中配置外掛

外掛5.1之前:

<plugins>
    <!-- PageHelper4.1.6 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>

外掛5.1之後:interceptor不同,並且不需要指定資料庫名字

<plugins>
	<plugin interceptor="com.github.pagehelper.PageInterceptor">
    </plugin>
</plugins>

步驟三、在執行查詢之前指定分頁的引數

PageHelper.startPage(當前頁,每頁條數)

還可以將返回的list結果封裝在PageInfo物件裡,通過使用該物件實現對總條數、總頁數、上一頁、下一頁、當前頁、每頁顯示條數、當前頁顯示條數的查詢,詳見下文。

例如

//1.載入配置檔案
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2.建立SqlSessionFactoryBuilder物件
SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder();
//3.得到session工廠
SqlSessionFactory factory = builder.build(reader,"development2");
//4.得到SqlSession物件
SqlSession session = factory.openSession();
//5.調取sql語句,selectList("方法的完整路徑"),路徑=namespace+id
//5.1 指定分頁的引數
PageHelper.startPage(2,3);
//5.2 調取Dao層方法
List<Student> list = session.selectList("com.maven.dao.StudentDao.getall");
//5.3 建立分頁工具類物件
PageInfo<Student> info = new PageInfo<>(list);
//6.遍歷
for (Student student:info.getList()) {
    System.out.println(student);
}
System.out.println("總條數:"+info.getTotal());
System.out.println("總頁數:"+info.getPages());
System.out.println("上一頁:"+info.getPrePage());
//如果沒有下一頁, 則返回0
System.out.println("下一頁:"+info.getNextPage());
System.out.println("當前頁:"+info.getPageNum());
System.out.println("每頁顯示條數:"+info.getPageSize());
System.out.println("當前頁的條數:"+info.getSize());
//7.關閉資料來源
session.close();
reader.close();

邏輯分頁和物理分頁相比的優缺點

  • 物理分頁每次都要訪問資料庫,邏輯分頁只訪問一次

  • 物理分頁佔用記憶體少,邏輯分頁相對較多

  • 物理分頁資料每次都是最新的,邏輯分頁有可能滯後


下篇介紹一下快取

相關文章