MyBatis-Plus - 實現多表分頁查詢

在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

 

執行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章