久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

專欄中心

EEPW首頁(yè) > 專欄 > 扣丁學(xué)堂Java培訓(xùn)之Mybatis中是如何實(shí)現(xiàn)這種多表關(guān)系的

扣丁學(xué)堂Java培訓(xùn)之Mybatis中是如何實(shí)現(xiàn)這種多表關(guān)系的

發(fā)布人:扣丁客 時(shí)間:2020-12-09 來(lái)源:工程師 發(fā)布文章

在現(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)鍵詞:

相關(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ù)自主

2025-12-16

ucos在78e58上移植的例子

關(guān)于PIC24F K-Series的Microstick套件

硬核創(chuàng)新·國(guó)之重器|標(biāo)桿級(jí)科研力量齊聚魔都

2025-12-16

基于RE46C190的光電式煙霧報(bào)警器的評(píng)估板(用于家用火災(zāi)報(bào)警器的RE46C190芯片)

Dawn Ohlson出任 IET 第 155 任主席,持續(xù)引領(lǐng)工程領(lǐng)域創(chuàng)新與包容發(fā)展

2025-12-16

美國(guó)法案擬禁用中國(guó)激光雷達(dá)傳感器

2025-12-16

NVIDIA Jetson Orin Nano強(qiáng)勁優(yōu)勢(shì),解鎖視覺(jué)AI無(wú)限潛能

Microchip PIC24F32KA304超低功耗16位單片機(jī)

使用低引腳數(shù)USB開(kāi)發(fā)工具包(DM164127)在應(yīng)用中添加USB連接

在開(kāi)關(guān)模式電源中使用氮化鎵技術(shù)的注意事項(xiàng)

ucosii在各種處理器上的應(yīng)用

一種低成本、高靈活度的電子滾輪測(cè)距方案

嵌入式系統(tǒng) 2025-12-16

ucos在小模式下的移植程序

理解LINUX內(nèi)核

英偉達(dá)正在考慮增加H200芯片的產(chǎn)能

2025-12-16

Gemini為何能實(shí)現(xiàn)彎道超車(chē)?谷歌創(chuàng)始人謝爾蓋·布林最新訪談

更多 培訓(xùn)課堂
更多 焦點(diǎn)
更多 視頻

技術(shù)專區(qū)