柚子快報(bào)激活碼778899分享:Mybatis——關(guān)聯(lián)關(guān)系映射
柚子快報(bào)激活碼778899分享:Mybatis——關(guān)聯(lián)關(guān)系映射
目錄
一、一對(duì)多
二、多對(duì)多
前言:
什么叫一對(duì)多?
比如一個(gè)老師教多個(gè)班級(jí),
聯(lián)表查詢,拿到每個(gè)班級(jí)詳細(xì)信息及對(duì)應(yīng)授課老師:
select * from teacher right join class on t.id=c.tid? where c.id=T280
什么叫多對(duì)多?
比如一個(gè)書籍表,一個(gè)書籍類別表,中間必有一個(gè)書籍類別中間表
?一本書對(duì)應(yīng)多個(gè)類別,一個(gè)類別對(duì)應(yīng)了多本書。
那么接下來將以訂單表和訂單項(xiàng)表來作為案例進(jìn)行講解(如下圖所示):
一、一對(duì)多
用代碼生成器生成對(duì)應(yīng)的mapper和model(注意不要生成重復(fù)的mapper和model)
generatorConfig.xml:?
?運(yùn)行:
?生成成功:
需求一:
通過訂單號(hào)查詢本次訂單的詳細(xì)信息以及對(duì)應(yīng)的所屬訂單項(xiàng)信息
select * from? t_hibernate_order o ,?t_hibernate_order_item?oi
where o.order_id=oi.oid and o.order_id=9;
需求二:
通過訂單項(xiàng)的id查詢出訂單項(xiàng)詳細(xì)信息及所有訂單
select * from? t_hibernate_order o ,?t_hibernate_order_item?oi
where o.order_id=oi.oid and oi.order_ item_id=43;
(哪一條記錄屬于哪一條主記錄的從記錄)
vo類:
view object:視圖對(duì)象
在對(duì)應(yīng)的orderMpper.xml和orderItemMpper.xml中配置resultMap節(jié)點(diǎn)以及對(duì)應(yīng)的方法:
orderMpper.xml:
select * from t_hibernate_order o,t_hibernate_order_item oi
where o.order_id = oi.oid
and o.order_id = #{orderId}
?orderItemMpper.xml:
select * from t_hibernate_order o,t_hibernate_order_item oi
where o.order_id = oi.oid
and oi.order_item_id = #{orderItemId}
在對(duì)應(yīng)的OrderMapper.java和OrderItemsMapper.java中配置出對(duì)應(yīng)的方法:
OrderMapper.java:
OrderVo queryOrderVoByOrderId(@Param("orderId") Integer orderId);
OrderItemsMapper.java:
OrderItemVo queryOrderItemVoByOrderItemId(@Param("orderItemId") Integer orderItemId);
之后到service層中接口和實(shí)現(xiàn)類中寫好方法
之后配置兩個(gè)表之間的關(guān)系,建立vo類:
兩個(gè)表之間的關(guān)系:
? ? ? ? ? ? ?1、一個(gè)訂單有多個(gè)訂單詳情表
? ? ? ? ? ? ?2、一個(gè)訂單詳情只有一個(gè)訂單
OrderVo :?
package com.ycx.vo;
import com.ycx.model.Order;
import com.ycx.model.OrderItem;
import java.util.ArrayList;
import java.util.List;
public class OrderVo extends Order {
private List
public List
return orderItems;
}
public void setOrderItems(List
this.orderItems = orderItems;
}
@Override
public String toString() {
return "OrderVo{" +
"orderItems=" + orderItems +
'}';
}
}
OrderItemVo :?
package com.ycx.vo;
import com.ycx.model.Order;
import com.ycx.model.OrderItem;
public class OrderItemVo extends OrderItem {
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
@Override
public String toString() {
return "OrderItemVo{" +
"order=" + order +
'}';
}
}
二、多對(duì)多
?1、多對(duì)多關(guān)系就是和一對(duì)多的關(guān)系的大同小異,只是多對(duì)多的關(guān)系可以看成兩個(gè)一對(duì)多關(guān)系。 ?2、多對(duì)多關(guān)系的配置的步驟和一對(duì)多關(guān)系配置是一樣的:(以書籍表、類別表以及書籍類別表為例) ? ? ? ?首先先用逆向生成工具生成t_hibernate_book、t_hibernate_book_category、t_hibernate_category,這兩張表對(duì)應(yīng)的model與mapper
?????????在對(duì)應(yīng)的HbookCategoryMapper.xml配置resultMap節(jié)點(diǎn)以及對(duì)應(yīng)的方法:(為什么只在HbookCategoryMapper.xml中進(jìn)行配置,因?yàn)橹皇且粋€(gè)中間表,可以起到一個(gè)連接的動(dòng)作):
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 = #{bookId}
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 c.category_id=#{cid}
在對(duì)應(yīng)的HbookCategoryMapper.java文件中寫好方法:
package com.ycx.mapper;
import com.ycx.model.HBookC;
import com.ycx.vo.HBookVo;
import com.ycx.vo.HCateVo;
import org.apache.ibatis.annotations.Param;
public interface HBookCMapper {
int deleteByPrimaryKey(Integer bcid);
int insert(HBookC record);
int insertSelective(HBookC record);
HBookC selectByPrimaryKey(Integer bcid);
int updateByPrimaryKeySelective(HBookC record);
int updateByPrimaryKey(HBookC record);
HBookVo queryByBookId(@Param("bookId") Integer bookId);
HCateVo queryByCid(@Param("cid") Integer cid);
}
之后到service層中接口和實(shí)現(xiàn)類中寫好方法
其中要注意的是:配置關(guān)系Vo類和在xxxMap.xml中的配置:
里面用的是collection--->oftype
?
柚子快報(bào)激活碼778899分享:Mybatis——關(guān)聯(lián)關(guān)系映射
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。