淺談Mybatis中是如何實現這種多表關係的對映
在現實的專案中進行資料庫建模時,我們要遵循資料庫設計正規化的要求,會對現實中的業務模型進行拆分,封裝在不同的資料表中,表與表之間存在著一對多或是多對多的對應關係。進而,我們對資料庫的增刪改查操作的主體,也就從單表變成了多表。那麼Mybatis中是如何實現這種多表關係的對映呢?
請輸入圖片描述
查詢結果集ResultMap
resultMap元素是MyBatis中最重要最強大的元素。它就是讓你遠離90%的需要從結果集中取出資料的JDBC程式碼的那個東西,而且在一些情形下允許你做一些JDBC不支援的事情。事實上,編寫相似於對複雜語句聯合對映這些等同的程式碼,也許可以跨過上千行的程式碼。
有朋友會問,之前的示例中我們沒有用到結果集,不是也可以正確地將資料表中的資料對映到Java物件的屬性中嗎?是的。這正是resultMap元素設計的初衷,就是簡單語句不需要明確的結果對映,而很多複雜語句確實需要描述它們的關係。
?resultMap元素中,允許有以下直接子元素:
?constructor-類在例項化時,用來注入結果到構造方法中(本文中暫不講解)
?id-作用與result相同,同時可以標識出用這個欄位值可以區分其他物件例項。可以理解為資料表中的主鍵,可以定位資料表中唯一一筆記錄
?result-將資料表中的欄位注入到Java物件屬性中
?association-關聯,簡單的講,就是“有一個”關係,如“使用者”有一個“帳號”
?collection-集合,顧名思議,就是“有很多”關係,如“客戶”有很多“訂單”
?discriminator-使用結果集決定使用哪個個結果對映(暫不涉及)
1.巢狀查詢對映
巢狀查詢對映:通過執行另外一個SQL對映語句來返回預期的複雜型別。
想查詢出訂單的時候去給我關聯查詢出該訂單所屬於的使用者資訊。(查詢一張表)
users表和orders表兩張表如下:
CREATETABLE`users`(
`uid`bigint(20)NOTNULLAUTO_INCREMENT,
`uname_uu`varchar(255)DEFAULTNULL,
`upwd`varchar(255)DEFAULTNULL,
`sex`varchar(255)DEFAULTNULL,
`birthday`dateDEFAULTNULL,
PRIMARYKEY(`uid`)
)ENGINE=InnoDBAUTO_INCREMENT=20DEFAULTCHARSET=utf8;
CREATETABLE`orders`(
`oid`bigint(255)NOTNULLAUTO_INCREMENT,
`oprice`doubleDEFAULTNULL,
`createtime`datetimeDEFAULTNULL,
`flag`varchar(255)DEFAULTNULLCOMMENT'訂單的狀態',
`uid`bigint(20)DEFAULTNULLCOMMENT'外來鍵',
PRIMARYKEY(`oid`),
KEY`uid`(`uid`),
CONSTRAINT`orders_ibfk_1`FOREIGNKEY(`uid`)REFERENCES`users`(`uid`)
)ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;
UserMapper配置檔案如下:
select*fromorders
column:外來鍵欄位
property:關聯物件的屬性名
javaType:寫pojo類的型別
select:寫statement物件的id值
-->
select*fromuserswhereuid=#{uid}
property:屬性名
javaType:pojo的型別也可以通過resulteMap指定返回的結果集
-->
UserMapper.java介面方法如下:
//查詢訂單去關聯查詢使用者
ListqueryOrderWithUser();
測試程式碼:
////14.查詢訂單去關聯查詢使用者巢狀查詢對映
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
Listc=mapper.queryOrderWithUser();
System.out.println(c);
}
2.巢狀結對映
巢狀結果:使用巢狀結果對映來處理重複的聯合結果的子集。
UserMapper.xml
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
property:屬性名
javaType:pojo的型別也可以通過resulteMap指定返回的結果集
-->
column:表的欄位
property:pojo的屬性
-->
UserMapper.java介面方法如下:
//查詢訂單去關聯查詢使用者
ListqueryOrderWithUser2();
測試程式碼:
////14.查詢訂單去關聯查詢使用者巢狀查詢對映
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
Listc=mapper.queryOrderWithUser2();
System.out.println(c);
}
3查詢2個表自己整一個pojo類把需要用到的user表的欄位和order表的欄位全都寫進去直接用resultType
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
相關文章
- mybatis關聯關係對映MyBatis
- MyBatis實現一對一關聯對映MyBatis
- MyBatis加強(1)~myBatis物件關係對映(多對一關係、一對多關係)、延遲/懶載入MyBatis物件
- Mybatis實體關聯對映MyBatis
- MyBatis學習筆記(2)—對映關係篇MyBatis筆記
- 【Mybatis之sql複習】多表關係MyBatisSQL
- #MyBatis多表查詢 #多對一、一對多的兩種實現方式 @FDDLCMyBatis
- 淺談UML中類之間的五種關係及其在程式碼中的表現形式
- python 關係對映Python
- Hibernate 的關聯關係對映
- Mybatis 多表關聯查詢(1) one-to-one關係MyBatis
- RxJava是如何實現訂閱關係的?RxJava
- JPA關係對映系列四:many-to-many 關聯對映
- java物件關係對映ROMJava物件
- hiberate關係對映大全
- Spring Boot 入門系列(二十八) JPA 的實體對映關係,一對一,一對多,多對多關係對映!Spring Boot
- Mybatis【15】-- Mybatis一對一多表關聯查詢MyBatis
- 淺談框架與模式的關係框架模式
- 深入淺出MyBatis:「對映器」全瞭解MyBatis
- Hibernate 實體關聯關係對映—-總結薦
- mybatis學習 - 多表查詢的實現MyBatis
- Hibernate中實體類對映檔案表與表的關係模版
- 社交網站中的人際關係鏈是現實關係鏈的延伸網站
- JPA關係對映系列五:many-to-many 關聯表存在額外欄位關係對映
- MongoDB、Java與物件關係對映MongoDBJava物件
- MongoDB、Java和物件關係對映MongoDBJava物件
- day07-MyBatis的關聯對映01MyBatis
- 『手寫Mybatis』實現對映器的註冊和使用MyBatis
- hibernate(三) 一對多對映關係
- 資料庫多對多表關係資料資料庫
- 請教關於物件與關係間的對映物件
- 上下文對映關係中如何解耦特定和通用的領域? - Nick Tune解耦
- sql多表的關係介紹SQL
- 物件關係對映(ORM)簡單看懂物件ORM
- hibernate 繼承對映關係( JOINED)繼承
- javascript物件的property和prototype是這樣一種關係JavaScript物件
- 淺談如何實現自定義的 iterator
- 淺談Node中module的實現原理