Mybatisplus多表關聯(lián)分頁查詢多種實現(xiàn)方式
在 MyBatis-Plus 中,雖然沒有直接支持多表關聯(lián)查詢的內(nèi)置方法,但可以通過以下幾種方式實現(xiàn)多表關聯(lián)分頁查詢:
1. 使用 MyBatis-Plus 配合 XML 自定義 SQL 實現(xiàn)多表關聯(lián)分頁查詢
這是最常用的方式,通過自定義 SQL 查詢可以實現(xiàn)較復雜的關聯(lián)查詢,結合 MyBatis-Plus 的 IPage
接口,可以實現(xiàn)分頁效果。
實現(xiàn)步驟
- 定義查詢方法:在 Mapper 接口中定義分頁查詢方法。
- 編寫 XML 查詢語句:在 Mapper XML 文件中編寫 SQL 查詢,包括分頁邏輯。
- 調(diào)用分頁插件:在服務層調(diào)用分頁查詢方法。
示例代碼
實體類定義
假設有兩個實體類:User
和 Order
,我們想查詢用戶及其對應的訂單列表。
@Data public class User { private Long id; private String name; } @Data public class Order { private Long id; private Long userId; private String productName; }
Mapper 接口定義
在 UserMapper
中定義分頁查詢方法:
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; public interface UserMapper extends BaseMapper<User> { IPage<User> selectUserOrders(Page<?> page, @Param("userId") Long userId); }
Mapper XML 編寫多表關聯(lián)查詢
在 UserMapper.xml
中定義多表關聯(lián) SQL 查詢:
<select id="selectUserOrders" resultType="User"> SELECT u.*, o.product_name FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{userId} </select>
Service 調(diào)用分頁查詢
@Autowired private UserMapper userMapper; public IPage<User> getUserOrders(Page<User> page, Long userId) { return userMapper.selectUserOrders(page, userId); }
在調(diào)用此方法時傳入 Page
對象,MyBatis-Plus 會自動處理分頁參數(shù)。
Page<User> page = new Page<>(1, 10); // 分頁參數(shù):第1頁,每頁10條 IPage<User> result = userService.getUserOrders(page, 1L);
2. 使用 MyBatis-Plus 的 Wrapper 搭配 自定義 SQL 實現(xiàn)分頁查詢
可以通過 Wrapper
搭配 自定義 SQL
的方式實現(xiàn)關聯(lián)查詢并分頁。此方法靈活,但需要自行編寫 SQL 語句。
示例代碼
在 UserMapper
中定義查詢方法:
@Select("SELECT u.*, o.product_name " + "FROM user u LEFT JOIN order o ON u.id = o.user_id " + "WHERE u.id = #{userId}") IPage<User> selectUserOrdersCustom(Page<?> page, @Param("userId") Long userId);
在 Service 層直接調(diào)用分頁查詢:
Page<User> page = new Page<>(1, 10); // 分頁參數(shù) IPage<User> result = userMapper.selectUserOrdersCustom(page, 1L);
3. 使用 MyBatis-Plus 配合 Wrapper 和 關聯(lián)查詢 DTO 實現(xiàn)分頁查詢
使用 DTO(數(shù)據(jù)傳輸對象)作為查詢結果,將查詢到的字段映射到 DTO 中,減少數(shù)據(jù)庫字段和實體類的耦合。
示例代碼
定義查詢結果的 DTO 類
@Data public class UserOrderDTO { private Long userId; private String userName; private String productName; }
定義 UserMapper 的查詢方法
@Select("SELECT u.id AS userId, u.name AS userName, o.product_name AS productName " + "FROM user u LEFT JOIN order o ON u.id = o.user_id " + "WHERE u.id = #{userId}") IPage<UserOrderDTO> selectUserOrderDTO(Page<?> page, @Param("userId") Long userId);
Service 調(diào)用分頁查詢
Page<UserOrderDTO> page = new Page<>(1, 10); // 分頁參數(shù) IPage<UserOrderDTO> result = userMapper.selectUserOrderDTO(page, 1L);
通過 DTO,將分頁數(shù)據(jù)返回,避免直接使用實體類作為結果對象,可以增加查詢的靈活性和復用性。
4. 使用 MyBatis-Plus 與 PageHelper 配合實現(xiàn)多表關聯(lián)分頁查詢
雖然 MyBatis-Plus 自帶分頁插件,但在復雜的多表查詢中,也可以結合 PageHelper
使用分頁功能。
實現(xiàn)步驟
添加 PageHelper 依賴:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
在查詢方法中調(diào)用 PageHelper.startPage()
設置分頁參數(shù)。
示例代碼
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; public PageInfo<UserOrderDTO> getUserOrdersPage(int pageNum, int pageSize, Long userId) { PageHelper.startPage(pageNum, pageSize); List<UserOrderDTO> list = userMapper.selectUserOrderList(userId); return new PageInfo<>(list); }
通過 PageHelper.startPage(pageNum, pageSize);
配置分頁,然后使用 PageInfo
封裝返回結果,獲取分頁數(shù)據(jù)。
總結
實現(xiàn)方式 | 優(yōu)點 | 適用場景 |
---|---|---|
XML 自定義 SQL | 靈活性高,可實現(xiàn)復雜的關聯(lián)查詢 | 復雜 SQL 關聯(lián)查詢 |
Wrapper 自定義 SQL | 靈活性高,支持簡單關聯(lián)查詢 | 簡單的多表關聯(lián)查詢 |
使用 DTO 與自定義 SQL | 減少實體類耦合,增加查詢靈活性 | 需要返回特定字段的查詢 |
MyBatis-Plus + PageHelper 分頁查詢 | 與 PageHelper 結合,可適應復雜分頁場景 | 復雜的關聯(lián)分頁查詢 |
通過以上方法,您可以根據(jù)項目的需求和復雜度選擇合適的多表關聯(lián)分頁查詢方式。
到此這篇關于Mybatisplus多表關聯(lián)分頁查詢多種實現(xiàn)方式的文章就介紹到這了,更多相關Mybatisplus多表關聯(lián)分頁查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot從application.properties中注入list,?map方式
這篇文章主要介紹了springboot從application.properties中注入list,map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Android bdflow數(shù)據(jù)庫神器的使用
這篇文章主要介紹了Android bdflow數(shù)據(jù)庫神器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Spring Cloud @RefreshScope 原理及使用
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01vue+springboot上傳文件、圖片、視頻及回顯到前端詳解
一般來說vue可以使用axios或者fetch等ajax庫發(fā)送文件請求,而springboot則可以使用Spring MVC的方式來處理上傳文件請求,下面這篇文章主要給大家介紹了關于vue+springboot上傳文件、圖片、視頻及回顯到前端的相關資料,需要的朋友可以參考下2023-04-04Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)
這篇文章主要給大家介紹了關于Java如何使用Optional與Stream取代if判空邏輯(JDK8以上)的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09