Mybatis級聯(lián)

1污桦、Mybatis級聯(lián)分為哪些種類亩歹?如何使用?

2、簡述級聯(lián)使用中的N-1問題和延遲加載

Mybatis級聯(lián)有2種小作,下面是分類及使用:

1亭姥、一對一關(guān)聯(lián)

MyBatis中使用association標(biāo)簽來解決一對一的關(guān)聯(lián)查詢,association標(biāo)簽可用的屬性如下:

property:對象屬性的名稱

javaType:對象屬性的類型

column:所對應(yīng)的外鍵字段名稱

select:使用另一個查詢封裝的結(jié)果

2顾稀、一對多關(guān)聯(lián)

MyBatis中使用collection標(biāo)簽來解決一對多的關(guān)聯(lián)查詢致份,ofType屬性指定集合中元素的對象類型。

級聯(lián)中的N+1問題

N+1問題來源于數(shù)據(jù)庫中常見的級聯(lián)技術(shù)础拨,即N個數(shù)據(jù)庫表形成關(guān)聯(lián)關(guān)系氮块,當(dāng)再增加一個關(guān)聯(lián)表時,也就是N+1個級聯(lián)關(guān)系诡宗,由于某些時候滔蝉,我們并不需要加載數(shù)據(jù)庫的所有數(shù)據(jù),而是某一個數(shù)據(jù)庫表中數(shù)據(jù)塔沃,這時Mybatis會自動加載所有表的數(shù)據(jù)蝠引,多執(zhí)行幾條無關(guān)sql語句,會造成數(shù)據(jù)庫資源的浪費以及系統(tǒng)性能的下降蛀柴,這就是級聯(lián)表的缺點螃概。

Mybatis本身給出解決N+1問題的方案,也就是在N+1個級聯(lián)表的情況下鸽疾,只加載需求的數(shù)據(jù)庫表數(shù)據(jù)吊洼。這是互聯(lián)網(wǎng)發(fā)展的需求,性能提升的途徑制肮。冒窍。

Mybatis 的加載延遲

Mybatis 支持延遲加載,我們希望一次性把常用的級聯(lián)數(shù)據(jù)(針對association 和 collection)通過 SQL 直接查詢出來豺鼻,而對于那些不常用的級聯(lián)數(shù)據(jù)不要取出综液,而是等待要用時才取出,這些不常用的級聯(lián)數(shù)據(jù)可以采用延遲加載的功能儒飒。

在Mybatis 的 settings 配置中配置是否加載延遲:

<setting>

<setting name="lazyLoadingEnabled" value="true">

<setting name="aggressiveLazyLoading" value="false">? #為false啟動按需加載

</setting>

選項 lazyLoadingEnabled 決定是否開啟延遲加載谬莹,

而選項 aggressiveLazyLoading 為 true 的時候,一加載對象(任何一個屬性)就會加載他的全部屬性(如:調(diào)用User對象的任何一個屬性的時候就為這個User對象加載它的 role 屬性)桩了。

為 false 的時候附帽,就是按需加載,調(diào)用User對象 的 role屬性時才會去數(shù)據(jù)庫查詢并加載它的 role 屬性的數(shù)據(jù)圣猎。

此外士葫, Mybatis 中 還有 fetchType 屬性。它存在兩個值送悔。

eager:獲得當(dāng)前POJO 后立即加載對應(yīng)的數(shù)據(jù)慢显。

lazy:獲得當(dāng)前POJO后延遲加載對應(yīng)的數(shù)據(jù)爪模。

如:

<resultMap? id="userRoleResults" type="sqlmapper.User">

<id property="id" column="id" />

<result property="username" column="username" />

<association property="role" column="userRole"? fetchType="eager" select="sqlmapper.RoleMapper.getRoleById"/>

</resultMap>

這樣就會初始化對象的時候就為這個對象加載它的 role 屬性。改成 fetchType=“l(fā)azy” 則調(diào)用User 的 role屬性時才會加載它的 role 屬性的數(shù)據(jù)荚藻。

fetchType 屬性會忽略全局配置項 lazyLoadingEnabled 和 aggressiveLazyLoading 的配置屋灌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市应狱,隨后出現(xiàn)的幾起案子共郭,更是在濱河造成了極大的恐慌,老刑警劉巖疾呻,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件除嘹,死亡現(xiàn)場離奇詭異,居然都是意外死亡岸蜗,警方通過查閱死者的電腦和手機尉咕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璃岳,“玉大人年缎,你說我怎么就攤上這事×蹇叮” “怎么了单芜?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長犁柜。 經(jīng)常有香客問我洲鸠,道長,這世上最難降的妖魔是什么赁温? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任坛怪,我火速辦了婚禮淤齐,結(jié)果婚禮上股囊,老公的妹妹穿的比我還像新娘。我一直安慰自己更啄,他們只是感情好稚疹,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祭务,像睡著了一般内狗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上义锥,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天柳沙,我揣著相機與錄音,去河邊找鬼拌倍。 笑死赂鲤,一個胖子當(dāng)著我的面吹牛噪径,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播数初,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼找爱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泡孩?” 一聲冷哼從身側(cè)響起车摄,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仑鸥,沒想到半個月后吮播,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡眼俊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年薄料,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泵琳。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摄职,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出获列,到底是詐尸還是另有隱情谷市,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布击孩,位于F島的核電站迫悠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巩梢。R本人自食惡果不足惜创泄,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望括蝠。 院中可真熱鬧鞠抑,春花似錦、人聲如沸忌警。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽法绵。三九已至箕速,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朋譬,已是汗流浹背盐茎。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留徙赢,地道東北人字柠。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓滑进,卻偏偏與公主長得像,于是被迫代替她去往敵國和親募谎。 傳聞我的和親對象是個殘疾皇子扶关,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容