在Mybatis Plus 中,雖然IService 接口幫我們定義了很多常用的方法,但這些都是 T 對象有用,如果涉及到 多表的查詢,還是需要自定義Vo 對象和自己編寫sql 語句,Mybatis Plus提供了一個Page 對象,查詢是需要設置其中的 size 字段 和 current 字段的值。
一、分頁配置
可以直接使用selectPage這樣的分頁,但返回的數據確實是分頁後的數據,但在控制檯打印的SQL語句其實並沒有真正的物理分頁,而是通過緩存來獲得全部數據中再進行的分頁,這樣對於大數據量操作時是不可取的,那麼接下來就敘述一下,真正實現物理分頁的方法。
官方在分頁插件上如是描述:自定義查詢語句分頁(自己寫sql/mapper),也就是針對自己在Mapper中寫的方法,但經過測試,如果不配置分頁插件,其默認採用的分頁爲RowBounds的分頁即邏輯分頁,也就是先把數據記錄全部查詢出來,然在再根據offset和limit截斷記錄返回(數據量大的時候會造成內存溢出),故而不可取,而通過分頁插件的配置即可達到物理分頁效果。
新建一個MybatisPlusConfig配置類文件,代碼如下所示:
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisPlusConfig {
/**
* mybatis-plus分頁插件<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}
二、使用分頁進行單表的查詢
對於單表的分頁查詢,ServiceImpl 類已經爲我們提供了對應的方法 selectPage(),並將結果封裝到 Page 對象中:
在項目開發當中,都會將分頁的一些參數封裝成一個類 PageReq(不要在意這個Req 爲什麼不是全大寫)->import java.io.Serializable;
public class PageReq implements Serializable {
/**
* 每頁顯示大小
*/
private long size;
/**
* 當前頁碼
*/
private long current;
/**
* 最大頁數
*/
private long maxCurrent;
/**
* 數據總條數
*/
private long total;
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
public long getCurrent() {
return current;
}
public void setCurrent(long current) {
this.current = current;
}
public long getMaxCurrent() {
return maxCurrent;
}
public void setMaxCurrent(long maxCurrent) {
this.maxCurrent = maxCurrent;
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
if(size != 0){
if(total % size != 0){
maxCurrent = total / size + 1;
}else {
maxCurrent = total / size;
}
}
}
public PageReq() {
}
public PageReq(long size, long current, long total) {
this.size = size;
this.current = current;
this.total = total;
setTotal(total);
}
}
功能編寫
執行完之後,會將查詢的接口封裝到我們 Page的 對象中:
三、多表關聯分頁查詢
對於多表關聯的查詢時,還是需要編寫 VO 類和 手動的在Mapper.xml 中編寫sql,雖然是可以不用創建VO,用 Map 的方式接受返回的結果,但這樣只會更麻煩,甚至VO 是很有可能在其他地方使用的。
先準備個VO類:
編寫Mapper接口,添加一個分頁查詢的方法
package com.eiot.e_view.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.eiot.e_view.model.req.RoomPageReq;
import com.eiot.e_view.model.vo.RoomVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface RoomMapper extends BaseMapper<Room> {
List<RoomVO> getRoomPageList(Page page, @Param("roomPageReq")RoomPageReq roomPageReq);
}
編寫sql,和我們使用 Mybatis 沒有區別:
編寫Server