1. 程式人生 > >mybatis聯合查詢 之 高階結果對映

mybatis聯合查詢 之 高階結果對映

MyBatis的建立基於這樣一個思想:資料庫並不是您想怎樣就怎樣的。雖然我們希望所有的資料庫遵守第三正規化或BCNF(修正的第三正規化),但它們不是。如果有一個數據庫能夠完美對映到所有應用程式,也將是非常棒的,但也沒有。結果對映就是MyBatis為解決這些問題而提供的解決方案。例如,我們如何對映下面這條語句?

檢視文字列印?
  1. <!-- Very Complex Statement -->  
  2. <select id="selectBlogDetails" parameterType="int" resultMap="detailedBlogResultMap"
    >  
  3. select  
  4. B.id as blog_id,  
  5. B.title as blog_title,  
  6. B.author_id as blog_author_id,  
  7. A.id as author_id,  
  8. A.username as author_username,  
  9. A.password as author_password,  
  10. A.email as author_email,  
  11. A.bio as author_bio,  
  12. A.favourite_section as author_favourite_section,  
  13. P.id as post_id,  
  14. P.blog_id as post_blog_id,  
  15. P.author_id as post_author_id,  
  16. P.created_on as post_created_on,  
  17. P.section as post_section,  
  18. P.subject as post_subject,  
  19. P.draft as draft,  
  20. P.body as post_body,  
  21. C.id as comment_id,  
  22. C.post_id as comment_post_id,  
  23. C.name as comment_name,  
  24. C.comment as comment_text,  
  25. T.id as tag_id,  
  26. T.name as tag_name  
  27. from Blog B  
  28. left outer join Author A on B.author_id = A.id  
  29. left outer join Post P on B.id = P.blog_id  
  30. left outer join Comment C on P.id = C.post_id  
  31. left outer join Post_Tag PT on PT.post_id = P.id  
  32. left outer join Tag T on PT.tag_id = T.id  
  33. where B.id = #{id}  
  34. </select>  
  35. <wbr>  

您可能想要把它對映到一個智慧的物件模型,包括由一個作者寫的一個部落格,有許多文章(Post,帖子),每個文章由0個或者多個評論和標籤。下面是一個複雜ResultMap 的完整例子(假定作者、部落格、文章、評論和標籤都是別名)。仔細看看這個例子,但是不用太擔心,我們會一步步地來分析,一眼看上去可能讓人沮喪,但是實際上非常簡單的

檢視文字列印?
  1. <!-- Very Complex Result Map -->  
  2. <resultMap id="detailedBlogResultMap" type="Blog">  
  3. <constructor>  
  4. <idArg column="blog_id" javaType="int"/>  
  5. </constructor>  
  6. <result property="title" column="blog_title"/>  
  7. <association property="author" column="blog_author_id" javaType=" Author">  
  8. <id property="id" column="author_id"/>  
  9. <result property="username" column="author_username"/>  
  10. <result property="password" column="author_password"/>  
  11. <result property="email" column="author_email"/>  
  12. <result property="bio" column="author_bio"/>  
  13. <result property="favouriteSection" column="author_favourite_section"/>  
  14. </association>  
  15. <collection property="posts" ofType="Post">  
  16. <id property="id" column="post_id"/>  
  17. <result property="subject" column="post_subject"/>  
  18. <association property="author" column="post_author_id" javaType="Author"/>  
  19. <collection property="comments" column="post_id" ofType=" Comment">  
  20. <id property="id" column="comment_id"/>  
  21. </collection>  
  22. <collection property="tags" column="post_id" ofType=" Tag" >  
  23. <id property="id" column="tag_id"/>  
  24. </collection>  
  25. <discriminator javaType="int" column="draft">  
  26. <case value="1" resultType="DraftPost"/>  
  27. </discriminator>  
  28. </collection>  
  29. </resultMap> <wbr>  

這個resultMap 的元素的子元素比較多,討論起來比較寬泛。下面我們從概念上概覽一下這個resultMap的元素。

resultMap

·constructor例項化的時候通過構造器將結果集註入到類中

oidArg– ID 引數; 將結果集標記為ID,以方便全域性呼叫

oarg注入構造器的結果

·id結果ID,將結果集標記為ID,以方便全域性呼叫

·result注入一個欄位或者javabean屬性的結果

·association複雜型別聯合;許多查詢結果合成這個型別

o巢狀結果對映– associations能引用自身,或者從其它地方引用

·collection複雜型別集合

o巢狀結果對映– collections能引用自身,或者從其它地方引用

·discriminator使用一個結果值以決定使用哪個resultMap

ocase基於不同值的結果對映

§巢狀結果對映–case也能引用它自身, 所以也能包含這些同樣的元素。它也可以從外部引用resultMap

è最佳實踐:逐步地生成resultMap,單元測試對此非常有幫助。如果您嘗試一下子就生成像上面這樣巨大的resultMap,可能會出錯,並且工作起來非常吃力。從簡單地開始,再一步步地擴充套件,並且進行單元測試。使用框架開發有一個缺點,它們有時像是一個黑合。為了確保達到您所預想的行為,最好的方式就是進行單元測試。這對提交bugs 也非常有用。

下一節,我們一步步地檢視這些細節。

id, result元素

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

<result property="subject" column="post_subject"/>

這是最基本的結果對映id 和result 將列對映到屬性或簡單的資料型別欄位(String, int, double, Date)

這兩者唯一不同的是,在比較物件例項時id 作為結果集的標識屬性。這有助於提高總體效能,特別是應用快取和巢狀結果對映的時候。

Idresult屬性如下:

Attribute

Description

property

對映資料庫列的欄位或屬性。如果JavaBean 的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis 將搜尋給定名稱的欄位。兩種情況下您都可以使用逗點的屬性形式。比如,您可以對映到“username”,也可以對映到“address.street.number”

column

資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。

javaType

完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。

jdbcType

這張表下面支援的JDBC型別列表列出的JDBC型別。這個屬性只在insertupdatedelete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC程式碼,在允許為空值的情況下需要指定這個型別。

typeHandler

我們已經在文件中討論過預設型別處理器。使用這個屬性可以重寫預設型別處理器。它的值可以是一個TypeHandler實現的完整類名,也可以是一個類型別名。

支援的JDBC型別

MyBatis支援如下的JDBC型別:

BIT

FLOAT

CHAR

TIMESTAMP

OTHER

UNDEFINED

TINYINT

REAL

VARCHAR

BINARY

BLOB

NVARCHAR

SMALLINT

DOUBLE

LONGVARCHAR

VARBINARY

CLOB

NCHAR

INTEGER

NUMERIC

DATE

LONGVARBINARY

BOOLEAN

NCLOB

BIGINT

DECIMAL

TIME

NULL

CURSOR

Constructor元素

<constructor>

<idArg column="id" javaType="int"/>

<arg column=”username” javaType=”String”/>

</constructor>

當屬性與DTO,或者與您自己的域模型一起工作的時候,許多場合要用到不變類。通常,包含引用,或者查詢的資料很少或者資料不會改變的的表,適合對映到不變類中。構造器注入允許您在類例項化後給類設值,這不需要通過public方法。MyBatis同樣也支援private屬性和JavaBeans的私有屬性達到這一點,但是一些使用者可能更喜歡使用構造器注入。構造器元素可以做到這點。

考慮下面的構造器:

public class User {

//…

public User(int id, String username) {

//…

}

//…

}

為了將結果注入構造器,MyBatis需要使用它的引數型別來標記構造器。Java沒有辦法通過引數名稱來反射獲得。因此當建立constructor 元素,確保引數是按順序的並且指定了正確的型別。

<constructor>

<idArg column="id" javaType="int"/>

<arg column=”username” javaType=”String”/>

</constructor>

其它的屬性與規則與idresult元素的一樣。

Attribute

Description

column

資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。

javaType

完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。

jdbcType

支援的JDBC型別列表中列出的JDBC型別。這個屬性只在insert,update 或delete 的時候針對允許空的列有用。JDBC 需要這項,但MyBatis 不需要。如果您直接編寫JDBC程式碼,在允許為空值的情況下需要指定這個型別。

typeHandler

我們已經在文件中討論過預設型別處理器。使用這個屬性可以重寫預設型別處理器。它的值可以是一個TypeHandler實現的完整類名,也可以是一個類型別名。

Association元素

<association property="author" column="blog_author_id" javaType=" Author">

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

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

</association>

Association元素處理“has-one”(一對一)這種型別關係。比如在我們的例子中,一個Blog有一個Author。聯合對映與其它的結果對映工作方式差不多,指定propertycolumnjavaType(通常MyBatis會自動識別)、

相關推薦

mybatis聯合查詢 高階結果對映

MyBatis的建立基於這樣一個思想:資料庫並不是您想怎樣就怎樣的。雖然我們希望所有的資料庫遵守第三正規化或BCNF(修正的第三正規化),但它們不是。如果有一個數據庫能夠完美對映到所有應用程式,也將是非常棒的,但也沒有。結果集對映就是MyBatis為解決這些問題而提供

mybatis-高階結果對映一對多

在一對多的關係中, 主表的資料回對應關聯表中的多條資料。 因此, 查詢時就會查詢出多條結果, 所以, 向類似的情況我們會使用 List 來進行儲存關聯表中獲取到的資訊。 1 資料準備 建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。

mybatis-高階結果對映一對一(多種方式, 有沒提到的你找我)

mybatis的高階結果對映可以很輕鬆的幫助我們處理一對一, 一對多的資料關係。 1 資料準備 1.1 資料庫 建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。 1.2 實體類, 介面和XML 以上為生成的專案結構。 2 一對一對映 建立

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映和多表查詢

SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映(多表查詢) 問題情境:比如有張表,使用者和使用者詳情,這兩張表裡面沒長表都有一個id欄位,這兩個表的id欄位都是對應的。 實體類裡面分別對應兩個實體類,user和userdetail,還有一個很重要的實

mybatis 高階結果對映關聯的巢狀查詢、一對多查詢

這是mybatis的官方例子,基本上看一遍就會了,一定要先去看官方例子,這裡介紹的不詳細 http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select 我自己用的聯表查詢 實體類 public class MemberSaleR

MyBatis從入門到精通(九):MyBatis高階結果對映一對一對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解MyBatis中實現查詢結果一對一對映的3種方式: 使用別名實現自動對映 使用resultMap配置 使用resultMap的associ

mybatis-高階結果對映之一對多(你知道一對多的結果是如何合併的嗎)

在一對多的關係中, 主表的資料回對應關聯表中的多條資料。 因此, 查詢時就會查詢出多條結果, 所以, 向類似的情況我們會使用 List 來進行儲存關聯表中獲取到的資訊。 1 資料準備 建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。 在此就不貼出來建表的 SQL 語句了 , 感興趣的

Mybatis連結3表查詢資料resultMap結果對映

一、前言                                                                                                                                     

Mybatis連3表查詢資料resultMap結果對映

Mybatis連結3表查詢資料resultMap結果對映 一、前言                                                                                                        

mybatis高階結果對映

一、資料模型分析 1、分析 (1)明確每張表儲存的資訊 (2)明確每張表中關鍵欄位(主鍵、外來鍵、非空) (3)明確資料庫中表與表之間的外來鍵關係 (4)明確業務中表與表的關係(建立在具體的業務) 2、分析圖解 (1)圖解: 二、一對一對

MyBatis從入門到精通(十一):MyBatis高階結果對映之一對多對映

最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸! 本篇部落格主要講解MyBatis中如何使用collection標籤實現查詢結果一對多對映。 1. 使用collection標籤 需求:根據使用者id查詢使用者

MyBatis筆記四一對一關聯對映

一對一關係推薦使用唯一主外來鍵關聯,即兩個表使用外來鍵關聯,由於是一對一關聯,因此還需要給外來鍵增加unique唯一約束。 下面我們以每個人只有一張身份證,一個身份證對應一個人為例。 1、在資料庫mybatis中新建兩張表,並插入一條資料,表結構如下: 表資料如下:

MySQL 單表查詢高階查詢

一、聚合函式 聚合函式 函式名稱 作用 count() 返回某列的行數 sum() 返回某列值的和 avg() 返回某列的平均值 max() 返回某列的最大值 min() 返回某列的最小值 上面聚合函式的使用語法

mybatis傳參正常且直接執行sql能獲得正確結果但通過mybatis查詢不到結果的原因:oracle資料庫中使用了char型別的欄位

問題: 在使用mybatis的過程中,多次檢驗傳參、sql語句等查詢條件,並未發現存在錯誤,直接執行後臺日誌中的sql也能夠查到正確結果,但是後臺mybatis返回的值一直是空。 原因: 經過測試發現是資料庫表結構中使用了char作為欄位型別,而引數的長度和char的長度不符。在oracle中如果cha

Mybatis關聯查詢一對多XML配置詳解

但是有些地方沒有解釋詳細,自己研究了一會,決定將之詳細化 首先是有兩張表,頭行結構。相當於是一張老師表一張學生表。 邏輯結構就是一個老師有多個學生,我們在查詢的時候想要的結果是查出所有的老師的

mybatis聯合查詢(未關聯)

描述:有三張表,商家登入表,商家表,商家資料資訊表。商家登入後,通過商家id去查詢商家表資訊,然後通過商家表id去查詢商家資料表資訊,登入成功後需儲存三張表資訊到session中。這其中需要用到聯合查

mybatis聯合查詢使用union,limit--order by不起作用

<select id="selectUnionData" resultMap="YszbResultMap" parameterType="java.util.List" > select total.* from ( select '漂流浮標

SSM框架 Mybatis聯合查詢 多表查詢 分頁

這篇文章主要介紹了Java的MyBatis框架中實現多表連線查詢和查詢結果分頁,藉助MyBatis框架中帶有的動態SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下 Java的MyBatis框架中實現多表連線查詢和查詢結果分頁 實現多表聯合查詢

Mybatisd 的高階結果對映

1高階結果對映 1.1資料模型分析 1、明確每張表儲存的資訊 2、明確每張表中關鍵欄位(主鍵、外來鍵、非空) 3、明確資料庫中表與表之間的外來鍵關係 4、明確業務中表與表的關係(建立在具體的業務) 1.2一對一對映 1.2一對一對映 1.2一

mybatis聯合查詢(2)

目得:查詢評論的同時,將評論的圖片查詢出來 1.xml如下: <span style="font-family:Microsoft YaHei;"> <select id="sele