MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢的操作代碼
引言
在數(shù)據(jù)庫應(yīng)用開發(fā)中,經(jīng)常會遇到需要查詢多個表之間的關(guān)聯(lián)關(guān)系的情況。MyBatis是一個流行的Java持久層框架,它提供了靈活的配置方式來處理多表查詢中的一對多、一對一和多對多關(guān)系。本文將介紹如何在MyBatis中配置和使用這些關(guān)聯(lián)關(guān)系。
一、一對多關(guān)系配置
在數(shù)據(jù)庫中,一對多關(guān)系是指一個表的一條記錄對應(yīng)另一個表的多條記錄。在MyBatis中,我們可以通過以下步驟來配置和使用一對多關(guān)系:
1.創(chuàng)建實體類
首先,我們需要創(chuàng)建兩個實體類,分別表示一對多關(guān)系中的一方和多方。例如,我們創(chuàng)建一個Order類和一個OrderItem類,其中一個訂單可以對應(yī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文件
接下來,我們需要創(chuàng)建Mapper接口和對應(yīng)的XML文件來定義查詢方法和SQL語句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來配置一對多關(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.編寫查詢方法
最后,我們在Mapper接口中定義查詢方法,并在XML文件中配置對應(yīng)的SQL語句。
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.使用一對多關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用一對多關(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);
}
}二、一對一關(guān)系配置
1.創(chuàng)建實體類
首先,我們需要創(chuàng)建兩個實體類,分別表示一對多關(guān)系中的一方和一方。例如,我們創(chuàng)建一個Order類和一個OrderItem類,其中一個訂單可以對應(yī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文件
接下來,我們需要創(chuàng)建Mapper接口和對應(yīng)的XML文件來定義查詢方法和SQL語句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來配置一對一關(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.編寫查詢方法
最后,我們在Mapper接口中定義查詢方法,并在XML文件中配置對應(yīng)的SQL語句。
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.使用一對一關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用一對多關(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));
}
}三、多對多關(guān)系配置
在數(shù)據(jù)庫中,多對多關(guān)系是指兩個表之間存在多對多的關(guān)系。在MyBatis中,我們可以通過以下步驟來配置和使用多對多關(guān)系:
1.創(chuàng)建實體類
首先,我們需要創(chuàng)建兩個實體類,分別表示多對多關(guān)系中的兩個表。例如,我們創(chuàng)建一個User類和一個Role類,一個用戶可以擁有多個角色,一個角色也可以被多個用戶擁有。
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文件
接下來,我們需要創(chuàng)建Mapper接口和對應(yīng)的XML文件來定義查詢方法和SQL語句。在XML文件中,我們可以使用MyBatis的標(biāo)簽來配置多對多關(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.編寫查詢方法
最后,我們在Mapper接口中定義查詢方法,并在XML文件中配置對應(yīng)的SQL語句。
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.使用多對多關(guān)系查詢
現(xiàn)在,我們可以在代碼中使用多對多關(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中配置和使用一對多和多對多關(guān)系的方法。通過合理的實體類設(shè)計、Mapper接口和XML文件的配置,我們可以方便地進(jìn)行多表查詢,并豐富了應(yīng)用程序的功能和靈活性。補(bǔ)充內(nèi)容:在實際開發(fā)中,我們還可以使用MyBatis的動態(tài)SQL和緩存等特性來進(jìn)一步優(yōu)化查詢性能和提高開發(fā)效率。希望本文對您在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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus詳解(環(huán)境搭建、關(guān)聯(lián)操作)
- MybatisPlus實現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢
- mybatis主從表關(guān)聯(lián)查詢,返回對象帶有集合屬性解析
- mybatis多表查詢的實現(xiàn)(xml方式)
- springboot整合mybatis實現(xiàn)多表查詢的實戰(zhàn)記錄
- MyBatis如何實現(xiàn)多表查詢(多對一、一對多)
- MybatisPlus自定義Sql實現(xiàn)多表查詢的示例
- 結(jié)合mybatis-plus實現(xiàn)簡單不需要寫sql的多表查詢
相關(guān)文章
Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法
spring cloud用上了配置中心,就一個boostrap.yml,本文就來介紹一下Spring Cloud 配置中心多環(huán)境配置bootstrap.yml的實現(xiàn)方法,感興趣的可以了解一下2024-03-03
在java中main函數(shù)如何調(diào)用外部非static方法
這篇文章主要介紹了在java中main函數(shù)如何調(diào)用外部非static方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
關(guān)于HttpServletRequest獲取POST請求Body參數(shù)的3種方式
這篇文章主要介紹了關(guān)于HttpServletRequest獲取POST請求Body參數(shù)的3種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Springmvc數(shù)據(jù)格式化原理及代碼案例
這篇文章主要介紹了Springmvc數(shù)據(jù)格式化原理及代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10

