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