mybatis 一對(duì)多嵌套查詢的實(shí)現(xiàn)
在MyBatis中,處理一對(duì)多關(guān)系的查詢主要涉及到關(guān)聯(lián)映射配置以及在Mapper XML文件中編寫(xiě)SQL查詢。以下是一個(gè)簡(jiǎn)單的例子說(shuō)明如何在MyBatis中實(shí)現(xiàn)一對(duì)多查詢。假設(shè)我們有兩個(gè)實(shí)體類(lèi):User和Order,一個(gè)用戶可以有多個(gè)訂單,這是一種一對(duì)多的關(guān)系。1. 首先,在User實(shí)體類(lèi)中定義一個(gè)Order集合屬性:
1. 首先,在User實(shí)體類(lèi)中定義一個(gè)Order集合屬性:
public class Order {
private int id;
private String productName;
// 省略其他屬性...
// 定義User的外鍵引用
private int userId;
private User user; // 可選,取決于是否需要雙向關(guān)聯(lián)
// 省略getter和setter方法...
}
2. 在Order實(shí)體類(lèi)中定義User的外鍵引用:
public class User {
private int id;
private String username;
// 省略其他屬性...
// 定義一個(gè)Order集合屬性
private List<Order> orders;
// 省略getter和setter方法...
}
3. 在User的Mapper XML文件中配置一對(duì)多關(guān)系查詢:
<mapper namespace="com.example.mapper.UserMapper">
<!-- 查詢用戶基本信息 -->
<select id="getUserById" parameterType="int" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 一對(duì)多關(guān)聯(lián)查詢用戶的所有訂單 -->
<select id="getUserAndOrdersById" parameterType="int" resultType="com.example.entity.User">
SELECT u.*, o.* FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
<!-- 使用association標(biāo)簽配置一對(duì)一關(guān)系 -->
<resultMap id="userResultMap" type="com.example.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<!-- 省略其他字段映射 -->
<!-- 一對(duì)多關(guān)聯(lián)映射 -->
<collection property="orders" ofType="com.example.entity.Order">
<id property="id" column="order_id"/>
<result property="productName" column="product_name"/>
<!-- 省略其他字段映射 -->
<!-- 設(shè)置關(guān)聯(lián)外鍵 -->
<association property="user" javaType="com.example.entity.User" column="user_id" select="com.example.mapper.UserMapper.getUserById"/>
</collection>
</resultMap>
<!-- 使用resultMap進(jìn)行查詢 -->
<select id="getUserWithResultMapById" parameterType="int" resultMap="userResultMap">
SELECT * FROM user u
LEFT JOIN order o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>
在這里,我們展示了兩種一對(duì)多查詢的方式:
- 直接通過(guò)聯(lián)合查詢獲取所有用戶和訂單信息,然后在User實(shí)體類(lèi)中直接解析訂單集合。
- 使用<collection>標(biāo)簽在<resultMap>中定義一對(duì)多關(guān)聯(lián),這樣MyBatis會(huì)自動(dòng)將查詢結(jié)果映射到User實(shí)體類(lèi)中的orders集合屬性。在實(shí)際應(yīng)用中,通常會(huì)選擇第二種方式,因?yàn)樗邤U(kuò)展性和可維護(hù)性。尤其是在處理深層次和復(fù)雜的關(guān)聯(lián)關(guān)系時(shí),<resultMap>的優(yōu)勢(shì)更為明顯。
在MyBatisPlus中,處理一對(duì)多關(guān)系的查詢相對(duì)較為簡(jiǎn)便,主要是借助于模型類(lèi)的關(guān)聯(lián)注解以及特殊的查詢方法。以下是一個(gè)簡(jiǎn)化的例子:假設(shè)我們有兩個(gè)實(shí)體類(lèi):User和Order,一個(gè)用戶可以有多個(gè)訂單,這是一種一對(duì)多的關(guān)系。
1. 首先,在User實(shí)體類(lèi)中定義一個(gè)Order集合屬性,并使用@TableField注解標(biāo)明關(guān)聯(lián)關(guān)系:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.List;
@TableName("user")
public class User {
@TableId("id")
private Long id;
private String username;
// 通過(guò)@TableField注解關(guān)聯(lián)Order表
@TableField(exist = false)
private List<Order> orders;
// getter和setter方法...
}
2. 在Order實(shí)體類(lèi)中定義User的外鍵引用:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("order")
public class Order {
@TableId("id")
private Long id;
private String productName;
@TableField("user_id")
private Long userId;
// getter和setter方法...
}3. 使用MyBatisPlus的內(nèi)置方法進(jìn)行關(guān)聯(lián)查詢:
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IService<User> {
public User getUserAndOrders(Long userId) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", userId);
// 使用lambda表達(dá)式加載關(guān)聯(lián)的orders
queryWrapper.lambda().with(User::getOrders);
return baseMapper.selectOne(queryWrapper);
}
}
在上述代碼中,通過(guò)queryWrapper.lambda().with(User::getOrders);這一行,我們告訴MyBatisPlus在查詢用戶的同時(shí)加載關(guān)聯(lián)的訂單信息。這樣,當(dāng)你調(diào)用getUserAndOrders方法并返回用戶對(duì)象時(shí),用戶對(duì)象的orders屬性就已經(jīng)包含了該用戶的所有訂單信息。注意,為了實(shí)現(xiàn)這樣的關(guān)聯(lián)查詢,還需要確保數(shù)據(jù)庫(kù)表結(jié)構(gòu)符合關(guān)聯(lián)關(guān)系(例如在order表中有user_id作為外鍵指向user表的id),并且在對(duì)應(yīng)的UserMapper和OrderMapper中完成了基本的CRUD方法映射。MyBatisPlus會(huì)自動(dòng)處理內(nèi)部的一對(duì)多關(guān)聯(lián)查詢邏輯。
到此這篇關(guān)于mybatis 一對(duì)多嵌套查詢的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)mybatis 一對(duì)多嵌套查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot +MybatisPlus集成多數(shù)據(jù)源的使用案例
這篇文章主要介紹了SpringBoot +MybatisPlus集成多數(shù)據(jù)源的使用案例,本文分步驟結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-05-05
springBoot2.6.2自動(dòng)裝配之注解源碼解析
對(duì)于springboot個(gè)人認(rèn)為它就是整合了各種組件,然后提供對(duì)應(yīng)的自動(dòng)裝配和啟動(dòng)器(starter),基于這個(gè)流程去實(shí)現(xiàn)一個(gè)定義的裝配組件,下面這篇文章主要給大家介紹了關(guān)于springBoot2.6.2自動(dòng)裝配之注解源碼解析的相關(guān)資料,需要的朋友可以參考下2022-01-01
Spring Boot定制type Formatters實(shí)例詳解
在本篇文章里小編給大家整理的是關(guān)于Spring Boot定制type Formatters實(shí)例知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。2019-11-11
Java爬蟲(chóng)實(shí)戰(zhàn)抓取一個(gè)網(wǎng)站上的全部鏈接
這篇文章主要介紹了JAVA使用爬蟲(chóng)抓取網(wǎng)站網(wǎng)頁(yè)內(nèi)容的方法,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2016-10-10
Java 高并發(fā)十: JDK8對(duì)并發(fā)的新支持詳解
本文主要介紹Java 高并發(fā)JDK8的支持,這里整理了詳細(xì)的資料及1. LongAdder 2. CompletableFuture 3. StampedLock的介紹,有興趣的小伙伴可以參考下2016-09-09
Spring AOP在web應(yīng)用中的使用方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Spring AOP在web應(yīng)用中的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring AOP具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Java selenium上傳文件的實(shí)現(xiàn)
本文主要介紹了Java selenium上傳文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04

