MyBatis自定義resultMap三種映射關(guān)系示例詳解
一、一對一映射(One-to-One)
1.1 表關(guān)系
一對一映射是指一個(gè)對象與另一個(gè)對象具有一對一的關(guān)系。例如,一個(gè)用戶(User)與一個(gè)地址(Address)之間的關(guān)系。假設(shè)我們有以下表結(jié)構(gòu):
user 表:
id (int) name (varchar) address_id (int)
address 表:
id (int) street (varchar) city (varchar)
首先,創(chuàng)建 User 和 Address 實(shí)體類:
User.java
public class User { private int id; private String name; private Address address; // getters and setters }
Address.java
public class Address { private int id; private String street; private String city; // getters and setters }
接下來,創(chuàng)建一個(gè) resultMap 進(jìn)行一對一映射:
1.2 resultMap設(shè)置自定義映射
UserMapper.xml
<resultMap id="UserAddressResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> //一對一關(guān)系使用association <association property="address" javaType="Address"> <id property="id" column="address_id"/> <result property="street" column="street"/> <result property="city" column="city"/> </association> </resultMap>
屬性:
- id:表示自定義映射的唯一標(biāo)識
- type:查詢的數(shù)據(jù)要映射的實(shí)體類的類型
子標(biāo)簽:
- id:設(shè)置主鍵的映射關(guān)系
- result:設(shè)置普通字段的映射關(guān)系
- association :設(shè)置多對一的映射關(guān)系
- collection:設(shè)置一對多的映射關(guān)系
子標(biāo)簽屬性:
- property:設(shè)置映射關(guān)系中實(shí)體類中的屬性名
- column:設(shè)置映射關(guān)系中表中的字段名
最后,編寫一個(gè)查詢方法來使用這個(gè) resultMap:
UserMapper.xml
<select id="findUserWithAddress" resultMap="UserAddressResultMap"> SELECT u.id, u.name, a.id as address_id, a.street, a.city FROM user u INNER JOIN address a ON u.address_id = a.id WHERE u.id = #{id} </select>
最后實(shí)現(xiàn)接口findUserWithAddress方法測試即可,通過以上簡單的案例,我相信你已經(jīng)明白自定義關(guān)系映射了。往往實(shí)際開發(fā)中數(shù)據(jù)和表是要復(fù)雜的多,進(jìn)階用法請看以下示例:
二、一對多映射(One-to-Many)
一對多映射是指一個(gè)對象與多個(gè)對象具有一對多的關(guān)系。例如,一個(gè)訂單(Oeder)與一個(gè)訂單詳情(OrderItem)之間的關(guān)系。假設(shè)我們有以下表結(jié)構(gòu):
2.1 創(chuàng)建實(shí)體
利用mybatis逆向工程(generatorConfig.xml)生成模型層代碼 :
創(chuàng)建 OrderVo
它是一個(gè)值對象(Value Object),繼承 Order
類并添加了一個(gè)額外的屬性 orderItems
。該類用于在應(yīng)用程序的各個(gè)層之間傳遞數(shù)據(jù),尤其是在表示層和業(yè)務(wù)邏輯層之間。在這個(gè)例子中, OrderVo
類用于表示一個(gè)訂單及其關(guān)聯(lián)的訂單項(xiàng)。
package com.ycxw.vo; import com.ycxw.model.Order; import com.ycxw.model.OrderItem; import lombok.Data; import java.util.ArrayList; import java.util.List; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-26 16:30 */ @Data public class OrderVo extends Order { private List<OrderItem> orderItems = new ArrayList<>(); }
2.2 級聯(lián)方式處理映射關(guān)系
<resultMap id="OrderVoMap" type="com.ycxw.vo.OrderVo"> <result column="order_id" property="orderId"></result> <result column="order_no" property="orderNo"></result> //多關(guān)系使用collection <collection property="orderItems" ofType="com.ycxw.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>
2.3 定義SQL
<select id="SelectByOid" resultMap="OrderVoMap" parameterType="java.lang.Integer"> SELECT * FROM t_hibernate_order o, t_hibernate_order_item oi WHERE o.order_id = oi.oid AND o.order_id = #{oid} </select>
2.4 OrderMapper接口
package com.ycxw.mapper; import com.ycxw.model.Order; import com.ycxw.vo.OrderVo; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Repository public interface OrderMapper { OrderVo SelectByOid(@Param("oid") Integer oid); }
2.5 編寫業(yè)務(wù)邏輯層
OrderItmeBiz 接口
package com.ycxw.biz; import com.ycxw.vo.OrderItemVo; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-26 21:48 */ public interface OrderItmeBiz { OrderItemVo SelectByOitemId(Integer oiid); }
OrderBizImpl 接口實(shí)現(xiàn)類
package com.ycxw.biz.impl; import com.ycxw.biz.OrderBiz; import com.ycxw.mapper.OrderMapper; import com.ycxw.vo.OrderVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-26 16:46 */ @Service public class OrderBizImpl implements OrderBiz { @Autowired private OrderMapper orderMapper; @Override public OrderVo SelectByOid(Integer oid) { return orderMapper.SelectByOid(oid); } }
2.6 Junit測試
package com.ycxw.biz.impl; import com.ycxw.biz.OrderBiz; import com.ycxw.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 blog.csdn.net/Justw320 * @create 2023-08-26 16:48 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class OrderBizImplTest { @Autowired private OrderBiz orderBiz; @Test public void selectByOid() { OrderVo orderVo = orderBiz.SelectByOid(8); //獲取訂單 System.out.println(orderVo); //獲取訂單項(xiàng)信息 orderVo.getOrderItems().forEach(System.out::println); } }
運(yùn)行結(jié)果:
三、多對多映射(Many-to-Many)
3.1 表關(guān)系
多對多映射是指多個(gè)對象與多個(gè)對象具有多對多的關(guān)系。表之間的多對多關(guān)系稍微復(fù)雜,需要一個(gè)中間表來表示:
中間表有三個(gè)字段,其中兩個(gè)字段分別作為外鍵指向各自一方的主鍵,由此通過中間表來表示多對多關(guān)系,通過一個(gè)表聯(lián)合另一個(gè)中間表可以表示為一對多關(guān)系。
如:根據(jù)書籍id查找關(guān)聯(lián)屬性類別:
3.2 創(chuàng)建實(shí)體
利用mybatis逆向工程(generatorConfig.xml)生成模型層代碼 :
創(chuàng)建 HBookVo 值對象(Value Object)
package com.ycxw.vo; import com.ycxw.model.BookCategory; import com.ycxw.model.HBook; import lombok.Data; import java.util.List; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-27 21:03 */ @Data public class HBookVo extends HBook { private List<BookCategory> bookc = new ArrayList<>(); }
3.3 處理映射關(guān)系、定義sql
<resultMap id="HBookVoMap" type="com.ycxw.vo.HBookVo" > <result column="book_id" property="bookId"></result> <result column="book_name" property="bookName"></result> <result column="price" property="price"></result> <collection property="bookc" ofType="com.ycxw.model.Category"> <result column="category_id" property="categoryId"></result> <result column="category_name" property="categoryName"></result> </collection> </resultMap> <!--根據(jù)書籍的id查詢書籍的信息及所屬屬性--> <select id="selectByBookId" resultMap="HBookVoMap" parameterType="java.lang.Integer"> SELECT * FROM t_hibernate_book b, t_hibernate_category c, t_hibernate_book_category bc WHERE b.book_id = bc.bid AND c.category_id = bc.bcid AND b.book_id = #{bid} </select>
3.4 HBookMapper 接口
HBookVo selectByBookId(@Param("bid") Integer bid);
3.5 編寫業(yè)務(wù)邏輯層
HBookBiz 接口
package com.ycxw.biz; import com.ycxw.vo.HBookVo; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-29 12:47 */ public interface HBookBiz { HBookVo selectByBookId(Integer bid); }
HBookBizImpl 接口實(shí)現(xiàn)類
package com.ycxw.biz.impl; import com.ycxw.biz.HBookBiz; import com.ycxw.mapper.HBookMapper; import com.ycxw.vo.HBookVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-29 12:48 */ @Service public class HBookBizImpl implements HBookBiz { @Autowired private HBookMapper hBookMapper; @Override public HBookVo selectByBookId(Integer bid) { return hBookMapper.selectByBookId(bid); } }
3.6 Junit測試
package com.ycxw.biz.impl; import com.ycxw.biz.HBookBiz; import com.ycxw.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 blog.csdn.net/Justw320 * @create 2023-08-26 16:48 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class OrderBizImplTest { @Autowired private HBookBiz hBookBiz; @Test public void selectByBookId(){ HBookVo hBookVo = hBookBiz.selectByBookId(22); //數(shù)據(jù)所有信息 System.out.println(hBookVo); //書籍有關(guān)的類別 System.out.println(hBookVo.getBookc()); } }
反之亦然,如:根據(jù)類別id查找書籍信息
<resultMap id="CategotyVoMap" type="com.ycxw.vo.CategoryVo"> <result column="category_id" property="categoryId"></result> <result column="category_name" property="categoryName"></result> <collection property="books" ofType="com.ycxw.model.HBook"> <result column="book_id" property="bookId"></result> <result column="book_name" property="bookName"></result> <result column="price" property="price"></result> </collection> </resultMap> <select id="selectCategoryId" resultMap="CategotyVoMap" parameterType="java.lang.Integer"> SELECT * FROM t_hibernate_book b, t_hibernate_category c, t_hibernate_book_category bc WHERE b.book_id = bc.bid AND c.category_id = bc.bcid AND c.category_id = #{cid} </select>
測試運(yùn)行:
到此這篇關(guān)于MyBatis自定義resultMap三種映射關(guān)系的文章就介紹到這了,更多相關(guān)MyBatis自定義resultMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot文件上傳時(shí)maxPostSize設(shè)置大小失效問題及解決
這篇文章主要介紹了springboot文件上傳時(shí)maxPostSize設(shè)置大小失效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07詳解poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實(shí)例
本篇文章主要介紹了poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01SpringBoot中實(shí)現(xiàn)Redis?Stream隊(duì)列的代碼實(shí)例
本文介紹了如何在Spring?Boot中使用Redis?Stream隊(duì)列進(jìn)行消息的生產(chǎn)和消費(fèi),涉及到的主要內(nèi)容包括添加Redis依賴、配置RedisTemplate、創(chuàng)建生產(chǎn)者和消費(fèi)者監(jiān)聽器等,需要的朋友可以參考下2024-09-09Java使用正則表達(dá)式刪除所有HTML標(biāo)簽的方法示例
這篇文章主要介紹了Java使用正則表達(dá)式刪除所有HTML標(biāo)簽的方法,結(jié)合完整實(shí)例形式分析了java針對HTML頁面元素script標(biāo)簽、style標(biāo)簽、html標(biāo)簽等的正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-06-06java WebSocket實(shí)現(xiàn)聊天消息推送功能
這篇文章主要為大家詳細(xì)介紹了java WebSocket實(shí)現(xiàn)聊天消息推送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07