MybatisPlus多表連接查詢一對多分頁查詢數據

来源:https://www.cnblogs.com/javazhishitupu/archive/2022/12/01/16941126.html
-Advertisement-
Play Games

一、序言 在日常一線開發過程中,多表連接查詢不可或缺,基於MybatisPlus多表連接查詢究竟該如何實現,本文將帶你找到答案。 在多表連接查詢中,既有查詢單條記錄的情況,又有列表查詢,還有分頁查詢,這些需求與多表連接是什麼關係,又該如何實現,這是本文討論的中心內容。 二、實戰編碼 1、兩個關聯DO ...


一、序言

在日常一線開發過程中,多表連接查詢不可或缺,基於MybatisPlus多表連接查詢究竟該如何實現,本文將帶你找到答案。

在多表連接查詢中,既有查詢單條記錄的情況,又有列表查詢,還有分頁查詢,這些需求與多表連接是什麼關係,又該如何實現,這是本文討論的中心內容。

二、實戰編碼

1、兩個關聯DO

部門DO

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "tb_dept")
public class Dept {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    private Long deptId;
    private String deptName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime gmtCreate;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime gmtModified;
    private String tel;
    
    public Dept(Dept dept) {
        if (Objects.nonNull(dept)) {
            this.deptId = dept.deptId;
            this.deptName = dept.deptName;
            this.gmtCreate = dept.gmtCreate;
            this.gmtModified = dept.gmtModified;
            this.tel = dept.tel;
        }
    }
}

用戶DO

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "tb_user")
public class User {
    private static final long serialVersionUID = 1L;
    private Integer age;
    private Long deptId;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime gmtCreate;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime gmtModified;
    @TableId(type = IdType.AUTO)
    private Long userId;
    private String userName;
    
    public User(User user) {
        if (Objects.nonNull(user)) {
            this.age = user.age;
            this.deptId = user.deptId;
            this.gmtCreate = user.gmtCreate;
            this.gmtModified = user.gmtModified;
            this.userId = user.userId;
            this.userName = user.userName;
        }
    }
}
2、部門VO
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DeptVo extends Dept {
    private List<User> userList;
    /**
     * 實現部門DO 轉 部門VO
     * @param dept
     */
    public DeptVo(Dept dept) {
        super(dept);
    }
}
3、普通編碼查詢數據
public IPage<DeptVo> selectDeptPage3() {
    LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class);
    Page<Dept> deptPage = this.page(new Page<>(1, 3), wrapper);
    IPage<DeptVo> deptVoPage = EntityUtils.toPage(deptPage, DeptVo::new);
    // 完成userList欄位屬性註入
    Set<Long> deptIds = EntityUtils.toSet(deptVoPage.getRecords(), DeptVo::getDeptId);
    if (deptIds.size() > 0) {
        List<User> userList = userMapper.selectList(Wrappers.lambdaQuery(User.class)
                                                    .in(User::getDeptId, deptIds));
        Map<Long, List<User>> map = EntityUtils.groupBy(userList, User::getDeptId);
        for (DeptVo deptVo : deptVoPage.getRecords()) {
            deptVo.setUserList(map.get(deptVo.getDeptId()));
        }
    }
    return deptVoPage;
}
4、使用工具類查詢數據

優化版 一行代碼完成userList屬性註入

/**
 * 優化版 一行代碼完成userList屬性註入
 */
@Override
public IPage<DeptVo> selectDeptPage4() {
    LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class);
    Page<Dept> deptPage = this.page(new Page<>(1, 3), wrapper);
    IPage<DeptVo> deptVoPage = EntityUtils.toPage(deptPage, DeptVo::new);
    //  一行代碼完成userList屬性註入
    FieldInjectUtils.injectListField(deptVoPage, DeptVo::getDeptId, UserServiceImpl.class, User::getDeptId, DeptVo::getUserList);
    return deptVoPage;
}

需要指出的是FieldInjectUtils在工具包下

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.5.9.2</version>
</dependency>

學習源碼的朋友,源碼直通車

5、演示數據
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "records": [
      {
        "deptId": "10",
        "deptName": "Java",
        "gmtCreate": "2020-10-30 11:48:19",
        "gmtModified": "2021-05-24 15:11:17",
        "tel": "88886666",
        "userList": [
          {
            "age": 12,
            "deptId": "10",
            "gmtCreate": null,
            "gmtModified": "2022-11-05 16:44:22",
            "userId": "1",
            "userName": "Jone"
          }
        ]
      },
      {
        "deptId": "11",
        "deptName": "Mysql",
        "gmtCreate": "2020-10-30 11:48:44",
        "gmtModified": "2021-05-24 15:11:20",
        "tel": "80802121",
        "userList": [
          {
            "age": 23,
            "deptId": "11",
            "gmtCreate": null,
            "gmtModified": "2022-11-05 16:44:24",
            "userId": "2",
            "userName": "Jack"
          },
          {
            "age": 21,
            "deptId": "11",
            "gmtCreate": "2022-11-05 16:09:42",
            "gmtModified": "2022-11-05 16:11:28",
            "userId": "5",
            "userName": "滴滴"
          }
        ]
      },
      {
        "deptId": "12",
        "deptName": "Tomcat",
        "gmtCreate": "2020-10-30 11:48:44",
        "gmtModified": "2021-05-24 15:11:23",
        "tel": "23231212",
        "userList": [
          {
            "age": 22,
            "deptId": "12",
            "gmtCreate": null,
            "gmtModified": "2022-11-05 16:44:27",
            "userId": "3",
            "userName": "Billie"
          },
          {
            "age": 12,
            "deptId": "12",
            "gmtCreate": "2021-06-05 19:22:46",
            "gmtModified": "2021-10-21 14:38:26",
            "userId": "4",
            "userName": "didi"
          },
          {
            "age": 18,
            "deptId": "12",
            "gmtCreate": "2022-11-05 16:10:48",
            "gmtModified": "2022-11-05 16:11:36",
            "userId": "6",
            "userName": "嗒嗒"
          }
        ]
      }
    ],
    "total": 4,
    "size": 3,
    "current": 1,
    "orders": [],
    "optimizeCountSql": true,
    "searchCount": true,
    "countId": null,
    "maxLimit": null,
    "pages": 2
  }
}

三、小結

本文完成了MybatisPlus一對多分頁查詢數據的開發需求,更多細節內容,視頻直通車。

喜歡本文就【♥️推薦♥️】一下,激勵我持續創作。這個Github同樣精彩,收到您的star我會很激動。本文歸檔在專題博客,視頻講解在B站


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是緩存? 為什麼使用緩存? 什麼場景下使用緩存? 緩存(Cache)就是數據交換的緩衝區,一個臨時存儲數據的地方,當我們讀取數據時會首先從緩存中查找需要的數據,如果找到了則直接執行,找不到的話再從記憶體中找。 在實際開發中,我們會經常對資料庫進行數據查詢,而從資料庫讀取數據的效率是非常低下的,並且 ...
  • 代碼1 #include <iostream> using namespace std; class MyString3 { public: MyString3(const char * pChar=nullptr) { if (pChar == nullptr) { this->pString = ...
  • 一個基本概念:任何裝置在 Linux 下都是文件,數據溝通的介面也有專屬的文件在負責,Linux 的文件種類繁多,常用的是一般文件(-)與目錄文件(d)。 註意:Linux 文件類型和文件的文件名所代表的意義是兩個不同的概念,在 linux 中文件類型與文件擴展名沒有關係。它不像 Windows 那... ...
  • 1、多態 1.1 多態的概述(記憶) 什麼是多態 同一對象,在不同時刻表現出來的不同形態。 多態的前提 有繼承/實現關係 有方法重寫 有父類對象的引用執行子類對象 1.2 多態中的成員訪問特點(記憶) 成員訪問特點 成員變數:編程看父類,運行看父類 成員方法:編譯看父類,運行看子類 代碼演示 pub ...
  • 1. 類和對象的記憶體處理方式 1.1 方法區(method area) 也稱靜態區,用於存放用戶定義的各個類、靜態變數等。 1.2 堆(heap) 堆中存放對象和非靜態變數。 在使用new關鍵字產生對象後,對象會存放進堆中進行管理,對象名就是對象在堆中的地址。 對象把被它調用的成員變數直接存儲到堆中 ...
  • 本文詳細介紹了Vaex這個強大的工具庫,能夠每秒處理數億甚至數十億行數據,而無需將整個數據集載入到記憶體中。對於大型數據的分析任務,Vaex的效率更簡單,對硬體/環境的要求更少!pandas升級版!快用起來吧~ ...
  • ###伺服器:WindowsServer 2016 ###Cloudreve 需求方想整一個在小團隊內部使用的網盤系統,最終在千挑萬選之下選中了Cloudreve。 Github地址:https://github.com/cloudreve/Cloudreve 官網地址:https://docs.c ...
  • 引言 儘管 redis 是一款非常優秀的 NoSQL 資料庫,但更重要的是,作為使用者我們應該學會在不同的場景中如何更好的使用它,更大的發揮它的價值。主要可以從這四個方面進行優化:Redis鍵值設計、批處理優化、服務端優化、集群配置優化 1. Redis慢查詢日誌使用 Redis 提供了慢日誌命令的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...