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文件的配置,我們可以方便地進行多表查詢,并豐富了應(yīng)用程序的功能和靈活性。補充內(nèi)容:在實際開發(fā)中,我們還可以使用MyBatis的動態(tài)SQL和緩存等特性來進一步優(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-11Springmvc數(shù)據(jù)格式化原理及代碼案例
這篇文章主要介紹了Springmvc數(shù)據(jù)格式化原理及代碼案例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10