MybatisPlus多表查詢及分頁(yè)查詢完整代碼
多表查詢
- 實(shí)體類準(zhǔn)備:在實(shí)體類中使用MyBatis-Plus的注解來(lái)映射數(shù)據(jù)庫(kù)表和字段。比如,
@TableName、@TableField和@TableId注解用于標(biāo)識(shí)實(shí)體類、字段以及主鍵。 - 構(gòu)建查詢條件:使用
QueryWrapper類可以創(chuàng)建查詢條件方法,并指定聯(lián)合查詢條件。在條件中使用表的別名來(lái)指定字段,比如user.age指的是user表中的age字段。 - 執(zhí)行查詢:調(diào)用MyBatis-Plus提供的方法執(zhí)行查詢,比如
selectList()或selectPage()方法。
示例代碼
// 多表查詢示例
public List<UserVO> selectUserVOList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user.age", 18)
.like("user.username", "Jack")
.orderByDesc("user.id");
return userMapper.selectUserVOList(queryWrapper);
}
// 自定義 SQL 查詢示例
@Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}")
List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age);
// 多表查詢示例
public List<UserVO> selectUserVOList() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user.age", 18)
.like("user.username", "Jack")
.orderByDesc("user.id");
return userMapper.selectUserVOList(queryWrapper);
}
// 自定義 SQL 查詢示例
@Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}")
List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age);第一段段代碼使用了 QueryWrapper 來(lái)構(gòu)建查詢條件。
queryWrapper.eq("user.age", 18)表示篩選出user表中age字段值等于 18 的記錄。eq是“等于”的條件設(shè)置方法。
queryWrapper.like("user.username", "Jack")表示篩選出user表中username字段值類似于 “Jack” 的記錄。like用于模糊匹配,這里會(huì)匹配包含 “Jack” 的用戶名。
queryWrapper.orderByDesc("user.id")表示按照user表中id字段的值降序排列查詢結(jié)果。orderByDesc用于設(shè)置降序排序。
例如,如果在查詢用戶數(shù)據(jù)時(shí)使用了這些條件,那么最終得到的結(jié)果將是年齡為 18 歲、用戶名包含 “Jack” ,并且按照用戶 id 從大到小排序的數(shù)據(jù)。
第二段段代碼是一個(gè)在 MyBatis-Plus 中的自定義 SQL 查詢的示例。
@Select("SELECT u.id, u.username, a.address FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.age = #{age}"):這是一個(gè)@Select注解,用于定義一個(gè)自定義的 SQL 查詢語(yǔ)句。它表示從user表(表別名u)和address表(表別名a)進(jìn)行內(nèi)連接(INNER JOIN),連接條件是u.address_id = a.id,并且篩選出u.age等于傳入?yún)?shù)age的記錄。#{age}是一個(gè)占位符,用于接收實(shí)際傳入的參數(shù)值。List<UserAddressVO> selectUserAddressVOList(@Param("age") Integer age):這定義了一個(gè)方法,返回類型是一個(gè)List,其中元素類型是UserAddressVO。方法名為selectUserAddressVOList,并且通過(guò)@Param("age")注解將傳入的參數(shù)age與 SQL 語(yǔ)句中的占位符#{age}進(jìn)行關(guān)聯(lián)。
例如,如果傳入的 age 值為 20 ,那么這個(gè)查詢就會(huì)返回年齡為 20 歲的用戶的 id 、username 以及對(duì)應(yīng)的地址信息。
補(bǔ)充:
內(nèi)連接(inner join)是SQL中最常見(jiàn)的連接類型之一,用于根據(jù)兩個(gè)表之間的共同值來(lái)合并數(shù)據(jù)。內(nèi)連接返回兩個(gè)表中滿足連接條件的行,即返回兩個(gè)表中共同的行。
具體來(lái)說(shuō),內(nèi)連接會(huì)根據(jù)連接條件(通常是兩個(gè)表之間的共同字段)將兩個(gè)表中符合條件的行進(jìn)行匹配,并將匹配的結(jié)果作為輸出。如果某行在一個(gè)表中有匹配,但在另一個(gè)表中沒(méi)有匹配,那么這行數(shù)據(jù)將不會(huì)包含在內(nèi)連接的結(jié)果中。
內(nèi)連接通常使用INNER JOIN關(guān)鍵字來(lái)表示,語(yǔ)法形式如下:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.共同字段 = 表2.共同字段;
在這個(gè)語(yǔ)句中,
INNER JOIN表示進(jìn)行內(nèi)連接操作,ON關(guān)鍵字用于指定連接條件,即指定兩個(gè)表之間用于匹配的共同字段。
內(nèi)連接是SQL中最常用的連接類型之一,用于從多個(gè)表中檢索相關(guān)數(shù)據(jù),是數(shù)據(jù)查詢和分析中非常重要的操作。
分頁(yè)查詢
- 準(zhǔn)備分頁(yè)對(duì)象:MyBatis-Plus提供了
Page類,用于封裝分頁(yè)查詢條件。你需要傳入頁(yè)碼和每頁(yè)查詢數(shù)量作為參數(shù)。 - 構(gòu)建分頁(yè)查詢條件:在查詢條件中指定需要查詢的條件,然后將分頁(yè)對(duì)象和查詢條件傳遞給
selectPage()方法。 - 執(zhí)行分頁(yè)查詢:調(diào)用
selectPage()方法執(zhí)行分頁(yè)查詢,它會(huì)返回一個(gè)IPage對(duì)象,其中包含了查詢結(jié)果和分頁(yè)信息。
示例代碼
// 分頁(yè)查詢示例
public IPage<User> selectUserPage(Page<User> page) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 18);
return userMapper.selectPage(page, queryWrapper);
}
// 自定義分頁(yè)查詢示例
public IPage<User> selectUserPage(Page<User> page, Integer age) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", age);
return userMapper.selectPage(page, queryWrapper);
}第一段代碼:分頁(yè)查詢示例
public IPage<User> selectUserPage(Page<User> page) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 18);
return userMapper.selectPage(page, queryWrapper);
}public IPage<User> selectUserPage(Page<User> page):這定義了一個(gè)公共方法,返回類型為IPage<User>,表示分頁(yè)查詢的結(jié)果。方法名為selectUserPage,并接收一個(gè)Page<User>類型的參數(shù)page,用于設(shè)置分頁(yè)的相關(guān)信息(如當(dāng)前頁(yè)碼、每頁(yè)條數(shù)等)。QueryWrapper<User> queryWrapper = new QueryWrapper<>();:創(chuàng)建了一個(gè)用于構(gòu)建查詢條件的QueryWrapper對(duì)象。queryWrapper.eq("age", 18);:使用eq方法設(shè)置查詢條件,即篩選出年齡(age)等于 18 的用戶記錄。return userMapper.selectPage(page, queryWrapper);:調(diào)用userMapper中的selectPage方法進(jìn)行分頁(yè)查詢。將之前創(chuàng)建的分頁(yè)對(duì)象page和包含查詢條件的queryWrapper作為參數(shù)傳入,最終返回分頁(yè)查詢的結(jié)果。
第二段代碼:自定義分頁(yè)查詢示例
public IPage<User> selectUserPage(Page<User> page, Integer age) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", age);
return userMapper.selectPage(page, queryWrapper);
}這段代碼與第一段類似,但增加了一個(gè)參數(shù) age 用于自定義年齡條件。
public IPage<User> selectUserPage(Page<User> page, Integer age):方法接收兩個(gè)參數(shù),除了分頁(yè)對(duì)象page,還有一個(gè)整數(shù)類型的age參數(shù),用于指定具體的年齡條件。queryWrapper.eq("age", age);:這里將傳入的age參數(shù)值作為年齡的篩選條件。- 同樣通過(guò)
userMapper.selectPage(page, queryWrapper)進(jìn)行分頁(yè)查詢并返回結(jié)果。
例如,如果在第一段代碼中,假設(shè)每頁(yè)顯示 10 條數(shù)據(jù),當(dāng)前是第 2 頁(yè),那么它會(huì)返回年齡為 18 歲的用戶數(shù)據(jù),并且按照每頁(yè) 10 條,第 2 頁(yè)的規(guī)則進(jìn)行分頁(yè)。
在第二段代碼中,如果傳入的 age 為 25 ,其他條件相同,那么會(huì)返回年齡為 25 歲的用戶數(shù)據(jù)的分頁(yè)結(jié)果。
補(bǔ)充:
在上述代碼中,Page<User> page 是一個(gè)用于分頁(yè)操作的對(duì)象,它具有以下幾個(gè)重要的屬性和功能:
current:表示當(dāng)前要獲取的頁(yè)碼。頁(yè)碼從 1 開(kāi)始計(jì)數(shù)。例如,如果current的值為 2 ,則表示要獲取的是第 2 頁(yè)的數(shù)據(jù)。size:指定每頁(yè)顯示的記錄數(shù)量。例如,如果size的值為 10 ,則每頁(yè)將返回 10 條記錄。除了設(shè)置這兩個(gè)屬性來(lái)控制分頁(yè)的頁(yè)碼和每頁(yè)記錄數(shù),Page對(duì)象還可以用于獲取一些與分頁(yè)相關(guān)的其他信息,比如:
- 總記錄數(shù):通過(guò)調(diào)用相關(guān)方法可以獲取整個(gè)查詢結(jié)果集的總記錄數(shù)。 - 總頁(yè)數(shù):根據(jù)總記錄數(shù)和每頁(yè)記錄數(shù),可以計(jì)算出總的頁(yè)數(shù)。 - 是否有上一頁(yè)和下一頁(yè):可以判斷當(dāng)前頁(yè)是否有前一頁(yè)或后一頁(yè),以便在前端進(jìn)行頁(yè)面導(dǎo)航的顯示控制。
假設(shè)我們有一個(gè)數(shù)據(jù)庫(kù)表,其中總共有 50 條用戶記錄,并且設(shè)置
page的size為 10 :- 如果
current為 1 ,則會(huì)獲取第 1 頁(yè)的 10 條記錄(記錄 1 - 10)。 - 如果
current為 3 ,則會(huì)獲取第 3 頁(yè)的 10 條記錄(記錄 21 - 30)。
這樣,通過(guò)靈活設(shè)置 page 對(duì)象的 current 和 size 屬性,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的分頁(yè)獲取和展示。
使用 Page 對(duì)象進(jìn)行分頁(yè)查詢的完整代碼示例:
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class PageExampleTest {
@Autowired
private UserMapper userMapper; // 假設(shè)您有一個(gè) UserMapper 接口
@Test
public void testPageQuery() {
// 創(chuàng)建 Page 對(duì)象,設(shè)置當(dāng)前頁(yè)碼為 2,每頁(yè)記錄數(shù)為 5
Page<User> page = new Page<>(2, 5);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 可以添加其他查詢條件
IPage<User> userIPage = userMapper.selectPage(page, queryWrapper);
/*在 MyBatis-Plus 中,`IPage` 是 MyBatis-Plus 自定義的用于表示分頁(yè)結(jié)果的接口。通過(guò)使用 `IPage` ,可以方便地獲取分頁(yè)相關(guān)的信息,如總記錄數(shù)、當(dāng)前頁(yè)數(shù)據(jù)、每頁(yè)記錄數(shù)、當(dāng)前頁(yè)碼、總頁(yè)數(shù)等。*/
// 獲取總記錄數(shù)
long total = userIPage.getTotal();
// 獲取當(dāng)前頁(yè)數(shù)據(jù)列表
List<User> userList = userIPage.getRecords();
// 獲取當(dāng)前頁(yè)碼
int currentPage = userIPage.getCurrent();
// 獲取每頁(yè)記錄數(shù)
int pageSize = userIPage.getSize();
// 獲取總頁(yè)數(shù)
int totalPages = userIPage.getPages();
System.out.println("總記錄數(shù): " + total);
System.out.println("當(dāng)前頁(yè)數(shù)據(jù)列表: " + userList);
System.out.println("當(dāng)前頁(yè)碼: " + currentPage);
System.out.println("每頁(yè)記錄數(shù): " + pageSize);
System.out.println("總頁(yè)數(shù): " + totalPages);
}
}到此這篇關(guān)于MybatisPlus多表查詢及分頁(yè)查詢的文章就介紹到這了,更多相關(guān)MybatisPlus多表查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決SpringCloudStream整合Kafka,兩個(gè)通道對(duì)應(yīng)同一個(gè)topic報(bào)錯(cuò)的情況
文章指出通道需唯一對(duì)應(yīng)topic,否則會(huì)報(bào)錯(cuò),因兩個(gè)通道共用一個(gè)topic導(dǎo)致綁定失敗,通過(guò)修改配置文件,為不同通道分配不同的topic解決2026-05-05
SpringBoot中集成Swagger2及簡(jiǎn)單實(shí)用
使用Swagger你只需要按照它的規(guī)范去定義接口及接口相關(guān)的信息,再通過(guò)Swagger衍生出來(lái)的一系列項(xiàng)目和工具,就可以做到生成各種格式的接口文檔,以及在線接口調(diào)試頁(yè)面等等,這篇文章主要介紹了SpringBoot中集成Swagger2,需要的朋友可以參考下2023-06-06
解決springboot中自定義JavaBean返回的json對(duì)象屬性名稱大寫變小寫問(wèn)題
開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)查詢返回的數(shù)據(jù)出現(xiàn)自定義的JavaBean的屬性值大小寫格式出現(xiàn)問(wèn)題,導(dǎo)致前端無(wú)法接受到數(shù)據(jù),目前有四種解決方法,根據(jù)大佬的經(jīng)驗(yàn)之談,前兩種是最簡(jiǎn)單便捷的,后兩種是比較通用的方法,需要的朋友可以參考下2023-10-10
Java微信獲取用戶資料報(bào)錯(cuò)48001解決辦法
這篇文章主要介紹了Java微信獲取用戶資料報(bào)錯(cuò)48001的解決辦法,這個(gè)問(wèn)題大家在工作可能經(jīng)常會(huì)遇到,文中通過(guò)示例代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
java讀寫ini文件、FileOutputStream問(wèn)題
這篇文章主要介紹了java讀寫ini文件、FileOutputStream問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot3整合Nacos?V2.3.2的詳細(xì)過(guò)程
本文介紹了如何在?Spring?Boot?3.2.x?項(xiàng)目中整合?Nacos?2.3.2,包括依賴配置、Nacos?服務(wù)發(fā)現(xiàn)與動(dòng)態(tài)配置的配置方法,通過(guò)整合?Nacos,Spring?Boot?應(yīng)用可以實(shí)現(xiàn)高效的服務(wù)發(fā)現(xiàn)、動(dòng)態(tài)配置管理以及分布式系統(tǒng)中的靈活擴(kuò)展,感興趣的朋友跟隨小編一起看看吧2024-11-11

