淺談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之sql複習】多表關係MyBatisSQL
- #MyBatis多表查詢 #多對一、一對多的兩種實現方式 @FDDLCMyBatis
- python 關係對映Python
- Hibernate 的關聯關係對映
- Spring Boot 入門系列(二十八) JPA 的實體對映關係,一對一,一對多,多對多關係對映!Spring Boot
- RxJava是如何實現訂閱關係的?RxJava
- JPA關係對映系列四:many-to-many 關聯對映
- java物件關係對映ROMJava物件
- Hibernate中實體類對映檔案表與表的關係模版
- Mybatis【15】-- Mybatis一對一多表關聯查詢MyBatis
- JPA關係對映系列五:many-to-many 關聯表存在額外欄位關係對映
- 深入淺出MyBatis:「對映器」全瞭解MyBatis
- 資料庫多對多表關係資料資料庫
- day07-MyBatis的關聯對映01MyBatis
- 『手寫Mybatis』實現對映器的註冊和使用MyBatis
- CRM和ERP的Sales Organization的對映關係
- sql多表的關係介紹SQL
- Hibernate (開源物件關係對映框架)物件框架
- 上下文對映關係中如何解耦特定和通用的領域? - Nick Tune解耦
- 淺談如何實現自定義的 iterator
- 最淺顯易懂的使用nginx實現埠對映的教程Nginx
- 淺談Node中module的實現原理
- Fluent API 配置實體和資料庫之間的對映關係API資料庫
- ERP的Account group和CRM partner group的對映關係
- Mybatis結果對映MyBatis
- Verilog程式碼和FPGA硬體的對映關係(五)FPGA
- Verilog程式碼和FPGA硬體的對映關係(四)FPGA
- 請問這種情況下表關係如何設計
- 淺談OOCSS、SMACSS、BEM三種設計模式與前端架構優化的關係CSSMac設計模式前端架構優化
- 淺談如何實現自定義的 iterator 之二
- Mybatis動態對映,這次終於搞明白了MyBatis
- MyBatis中主鍵回填的兩種實現方式MyBatis
- Mybatis 基礎xml對映MyBatisXML
- Linux埠對映是什麼?如何進行埠對映?Linux