MybatisPlus多表查詢及分頁查詢完整代碼
多表查詢
- 實(shí)體類準(zhǔn)備:在實(shí)體類中使用MyBatis-Plus的注解來映射數(shù)據(jù)庫表和字段。比如,
@TableName
、@TableField
和@TableId
注解用于標(biāo)識實(shí)體類、字段以及主鍵。 - 構(gòu)建查詢條件:使用
QueryWrapper
類可以創(chuàng)建查詢條件方法,并指定聯(lián)合查詢條件。在條件中使用表的別名來指定字段,比如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
來構(gòu)建查詢條件。
queryWrapper.eq("user.age", 18)
表示篩選出user
表中age
字段值等于 18 的記錄。eq
是“等于”的條件設(shè)置方法。
queryWrapper.like("user.username", "Jack")
表示篩選出user
表中username
字段值類似于 “Jack” 的記錄。like
用于模糊匹配,這里會匹配包含 “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 查詢語句。它表示從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
,并且通過@Param("age")
注解將傳入的參數(shù)age
與 SQL 語句中的占位符#{age}
進(jìn)行關(guān)聯(lián)。
例如,如果傳入的 age
值為 20 ,那么這個(gè)查詢就會返回年齡為 20 歲的用戶的 id
、username
以及對應(yīng)的地址信息。
補(bǔ)充:
內(nèi)連接(inner join)
是SQL中最常見的連接類型之一,用于根據(jù)兩個(gè)表之間的共同值來合并數(shù)據(jù)。內(nèi)連接返回兩個(gè)表中滿足連接條件的行,即返回兩個(gè)表中共同的行。
具體來說,內(nèi)連接會根據(jù)連接條件(通常是兩個(gè)表之間的共同字段)將兩個(gè)表中符合條件的行進(jìn)行匹配,并將匹配的結(jié)果作為輸出。如果某行在一個(gè)表中有匹配,但在另一個(gè)表中沒有匹配,那么這行數(shù)據(jù)將不會包含在內(nèi)連接的結(jié)果中。
內(nèi)連接通常使用INNER JOIN
關(guān)鍵字來表示,語法形式如下:
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.共同字段 = 表2.共同字段;
在這個(gè)語句中,
INNER JOIN
表示進(jìn)行內(nèi)連接操作,ON
關(guān)鍵字用于指定連接條件,即指定兩個(gè)表之間用于匹配的共同字段。
內(nèi)連接是SQL中最常用的連接類型之一,用于從多個(gè)表中檢索相關(guān)數(shù)據(jù),是數(shù)據(jù)查詢和分析中非常重要的操作。
分頁查詢
- 準(zhǔn)備分頁對象:MyBatis-Plus提供了
Page
類,用于封裝分頁查詢條件。你需要傳入頁碼和每頁查詢數(shù)量作為參數(shù)。 - 構(gòu)建分頁查詢條件:在查詢條件中指定需要查詢的條件,然后將分頁對象和查詢條件傳遞給
selectPage()
方法。 - 執(zhí)行分頁查詢:調(diào)用
selectPage()
方法執(zhí)行分頁查詢,它會返回一個(gè)IPage
對象,其中包含了查詢結(jié)果和分頁信息。
示例代碼
// 分頁查詢示例 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, Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("age", age); return userMapper.selectPage(page, queryWrapper); }
第一段代碼:分頁查詢示例
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>
,表示分頁查詢的結(jié)果。方法名為selectUserPage
,并接收一個(gè)Page<User>
類型的參數(shù)page
,用于設(shè)置分頁的相關(guān)信息(如當(dāng)前頁碼、每頁條數(shù)等)。QueryWrapper<User> queryWrapper = new QueryWrapper<>();
:創(chuàng)建了一個(gè)用于構(gòu)建查詢條件的QueryWrapper
對象。queryWrapper.eq("age", 18);
:使用eq
方法設(shè)置查詢條件,即篩選出年齡(age
)等于 18 的用戶記錄。return userMapper.selectPage(page, queryWrapper);
:調(diào)用userMapper
中的selectPage
方法進(jìn)行分頁查詢。將之前創(chuàng)建的分頁對象page
和包含查詢條件的queryWrapper
作為參數(shù)傳入,最終返回分頁查詢的結(jié)果。
第二段代碼:自定義分頁查詢示例
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ù),除了分頁對象page
,還有一個(gè)整數(shù)類型的age
參數(shù),用于指定具體的年齡條件。queryWrapper.eq("age", age);
:這里將傳入的age
參數(shù)值作為年齡的篩選條件。- 同樣通過
userMapper.selectPage(page, queryWrapper)
進(jìn)行分頁查詢并返回結(jié)果。
例如,如果在第一段代碼中,假設(shè)每頁顯示 10 條數(shù)據(jù),當(dāng)前是第 2 頁,那么它會返回年齡為 18 歲的用戶數(shù)據(jù),并且按照每頁 10 條,第 2 頁的規(guī)則進(jìn)行分頁。
在第二段代碼中,如果傳入的 age
為 25 ,其他條件相同,那么會返回年齡為 25 歲的用戶數(shù)據(jù)的分頁結(jié)果。
補(bǔ)充:
在上述代碼中,Page<User> page
是一個(gè)用于分頁操作的對象,它具有以下幾個(gè)重要的屬性和功能:
current
:表示當(dāng)前要獲取的頁碼。頁碼從 1 開始計(jì)數(shù)。例如,如果current
的值為 2 ,則表示要獲取的是第 2 頁的數(shù)據(jù)。size
:指定每頁顯示的記錄數(shù)量。例如,如果size
的值為 10 ,則每頁將返回 10 條記錄。除了設(shè)置這兩個(gè)屬性來控制分頁的頁碼和每頁記錄數(shù),Page
對象還可以用于獲取一些與分頁相關(guān)的其他信息,比如:
- 總記錄數(shù):通過調(diào)用相關(guān)方法可以獲取整個(gè)查詢結(jié)果集的總記錄數(shù)。 - 總頁數(shù):根據(jù)總記錄數(shù)和每頁記錄數(shù),可以計(jì)算出總的頁數(shù)。 - 是否有上一頁和下一頁:可以判斷當(dāng)前頁是否有前一頁或后一頁,以便在前端進(jìn)行頁面導(dǎo)航的顯示控制。
假設(shè)我們有一個(gè)數(shù)據(jù)庫表,其中總共有 50 條用戶記錄,并且設(shè)置
page
的size
為 10 :- 如果
current
為 1 ,則會獲取第 1 頁的 10 條記錄(記錄 1 - 10)。 - 如果
current
為 3 ,則會獲取第 3 頁的 10 條記錄(記錄 21 - 30)。
這樣,通過靈活設(shè)置 page
對象的 current
和 size
屬性,就可以實(shí)現(xiàn)對數(shù)據(jù)的分頁獲取和展示。
使用 Page
對象進(jìn)行分頁查詢的完整代碼示例:
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 對象,設(shè)置當(dāng)前頁碼為 2,每頁記錄數(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 自定義的用于表示分頁結(jié)果的接口。通過使用 `IPage` ,可以方便地獲取分頁相關(guān)的信息,如總記錄數(shù)、當(dāng)前頁數(shù)據(jù)、每頁記錄數(shù)、當(dāng)前頁碼、總頁數(shù)等。*/ // 獲取總記錄數(shù) long total = userIPage.getTotal(); // 獲取當(dāng)前頁數(shù)據(jù)列表 List<User> userList = userIPage.getRecords(); // 獲取當(dāng)前頁碼 int currentPage = userIPage.getCurrent(); // 獲取每頁記錄數(shù) int pageSize = userIPage.getSize(); // 獲取總頁數(shù) int totalPages = userIPage.getPages(); System.out.println("總記錄數(shù): " + total); System.out.println("當(dāng)前頁數(shù)據(jù)列表: " + userList); System.out.println("當(dāng)前頁碼: " + currentPage); System.out.println("每頁記錄數(shù): " + pageSize); System.out.println("總頁數(shù): " + totalPages); } }
到此這篇關(guān)于MybatisPlus多表查詢及分頁查詢的文章就介紹到這了,更多相關(guān)MybatisPlus多表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一分鐘掌握J(rèn)ava?ElasticJob分布式定時(shí)任務(wù)
ElasticJob?是面向互聯(lián)網(wǎng)生態(tài)和海量任務(wù)的分布式調(diào)度解決方案,本文主要通過簡單的示例帶大家深入了解ElasticJob分布式定時(shí)任務(wù)的相關(guān)知識,需要的可以參考一下2023-05-05Java定義隊(duì)列結(jié)構(gòu),并實(shí)現(xiàn)入隊(duì)、出隊(duì)操作完整示例
這篇文章主要介紹了Java定義隊(duì)列結(jié)構(gòu),并實(shí)現(xiàn)入隊(duì)、出隊(duì)操作,結(jié)合完整實(shí)例形式分析了java數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的定義、入隊(duì)、出隊(duì)、判斷隊(duì)列是否為空、打印隊(duì)列元素等相關(guān)操作技巧,需要的朋友可以參考下2020-02-02詳解SpringBoot中的統(tǒng)一結(jié)果返回與統(tǒng)一異常處理
這篇文章主要將通過詳細(xì)的討論和實(shí)例演示來幫助你更好地理解和應(yīng)用Spring Boot中的統(tǒng)一結(jié)果返回和統(tǒng)一異常處理,感興趣的小伙伴可以了解下2024-03-03