【框架】118:mybatis之多表高級(jí)查詢

?今天是劉小愛(ài)自學(xué)Java的第118天。

感謝你的觀看热鞍,謝謝你。

image

學(xué)習(xí)內(nèi)容安排如下:

  • 補(bǔ)充說(shuō)明知識(shí)點(diǎn):resultMap衔彻,sql片段薇宠。
  • mybatis中的高級(jí)查詢,即多表關(guān)聯(lián)查詢艰额。
  • 查詢主要分為:一對(duì)一澄港,一對(duì)多,多對(duì)多柄沮,本來(lái)打算全學(xué)完的回梧,奈何計(jì)劃趕不上變化逐工。

一、知識(shí)點(diǎn)補(bǔ)充

1resultMap

又要提到前面那個(gè)說(shuō)了好幾遍的起別名問(wèn)題了漂辐,使用resultMap標(biāo)簽也能解決這個(gè)問(wèn)題泪喊。

當(dāng)然該標(biāo)簽最主要的應(yīng)用還是在于多表關(guān)聯(lián)查詢,先對(duì)其有個(gè)初步了解:

image

select標(biāo)簽中resultMap的值為userMap髓涯,根據(jù)這個(gè)值找到對(duì)應(yīng)id的resultMap標(biāo)簽袒啼。

這樣的一個(gè)好處在于獨(dú)立出來(lái)了一個(gè)標(biāo)簽,我們?cè)谠摌?biāo)簽里面可以做很多事情纬纪。

上述中就可以在resultMap標(biāo)簽中使用type屬性說(shuō)明蚓再,其對(duì)應(yīng)的實(shí)體類(lèi)為User。

使用result子標(biāo)簽也可以將數(shù)據(jù)表中的字段和實(shí)體類(lèi)屬性關(guān)聯(lián)起來(lái):

  • column對(duì)應(yīng)的也就是數(shù)據(jù)庫(kù)中的列名包各。
  • property對(duì)應(yīng)的也就是實(shí)體類(lèi)的屬性摘仅。

當(dāng)然取別名的方法還是使用settings開(kāi)啟駝峰匹配方便,不過(guò)resultMap也有其它的應(yīng)用问畅。

2sql片段

我們先看兩條sql語(yǔ)句:

image

在sql語(yǔ)句中娃属,*號(hào)是大忌,它的出現(xiàn)也就意味著性能低下护姆,一般都不會(huì)直接用它矾端。

在這里使用將所有列名都書(shū)寫(xiě)的查詢方式,這兩條sql語(yǔ)句本質(zhì)上其實(shí)就是一回事卵皂。

當(dāng)然具體如何優(yōu)化sql語(yǔ)句秩铆,應(yīng)該沒(méi)這么簡(jiǎn)單,我只是以此引出sql片段這個(gè)知識(shí)點(diǎn)灯变。

如果每次都要書(shū)寫(xiě)這么長(zhǎng)的sql語(yǔ)句殴玛,顯然是一件很麻煩的事情。

所以為了解決這個(gè)問(wèn)題添祸,使用sql片段:

image

將sql語(yǔ)句經(jīng)常被使用的部分抽取成一個(gè)sql片段滚粟,在sql語(yǔ)句中使用<include>標(biāo)簽引用該片段即可。

當(dāng)然關(guān)于sql片段我們專(zhuān)門(mén)創(chuàng)建一個(gè)xml文件存放膝捞,再引用對(duì)應(yīng)的片段也是可以的坦刀。

不過(guò)要注意:在核心配置文件中別忘了引入該映射文件愧沟,我這邊就不說(shuō)詳述了蔬咬。

3高級(jí)查詢引入

表與表之間的關(guān)系,無(wú)外乎就是三種:

  • 一對(duì)一關(guān)系:比如用戶和訂單關(guān)系沐寺。
  • 一對(duì)多關(guān)系:比如訂單和訂單詳情關(guān)系林艘。
  • 多對(duì)多關(guān)系:比如訂單和商品的關(guān)系。

二混坞、一對(duì)一查詢

案例:根據(jù)訂單號(hào)狐援,查詢出訂單信息钢坦,以及下單人信息。

1案例分析

image

①需求分析

因?yàn)樯婕暗接唵涡畔⒈砩督矗拖聠稳诵畔⒈韮蓮埍淼男畔⒌迹孕枰褂玫蕉啾黻P(guān)聯(lián)查詢。

②查詢結(jié)果

其結(jié)果有兩張表的數(shù)據(jù)镶殷,那么如何在Java中接受查詢到的數(shù)據(jù)呢禾酱?

我們知道數(shù)據(jù)表可以對(duì)應(yīng)一個(gè)Java實(shí)體類(lèi),現(xiàn)在有多張表數(shù)據(jù)如何對(duì)應(yīng)一個(gè)Java實(shí)體類(lèi)绘趋?

就可以使用③這種方式颤陶,將User實(shí)體類(lèi)對(duì)象作為Order實(shí)體類(lèi)的成員變量。

2代碼編寫(xiě)

image

①mapper層接口方法

根據(jù)訂單號(hào)查詢訂單和用戶陷遮,參數(shù)為訂單號(hào)滓走,結(jié)果為一個(gè)order對(duì)象。

②映射文件sql語(yǔ)句編寫(xiě)

這不用多說(shuō)帽馋,上述就已經(jīng)分析了搅方。

③測(cè)試代碼

我們會(huì)發(fā)現(xiàn)其查詢結(jié)果中,order實(shí)體類(lèi)中的user屬性為null

為什么會(huì)這樣呢绽族?

因?yàn)閙ybatis并不能自動(dòng)映射user實(shí)體類(lèi)腰懂,所以需要自行配置resultMap。

3代碼優(yōu)化

image

①結(jié)果集類(lèi)型為order

指定結(jié)果集id项秉,編寫(xiě)對(duì)應(yīng)的resultMap標(biāo)簽绣溜。

②association標(biāo)簽

其翻譯過(guò)來(lái)本身就是聯(lián)合的意思。

  • property:也就是order中需要關(guān)聯(lián)的屬性娄蔼,這里也就是user怖喻。
  • javaType:關(guān)聯(lián)屬性對(duì)應(yīng)的Java類(lèi)型,這里也就是User實(shí)體類(lèi)岁诉。

③關(guān)聯(lián)屬性id

User的id在order中對(duì)應(yīng)的也就是user_id锚沸。

再次測(cè)試查詢時(shí),就能發(fā)現(xiàn)查詢結(jié)果中user類(lèi)中的數(shù)據(jù)也能獲取了涕癣。

三哗蜈、一對(duì)多查詢

案例:查詢訂單,查詢出下單人信息并且查詢出訂單詳情坠韩。

image

①sql語(yǔ)句編寫(xiě)

查詢結(jié)果與三張表相關(guān)聯(lián)距潘,那么一共有兩次表關(guān)聯(lián)查詢。

②數(shù)據(jù)庫(kù)查詢結(jié)果

通過(guò)結(jié)果我們可以發(fā)現(xiàn)一個(gè)訂單號(hào)查詢出了2個(gè)訂單詳情只搁。

③Order實(shí)體類(lèi)拓展

訂單和訂單詳情是一對(duì)多關(guān)系音比,那么同理,將訂單詳情的集合封裝成訂單的一個(gè)屬性氢惋。

分析完畢洞翩,代碼編寫(xiě)磕谅,同樣的方式使用resultMap標(biāo)簽桨踪,一次性將代碼寫(xiě)完整。

image

①mapper層接口方法說(shuō)明

②映射文件中sql語(yǔ)句編寫(xiě)

③一對(duì)多查詢,collection標(biāo)簽助币,其本身翻譯過(guò)來(lái)也就是集合的意思:

  • property:屬性名朦蕴,這里也就是封裝到Order類(lèi)中的orderdetails屬性涂圆。
  • javaType:集合類(lèi)型搏存,我們封裝的是List。
  • ofType:集合中的元素類(lèi)型的妖,即泛型绣檬。
  • autoMapping:開(kāi)啟自動(dòng)映射

id子標(biāo)簽:要指定在查詢結(jié)果中orderdetail表中的id,其id我們使用了起別名的方式加以說(shuō)明嫂粟,也就是detail_id娇未。

最后

謝謝你的觀看。

如果可以的話星虹,麻煩幫忙點(diǎn)個(gè)贊零抬,謝謝你。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宽涌,一起剝皮案震驚了整個(gè)濱河市平夜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卸亮,老刑警劉巖忽妒,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兼贸,居然都是意外死亡段直,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)溶诞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸯檬,“玉大人,你說(shuō)我怎么就攤上這事螺垢⌒瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵枉圃,是天一觀的道長(zhǎng)功茴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)讯蒲,這世上最難降的妖魔是什么痊土? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任肄扎,我火速辦了婚禮墨林,結(jié)果婚禮上赁酝,老公的妹妹穿的比我還像新娘。我一直安慰自己旭等,他們只是感情好酌呆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搔耕,像睡著了一般隙袁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弃榨,一...
    開(kāi)封第一講書(shū)人閱讀 49,879評(píng)論 1 290
  • 那天菩收,我揣著相機(jī)與錄音,去河邊找鬼鲸睛。 笑死娜饵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的官辈。 我是一名探鬼主播箱舞,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳亿!你這毒婦竟也來(lái)了晴股?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肺魁,失蹤者是張志新(化名)和其女友劉穎电湘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鹅经,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胡桨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞬雹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昧谊。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酗捌,靈堂內(nèi)的尸體忽然破棺而出呢诬,到底是詐尸還是另有隱情,我是刑警寧澤胖缤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布尚镰,位于F島的核電站,受9級(jí)特大地震影響哪廓,放射性物質(zhì)發(fā)生泄漏狗唉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一涡真、第九天 我趴在偏房一處隱蔽的房頂上張望分俯。 院中可真熱鬧肾筐,春花似錦、人聲如沸缸剪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杏节。三九已至唬渗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奋渔,已是汗流浹背镊逝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫉鲸,地道東北人蹋半。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像充坑,于是被迫代替她去往敵國(guó)和親减江。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350