淺談Mybatis中是如何實現這種多表關係的對映

weixin_34236497發表於2018-04-02

  在現實的專案中進行資料庫建模時,我們要遵循資料庫設計正規化的要求,會對現實中的業務模型進行拆分,封裝在不同的資料表中,表與表之間存在著一對多或是多對多的對應關係。進而,我們對資料庫的增刪改查操作的主體,也就從單表變成了多表。那麼Mybatis中是如何實現這種多表關係的對映呢?

6449180-878699c3e1c5098f

請輸入圖片描述

  查詢結果集ResultMap

  resultMap元素是MyBatis中最重要最強大的元素。它就是讓你遠離90%的需要從結果集中取出資料的JDBC程式碼的那個東西,而且在一些情形下允許你做一些JDBC不支援的事情。事實上,編寫相似於對複雜語句聯合對映這些等同的程式碼,也許可以跨過上千行的程式碼。

  有朋友會問,之前的示例中我們沒有用到結果集,不是也可以正確地將資料表中的資料對映到Java物件的屬性中嗎?是的。這正是resultMap元素設計的初衷,就是簡單語句不需要明確的結果對映,而很多複雜語句確實需要描述它們的關係。

  ?resultMap元素中,允許有以下直接子元素:

  ?constructor-類在例項化時,用來注入結果到構造方法中(本文中暫不講解)

  ?id-作用與result相同,同時可以標識出用這個欄位值可以區分其他物件例項。可以理解為資料表中的主鍵,可以定位資料表中唯一一筆記錄

  ?result-將資料表中的欄位注入到Java物件屬性中

  ?association-關聯,簡單的講,就是“有一個”關係,如“使用者”有一個“帳號”

  ?collection-集合,顧名思議,就是“有很多”關係,如“客戶”有很多“訂單”

  ?discriminator-使用結果集決定使用哪個個結果對映(暫不涉及)

  1.巢狀查詢對映

  巢狀查詢對映:通過執行另外一個SQL對映語句來返回預期的複雜型別。

  想查詢出訂單的時候去給我關聯查詢出該訂單所屬於的使用者資訊。(查詢一張表)

  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'訂單的狀態',

  `uid`bigint(20)DEFAULTNULLCOMMENT'外來鍵',

  PRIMARYKEY(`oid`),

  KEY`uid`(`uid`),

  CONSTRAINT`orders_ibfk_1`FOREIGNKEY(`uid`)REFERENCES`users`(`uid`)

  )ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;

  UserMapper配置檔案如下:




  

  select*fromorders



  


  


  column:外來鍵欄位

  property:關聯物件的屬性名

  javaType:寫pojo類的型別

  select:寫statement物件的id值

  -->

  


  

  select*fromuserswhereuid=#{uid}



  

  

  

  

  


  property:屬性名

  javaType:pojo的型別也可以通過resulteMap指定返回的結果集

  -->

  

  UserMapper.java介面方法如下:

  //查詢訂單去關聯查詢使用者

  ListqueryOrderWithUser();

  測試程式碼:

  ////14.查詢訂單去關聯查詢使用者巢狀查詢對映

  @Test

  publicvoidrun14()throwsIOException{

  UserMappermapper=sqlSession.getMapper(UserMapper.class);

  Listc=mapper.queryOrderWithUser();

  System.out.println(c);

  }

  2.巢狀結對映

  巢狀結果:使用巢狀結果對映來處理重複的聯合結果的子集。

  UserMapper.xml

  


  select*fromordersasoleftouterjoinusersasuono.uid=u.uid;



  

  

  

  

  


  property:屬性名

  javaType:pojo的型別也可以通過resulteMap指定返回的結果集

  -->

  

  


  column:表的欄位

  property:pojo的屬性

  -->

  


  

  

  

  UserMapper.java介面方法如下:

  //查詢訂單去關聯查詢使用者

  ListqueryOrderWithUser2();

  測試程式碼:

  ////14.查詢訂單去關聯查詢使用者巢狀查詢對映

  @Test

  publicvoidrun14()throwsIOException{

  UserMappermapper=sqlSession.getMapper(UserMapper.class);

  Listc=mapper.queryOrderWithUser2();

  System.out.println(c);

  }

  3查詢2個表自己整一個pojo類把需要用到的user表的欄位和order表的欄位全都寫進去直接用resultType

  


  select*fromordersasoleftouterjoinusersasuono.uid=u.uid;

相關文章