MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢的操作代碼
引言
在數(shù)據(jù)庫(kù)應(yīng)用開發(fā)中,經(jīng)常會(huì)遇到需要查詢多個(gè)表之間的關(guān)聯(lián)關(guān)系的情況。MyBatis是一個(gè)流行的Java持久層框架,它提供了靈活的配置方式來(lái)處理多表查詢中的一對(duì)多、一對(duì)一和多對(duì)多關(guān)系。本文將介紹如何在MyBatis中配置和使用這些關(guān)聯(lián)關(guān)系。
一、一對(duì)多關(guān)系配置
在數(shù)據(jù)庫(kù)中,一對(duì)多關(guān)系是指一個(gè)表的一條記錄對(duì)應(yīng)另一個(gè)表的多條記錄。在MyBatis中,我們可以通過(guò)以下步驟來(lái)配置和使用一對(duì)多關(guān)系:
1.創(chuàng)建實(shí)體類
首先,我們需要?jiǎng)?chuàng)建兩個(gè)實(shí)體類,分別表示一對(duì)多關(guān)系中的一方和多方。例如,我們創(chuàng)建一個(gè)Order類和一個(gè)OrderItem類,其中一個(gè)訂單可以對(duì)應(yīng)多個(gè)訂單項(xiàng)。
public class Order {
private Long id;
private String orderNo;
private List<OrderItem> orderItems;
// 省略getter和setter方法
}
public class OrderItem {
private Long id;
private String productName;
// 省略getter和setter方法
}
package com.yuan.vo;
import com.yuan.model.Order;
import com.yuan.model.OrderItem;
import java.util.ArrayList;
import java.util.List;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 11:48
*/
public class OrderVO extends Order {
private List<OrderItem> list = new ArrayList<>();
public List<OrderItem> getList() {
return list;
}
public void setList(List<OrderItem> list) {
this.list = list;
}
}2.創(chuàng)建Mapper接口和XML文件
接下來(lái),我們需要?jiǎng)?chuàng)建Mapper接口和對(duì)應(yīng)的XML文件來(lái)定義查詢方法和SQL語(yǔ)句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來(lái)配置一對(duì)多關(guān)系。
<!-- OrderMapper.xml -->
<mapper namespace="com.yuan.mapper.OrderMapper">
<resultMap id="OrderVoMap" type="com.yuan.vo.OrderVO" >
<result column="order_id" property="orderId"></result>
<result column="order_no" property="orderNo"></result>
<collection property="list" ofType="com.yuan.model.OrderItem">
<result column="order_item_id" property="orderItemId"></result>
<result column="product_id" property="productId"></result>
<result column="quantity" property="quantity"></result>
<result column="oid" property="oid"></result>
</collection>
</resultMap>
<select id="demo1" resultMap="OrderVoMap" parameterType="java.lang.Integer" >
select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and o.order_id = #{oid}
</select>
</mapper>3.編寫查詢方法
最后,我們?cè)贛apper接口中定義查詢方法,并在XML文件中配置對(duì)應(yīng)的SQL語(yǔ)句。
package com.yuan.Biz;
import com.yuan.vo.OrderVO;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 13:08
*/
public interface OrderBiz {
OrderVO demo1(Integer oid);
}4.使用一對(duì)多關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用一對(duì)多關(guān)系查詢了。
package com.yuan.Biz.Impl;
import com.yuan.Biz.OrderBiz;
import com.yuan.vo.OrderVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 13:13
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {
@Autowired
private OrderBiz orderBiz;
@Test
public void demo1() {
OrderVO orderVO = orderBiz.demo1(7);
System.out.println(orderVO);
orderVO.getList().forEach(System.out::println);
}
}二、一對(duì)一關(guān)系配置
1.創(chuàng)建實(shí)體類
首先,我們需要?jiǎng)?chuàng)建兩個(gè)實(shí)體類,分別表示一對(duì)多關(guān)系中的一方和一方。例如,我們創(chuàng)建一個(gè)Order類和一個(gè)OrderItem類,其中一個(gè)訂單可以對(duì)應(yīng)一個(gè)訂單項(xiàng)。
public class Order {
private Long id;
private String orderNo;
private List<OrderItem> orderItems;
// 省略getter和setter方法
}
public class OrderItem {
private Long id;
private String productName;
// 省略getter和setter方法
}
package com.yuan.vo;
import com.yuan.model.Order;
import com.yuan.model.OrderItem;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 13:58
*/
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}2.創(chuàng)建Mapper接口和XML文件
接下來(lái),我們需要?jiǎng)?chuàng)建Mapper接口和對(duì)應(yīng)的XML文件來(lái)定義查詢方法和SQL語(yǔ)句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來(lái)配置一對(duì)一關(guān)系。
<resultMap id="OrderItemVoMap" type="com.yuan.vo.OrderItemVo">
<result column="order_item_id" property="orderItemId"></result>
<result column="product_id" property="productId"></result>
<result column="quantity" property="quantity"></result>
<result column="oid" property="oid"></result>
<association property="order" javaType="com.yuan.model.Order">
<result column="order_id" property="orderId"></result>
<result column="order_no" property="orderNo"></result>
</association>
</resultMap>
<select id="demo2" resultMap="OrderItemVoMap" parameterType="java.lang.Integer" >
select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and oit.order_item_id = #{oiid}
</select>3.編寫查詢方法
最后,我們?cè)贛apper接口中定義查詢方法,并在XML文件中配置對(duì)應(yīng)的SQL語(yǔ)句。
package com.yuan.Biz;
import com.yuan.model.OrderItem;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 14:03
*/
public interface OrderItemBiz {
OrderItem demo2( Integer oiid);
}4.使用一對(duì)一關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用一對(duì)多關(guān)系查詢了。
package com.yuan.Biz.Impl;
import com.yuan.Biz.OrderItemBiz;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 14:06
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderItemBizImplTest {
@Autowired
private OrderItemBiz orderItemBiz;
@Test
public void demo2() {
System.out.println(orderItemBiz.demo2(27));
}
}三、多對(duì)多關(guān)系配置
在數(shù)據(jù)庫(kù)中,多對(duì)多關(guān)系是指兩個(gè)表之間存在多對(duì)多的關(guān)系。在MyBatis中,我們可以通過(guò)以下步驟來(lái)配置和使用多對(duì)多關(guān)系:
1.創(chuàng)建實(shí)體類
首先,我們需要?jiǎng)?chuàng)建兩個(gè)實(shí)體類,分別表示多對(duì)多關(guān)系中的兩個(gè)表。例如,我們創(chuàng)建一個(gè)User類和一個(gè)Role類,一個(gè)用戶可以擁有多個(gè)角色,一個(gè)角色也可以被多個(gè)用戶擁有。
package com.yuan.model;
import lombok.ToString;
@ToString
public class HBook {
private Integer bookId;
private String bookName;
private Float price;
public HBook(Integer bookId, String bookName, Float price) {
this.bookId = bookId;
this.bookName = bookName;
this.price = price;
}
public HBook() {
super();
}
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
}
package com.yuan.model;
import lombok.ToString;
@ToString
public class HBookCategory {
private Integer bcid;
private Integer bid;
private Integer cid;
public HBookCategory(Integer bcid, Integer bid, Integer cid) {
this.bcid = bcid;
this.bid = bid;
this.cid = cid;
}
public HBookCategory() {
super();
}
public Integer getBcid() {
return bcid;
}
public void setBcid(Integer bcid) {
this.bcid = bcid;
}
public Integer getBid() {
return bid;
}
public void setBid(Integer bid) {
this.bid = bid;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
}
package com.yuan.model;
import lombok.ToString;
@ToString
public class HCategory {
private Integer categoryId;
private String categoryName;
public HCategory(Integer categoryId, String categoryName) {
this.categoryId = categoryId;
this.categoryName = categoryName;
}
public HCategory() {
super();
}
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
package com.yuan.vo;
import com.yuan.model.HBook;
import com.yuan.model.HCategory;
import java.util.List;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 20:35
*/
public class HbookVo extends HBook {
private List<HCategory> categories ;
public List<HCategory> getCategories() {
return categories;
}
public void setCategories(List<HCategory> categories) {
this.categories = categories;
}
}2.創(chuàng)建Mapper接口和XML文件
接下來(lái),我們需要?jiǎng)?chuàng)建Mapper接口和對(duì)應(yīng)的XML文件來(lái)定義查詢方法和SQL語(yǔ)句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來(lái)配置多對(duì)多關(guān)系。
<resultMap id="HookVoMap" type="com.yuan.vo.HbookVo" >
<result column="book_id" property="bookId"></result>
<result column="book_name" property="bookName"></result>
<result column="price" property="price"></result>
<collection property="categories" ofType="com.yuan.model.HCategory">
<result column="category_id" property="categoryId"></result>
<result column="category_name" property="categoryName"></result>
</collection>
</resultMap>
<select id="demo3" resultMap="HookVoMap" parameterType="java.lang.Integer">
select * from t_hibernate_book b ,t_hibernate_book_category bc,t_hibernate_category c
where b.book_id = bc.bid
and bc.cid = c.category_id
and b.book_id = #{bid}
</select>3.編寫查詢方法
最后,我們?cè)贛apper接口中定義查詢方法,并在XML文件中配置對(duì)應(yīng)的SQL語(yǔ)句。
package com.yuan.Biz.Impl;
import com.yuan.Biz.HBookBiz;
import com.yuan.mapper.HBookMapper;
import com.yuan.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 21:23
*/
@Service
public class HBookBizImpl implements HBookBiz {
@Autowired
private HBookMapper hBookMapper;
@Override
public HbookVo demo3(Integer bid) {
return hBookMapper.demo3(bid);
}
}4.使用多對(duì)多關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用多對(duì)多關(guān)系查詢了。
package com.yuan.Biz.Impl;
import com.yuan.Biz.HBookBiz;
import com.yuan.vo.HbookVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author 葉秋
* @site
* @company 卓京公司
* @create 2023-09-01 21:24
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {
@Autowired
private HBookBiz hBookBiz;
@Test
public void demo3() {
HbookVo hbookVo = hBookBiz.demo3(8);
System.out.println(hbookVo);
hbookVo.getCategories().forEach(System.out::println);
}
}總結(jié)
本文介紹了在MyBatis中配置和使用一對(duì)多和多對(duì)多關(guān)系的方法。通過(guò)合理的實(shí)體類設(shè)計(jì)、Mapper接口和XML文件的配置,我們可以方便地進(jìn)行多表查詢,并豐富了應(yīng)用程序的功能和靈活性。補(bǔ)充內(nèi)容:在實(shí)際開發(fā)中,我們還可以使用MyBatis的動(dòng)態(tài)SQL和緩存等特性來(lái)進(jìn)一步優(yōu)化查詢性能和提高開發(fā)效率。希望本文對(duì)您在MyBatis中處理關(guān)聯(lián)關(guān)系有所幫助。
到此這篇關(guān)于MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢的文章就介紹到這了,更多相關(guān)MyBatis關(guān)聯(lián)關(guān)系配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus詳解(環(huán)境搭建、關(guān)聯(lián)操作)
- MybatisPlus實(shí)現(xiàn)對(duì)象嵌套關(guān)聯(lián)查詢一對(duì)多List集合查詢
- mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析
- mybatis多表查詢的實(shí)現(xiàn)(xml方式)
- springboot整合mybatis實(shí)現(xiàn)多表查詢的實(shí)戰(zhàn)記錄
- MyBatis如何實(shí)現(xiàn)多表查詢(多對(duì)一、一對(duì)多)
- MybatisPlus自定義Sql實(shí)現(xiàn)多表查詢的示例
- 結(jié)合mybatis-plus實(shí)現(xiàn)簡(jiǎn)單不需要寫sql的多表查詢
相關(guān)文章
解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類型映射問題
這篇文章主要介紹了解決mybatis 數(shù)據(jù)庫(kù)date 與 java中Date類型映射問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)吧2020-11-11
使用IDEA啟動(dòng)項(xiàng)目build時(shí)出現(xiàn)OOM相關(guān)異常的解決
這篇文章主要介紹了使用IDEA啟動(dòng)項(xiàng)目build時(shí)出現(xiàn)OOM相關(guān)異常的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Springboot 全局日期格式化處理的實(shí)現(xiàn)
這篇文章主要介紹了Springboot 全局日期格式化處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Java 實(shí)現(xiàn) ReAct Agent工具調(diào)用與推理循環(huán)的過(guò)程
文章介紹了Agent的概念,與普通LLM的區(qū)別,并詳細(xì)講解了ReAct模式,包括定義工具、ReAct Prompt模板、構(gòu)建推理循環(huán)和工具執(zhí)行邏輯,還對(duì)比了j-langchain和LangChain Python的特點(diǎn),強(qiáng)調(diào)了j-langchain的透明度和可調(diào)試性2026-04-04
java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決
這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-02-02
Spring使用@Async出現(xiàn)循環(huán)依賴原因及解決方案分析
在Spring框架中,啟用異步功能需要在應(yīng)用主類上添加@EnableAsync注解,當(dāng)項(xiàng)目中存在循環(huán)引用時(shí),如一個(gè)異步類MessageService和一個(gè)常規(guī)類TaskService相互引用,并且這兩個(gè)類位于同一包內(nèi),這種情況下可能會(huì)觸發(fā)Spring的循環(huán)依賴異常2024-10-10

