"); //-->
在現(xiàn)實(shí)的項(xiàng)目中進(jìn)行數(shù)據(jù)庫(kù)建模時(shí),我們要遵循數(shù)據(jù)庫(kù)設(shè)計(jì)范式的要求,會(huì)對(duì)現(xiàn)實(shí)中的業(yè)務(wù)模型進(jìn)行拆分,封裝在不同的數(shù)據(jù)表中,表與表之間存在著一對(duì)多或是多對(duì)多的對(duì)應(yīng)關(guān)系。進(jìn)而,我們對(duì)數(shù)據(jù)庫(kù)的增刪改查操作的主體,也就從單表變成了多表。那么Mybatis中是如何實(shí)現(xiàn)這種多表關(guān)系的映射呢?

查詢結(jié)果集ResultMap
resultMap元素是MyBatis中最重要最強(qiáng)大的元素。它就是讓你遠(yuǎn)離90%的需要從結(jié)果集中取出數(shù)據(jù)的JDBC代碼的那個(gè)東西,而且在一些情形下允許你做一些JDBC不支持的事情。事實(shí)上,編寫(xiě)相似于對(duì)復(fù)雜語(yǔ)句聯(lián)合映射這些等同的代碼,也許可以跨過(guò)上千行的代碼。
有朋友會(huì)問(wèn),之前的示例中我們沒(méi)有用到結(jié)果集,不是也可以正確地將數(shù)據(jù)表中的數(shù)據(jù)映射到Java對(duì)象的屬性中嗎?是的。這正是resultMap元素設(shè)計(jì)的初衷,就是簡(jiǎn)單語(yǔ)句不需要明確的結(jié)果映射,而很多復(fù)雜語(yǔ)句確實(shí)需要描述它們的關(guān)系。
resultMap元素中,允許有以下直接子元素:
constructor-類(lèi)在實(shí)例化時(shí),用來(lái)注入結(jié)果到構(gòu)造方法中(本文中暫不講解)
id-作用與result相同,同時(shí)可以標(biāo)識(shí)出用這個(gè)字段值可以區(qū)分其他對(duì)象實(shí)例??梢岳斫鉃閿?shù)據(jù)表中的主鍵,可以定位數(shù)據(jù)表中唯一一筆記錄
result-將數(shù)據(jù)表中的字段注入到Java對(duì)象屬性中
association-關(guān)聯(lián),簡(jiǎn)單的講,就是“有一個(gè)”關(guān)系,如“用戶”有一個(gè)“帳號(hào)”
collection-集合,顧名思議,就是“有很多”關(guān)系,如“客戶”有很多“訂單”
discriminator-使用結(jié)果集決定使用哪個(gè)個(gè)結(jié)果映射(暫不涉及)
1、嵌套查詢映射
嵌套查詢映射:通過(guò)執(zhí)行另外一個(gè)SQL映射語(yǔ)句來(lái)返回預(yù)期的復(fù)雜類(lèi)型。
想查詢出訂單的時(shí)候去給我關(guān)聯(lián)查詢出該訂單所屬于的用戶信息。(查詢一張表)
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'訂單的狀態(tài)',
`uid`bigint(20)DEFAULTNULLCOMMENT'外鍵',
PRIMARYKEY(`oid`),
KEY`uid`(`uid`),
CONSTRAINT`orders_ibfk_1`FOREIGNKEY(`uid`)REFERENCES`users`(`uid`)
)ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;
UserMapper配置文件如下:
<!--關(guān)聯(lián)查詢出一方-->
<!--查詢訂單的時(shí)候去關(guān)聯(lián)查詢用戶-->
<!--a.嵌套查詢映射只查詢一個(gè)表-->
<selectid="queryOrderWithUser"resultMap="OrderAndUserMap">
select*fromorders
</select>
<!--定義一個(gè)resultMap-->
<!--type:pojo類(lèi)id:resultMap的唯一標(biāo)志-->
<resultMaptype="order"id="OrderAndUserMap">
<!--如果column和pojo屬性名(property)一致可以不寫(xiě)-->
<idcolumn="oid"property="oid"/>
<!--關(guān)聯(lián)查詢出一方
column:外鍵字段
property:關(guān)聯(lián)對(duì)象的屬性名
javaType:寫(xiě)pojo類(lèi)的類(lèi)型
select:寫(xiě)statement對(duì)象的id值
-->
<associationcolumn="uid"property="user"javaType="user"select="queryUserByUid">
<!--<resultcolumn="uname_uu"property="uname"/>-->
</association>
</resultMap>
<selectid="queryUserByUid"parameterType="long"resultMap="myUserMap1">
select*fromuserswhereuid=#{uid}
</select>
<!--配置resultMap-->
<!--需要配置需要的所有屬性不管列明和屬性名是否一致-->
<resultMaptype="order"id="OrderAndUserMap2">
<idcolumn="oid"property="oid"/>
<resultcolumn="oprice"property="oprice"/>
<resultcolumn="flag"property="flag"/>
<resultcolumn="createtime"property="createtime"/>
<!--
property:屬性名
javaType:pojo的類(lèi)型也可以通過(guò)resulteMap指定返回的結(jié)果集
-->
<associationproperty="user"resultMap="myUserMap1"/>
</resultMap>
UserMapper.java接口方法如下:
//查詢訂單去關(guān)聯(lián)查詢用戶
List<Order>queryOrderWithUser();
測(cè)試代碼:
////14.查詢訂單去關(guān)聯(lián)查詢用戶嵌套查詢映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
List<Order>c=mapper.queryOrderWithUser();
System.out.println(c);
}
2、嵌套結(jié)映射
嵌套結(jié)果:使用嵌套結(jié)果映射來(lái)處理重復(fù)的聯(lián)合結(jié)果的子集。
UserMapper.xml
<selectid="queryUserWithOrder2"resultMap="OrderAndUserMap2">
<!--sql左外連接查詢-->
select*fromordersasoleftouterjoinusersasuono.uid=u.uid;
</select>
<!--配置resultMap-->
<!--需要配置需要的所有屬性不管列明和屬性名是否一致-->
<resultMaptype="order"id="OrderAndUserMap2">
<idcolumn="oid"property="oid"/>
<resultcolumn="oprice"property="oprice"/>
<resultcolumn="flag"property="flag"/>
<resultcolumn="createtime"property="createtime"/>
<!--
property:屬性名
javaType:pojo的類(lèi)型也可以通過(guò)resulteMap指定返回的結(jié)果集
-->
<associationproperty="user"resultMap="myUserMap1"/>
</resultMap>
<resultMaptype="user"id="myUserMap1">
<!--配置主鍵映射
column:表的字段
property:pojo的屬性
-->
<idcolumn="uid"property="uid"/>
<!--配置普通屬性-->
<resultcolumn="uname_uu"property="uname"/>
<resultcolumn="sex"property="sex"/>
<resultcolumn="birthday"property="birthday"/>
</resultMap>
UserMapper.java接口方法如下:
//查詢訂單去關(guān)聯(lián)查詢用戶
List<Order>queryOrderWithUser2();
測(cè)試代碼:
////14.查詢訂單去關(guān)聯(lián)查詢用戶嵌套查詢映射
@Test
publicvoidrun14()throwsIOException{
UserMappermapper=sqlSession.getMapper(UserMapper.class);
List<Order>c=mapper.queryOrderWithUser2();
System.out.println(c);
}3、查詢2個(gè)表
自己整一個(gè)pojo類(lèi)把需要用到的user表的字段和order表的字段全都寫(xiě)進(jìn)去直接用resultType
<selectid="queryUserWithOrder2"resultType="UserOrder"> <!--sql左外連接查詢--> select*fromordersasoleftouterjoinusersasuono.uid=u.uid; </select>
最后想要了解更多Java信息的同學(xué)可以前往扣丁學(xué)堂官網(wǎng)咨詢,扣丁學(xué)堂Java培訓(xùn)深受學(xué)員的喜愛(ài)??鄱W(xué)堂不僅有專業(yè)的老師和與時(shí)俱進(jìn)的課程體系,還有大量的Java視頻教程供學(xué)員觀看學(xué)習(xí)哦??鄱W(xué)堂java技術(shù)交流群:487098661。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
相關(guān)推薦
Nordic Semiconductor為nRF9151模組取得了Skylo認(rèn)證,實(shí)現(xiàn)全球物聯(lián)網(wǎng)連接
PIC?單片機(jī)與LED驅(qū)動(dòng)及控制相關(guān)外設(shè)介紹(下)
ASML CEO警告:過(guò)度封鎖或加速中國(guó)技術(shù)自主
基于M·CORE微控制器的嵌入式系統(tǒng)
激光傳輸演示裝置
ucos在78e58上移植的例子
*高薪誠(chéng)聘vxworks技術(shù)高手
關(guān)于PIC24F K-Series的Microstick套件
激光電話
硬核創(chuàng)新·國(guó)之重器|標(biāo)桿級(jí)科研力量齊聚魔都
小型氦氖激光演示儀電路
Flashpgm的問(wèn)題
激光遙控電燈
學(xué)習(xí)ARM的最佳入門(mén)選擇
基于RE46C190的光電式煙霧報(bào)警器的評(píng)估板(用于家用火災(zāi)報(bào)警器的RE46C190芯片)
Dawn Ohlson出任 IET 第 155 任主席,持續(xù)引領(lǐng)工程領(lǐng)域創(chuàng)新與包容發(fā)展
美國(guó)法案擬禁用中國(guó)激光雷達(dá)傳感器
NVIDIA Jetson Orin Nano強(qiáng)勁優(yōu)勢(shì),解鎖視覺(jué)AI無(wú)限潛能
激光峽谷對(duì)講機(jī)
Microchip PIC24F32KA304超低功耗16位單片機(jī)
使用低引腳數(shù)USB開(kāi)發(fā)工具包(DM164127)在應(yīng)用中添加USB連接
2410開(kāi)發(fā)板+8寸屏+techorICE 大餐開(kāi)始上市!
在開(kāi)關(guān)模式電源中使用氮化鎵技術(shù)的注意事項(xiàng)
ucosii在各種處理器上的應(yīng)用
各位兄弟 哪有Nuclues的源碼下載?
一種低成本、高靈活度的電子滾輪測(cè)距方案
ucos在小模式下的移植程序
理解LINUX內(nèi)核
英偉達(dá)正在考慮增加H200芯片的產(chǎn)能
Gemini為何能實(shí)現(xiàn)彎道超車(chē)?谷歌創(chuàng)始人謝爾蓋·布林最新訪談