MyBatis一對多查詢及延遲加載

一對一查詢

需求

查詢所有訂單信息今豆,關聯(lián)查詢下單用戶信息竣况。

SQL

select a.*,b.username,b.address 
from orders a
left join user b on a.userid=b.id

主信息:訂單信息
從信息:用戶信息

方法

方法一:resultType
方法二:resultMap

使用resultMap進行結果映射珊豹,定義專門的resultMap用于映射一對一查詢結果惜姐。

  1. 創(chuàng)建擴展pojo
    創(chuàng)建OrdersExt類(用于結果集分裝)竞帽,加入User屬性调违,因為一對一,這里使用單個User對象存儲瑰煎。
public class OrdersExt extends Order {
    private User user;// 用戶對象
   // get/set铺然。。酒甸。魄健。
}
  1. mapper.xml文件
 <!-- 查詢訂單關聯(lián)用戶信息使用resultmap -->
 <resultMap type="OrdersExt" id="ordersAndUserRstMap">
   <id column="id" property="id"/>
   <result column="userid" property="userId"/>
   <result column="number" property="number"/>
   <result column="createtime" property="createtime"/>
   <result column="note" property="note"/>
   <!-- 一對一關聯(lián)映射 -->
   <!-- 
   property:Order對象的user屬性
   javaType:user屬性對應 的類型
   association:表示進行一對一關聯(lián)查詢映射
   -->
   <association property="user" javaType="com.demo.mybatis.po.User">
     <!-- column:user表的主鍵對應的列 property:user對象中id屬性-->
     <id column="userid" property="id"/>
     <result column="username" property="username"/>
     <result column="address" property="address"/>
   </association>
 </resultMap>

property:Order對象的user屬性。
javaType:user屬性對應 的類型插勤。
association:表示進行一對一關聯(lián)查詢映射沽瘦。

總結

使用resultMap進行結果映射時,具體是使用association完成關聯(lián)查詢的映射农尖,將關聯(lián)查詢信息映射到pojo對象中析恋。

一對多查詢

需求

查詢所有用戶信息及用戶關聯(lián)的訂單信息。

SQL

SELECT
 a.*, 
 b.id oid,
 b.number,
 b.createtime,
 b.note
FROM user a
LEFT JOIN orders b ON a.id = b.userid

主信息:用戶信息
從信息:訂單信息

分析

在一對多的使用中盛卡,只能使用resultMap進行結果映射

  1. 一對多關聯(lián)查詢時助隧,sql查詢出來的結果可能有多條,但映射對象只有一個滑沧。
  2. resultType的映射是一條記錄映射為一個對象并村。
  3. resultMap完成映射是以【主信息】為主對象,【從信息】映射為集合或對象滓技,然后封裝到主對象中橘霎。

方法

  1. 修改pojo類,添加private List<Order> orders。
@Data
public class User(){
       private List<Order> orders;// 訂單信息
       private String userid;
       private String username;
       private String address;
       ...
}
  1. mapper.xml
<resultMap type="user" id="userAndOrderRstMap">
   <!-- 用戶信息映射 -->
   <id property="id" column="id"/>
   <result property="username" column="username"/>
   <result property="birthday" column="birthday"/>
   <result property="sex" column="sex"/>
   <result property="address" column="address"/>
   <!-- 一對多關聯(lián)映射  
   property:User對象的orders屬性
   ofType:用來指定映射到List或集合中的實體類型殖属,泛型中的約束類型。
   collection :表示進行一對多關聯(lián)查詢映射
    -->
   <collection property="orders" ofType="com.demo.mybatis.po.Order">
     <id property="id" column="oid"/> 
     <result property="userId" column="id"/>
     <result property="number" column="number"/>
     <result property="createtime" column="createtime"/>
     <result property="note" column="note"/>
   </collection>
 </resultMap>

Collection標簽:定義了一對多關聯(lián)的結果映射瓦盛。
property="orders":關聯(lián)查詢的結果集存儲在User對象的上哪個屬性洗显。
ofType="com.demo.mybatis.po.Order":指定關聯(lián)查詢的結果集中的對象類型即List中的對象類型。此處可以使用別名原环,也可以使用全限定名挠唆。

延遲加載

是什么?

  • MyBatis延遲加載也稱懶加載,是指進行關聯(lián)查詢時嘱吗,按照設置延遲規(guī)則推遲對關聯(lián)對象的select查詢玄组,可減輕數(shù)據(jù)庫壓力滔驾。
  • 必須通過resultMap中的association和collection子標簽才能演示成功。
  • MyBatis的延遲加載也被稱為嵌套查詢俄讹,對應還有嵌套結果的概念哆致。
  • MyBtis的延遲加載只針對關聯(lián)查詢對象,主加載對象都是直接查詢結果患膛。

分類

MyBatis根據(jù)關聯(lián)對象查詢的select的語句的執(zhí)行時機摊阀,分為三種類型:直接加載、侵入式加載和深度延遲加載踪蹬。

延遲加載策略需要在Mybatis的全局配置文件中胞此,通過標簽進行設置。

直接加載

執(zhí)行完對主加載對象的select語句跃捣,馬上執(zhí)行對關聯(lián)對象的select查詢漱牵。

<settings>
    <!-- 延遲加載總開關 -->
    <setting name="lazyLoadingEnabled" value="false"/>
</settings>
侵入式加載

執(zhí)行對主加載對象的select查詢時,不會執(zhí)行對關聯(lián)對象的查詢疚漆。但當要訪問主加載對象的某個屬性(該屬性不是關聯(lián)對象的屬性)時酣胀,就會馬上執(zhí)行關聯(lián)對象的select查詢。

<settings>
    <!-- 延遲加載總開關 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 侵入式延遲加載開關 -->
    <setting name="aggressiveLazyLoading" value="true"/>
</settings>
深度延遲加載

執(zhí)行對主加載對象的select查詢時愿卸,不會執(zhí)行對關聯(lián)對象的查詢灵临。當要訪問主加載對象的詳情時也不會執(zhí)行對關聯(lián)對象的查詢。當訪問到關聯(lián)對象的詳情時才執(zhí)行對關聯(lián)對象的查詢趴荸。

<settings>
    <!-- 延遲加載總開關 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 侵入式延遲加載開關 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

N+1問題

  • 深度延遲加載的使用會提升性能儒溉。
  • 如果延遲加載的表數(shù)據(jù)太多,就會產(chǎn)生N+1問題发钝,主信息加載一次算一次顿涣,而從信息是會根據(jù)主信息傳遞過來的條件,去查詢從表多次酝豪。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涛碑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孵淘,更是在濱河造成了極大的恐慌蒲障,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘫证,死亡現(xiàn)場離奇詭異揉阎,居然都是意外死亡,警方通過查閱死者的電腦和手機背捌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門毙籽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毡庆,你說我怎么就攤上這事坑赡±尤纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵毅否,是天一觀的道長亚铁。 經(jīng)常有香客問我,道長搀突,這世上最難降的妖魔是什么刀闷? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮仰迁,結果婚禮上甸昏,老公的妹妹穿的比我還像新娘。我一直安慰自己徐许,他們只是感情好施蜜,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雌隅,像睡著了一般翻默。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恰起,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天修械,我揣著相機與錄音,去河邊找鬼检盼。 笑死肯污,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吨枉。 我是一名探鬼主播蹦渣,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼貌亭!你這毒婦竟也來了柬唯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤圃庭,失蹤者是張志新(化名)和其女友劉穎锄奢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剧腻,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡拘央,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恕酸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡胯陋,死狀恐怖蕊温,靈堂內(nèi)的尸體忽然破棺而出袱箱,到底是詐尸還是另有隱情,我是刑警寧澤义矛,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布发笔,位于F島的核電站,受9級特大地震影響凉翻,放射性物質發(fā)生泄漏了讨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一制轰、第九天 我趴在偏房一處隱蔽的房頂上張望前计。 院中可真熱鬧,春花似錦垃杖、人聲如沸男杈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伶棒。三九已至,卻和暖如春彩库,著一層夾襖步出監(jiān)牢的瞬間肤无,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工骇钦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宛渐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓司忱,卻偏偏與公主長得像皇忿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坦仍,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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