mybatis聯合查詢 之 高階結果對映
MyBatis的建立基於這樣一個思想:資料庫並不是您想怎樣就怎樣的。雖然我們希望所有的資料庫遵守第三正規化或BCNF(修正的第三正規化),但它們不是。如果有一個數據庫能夠完美對映到所有應用程式,也將是非常棒的,但也沒有。結果集對映就是MyBatis為解決這些問題而提供的解決方案。例如,我們如何對映下面這條語句?
檢視文字列印?- <!-- Very Complex Statement -->
-
<select id="selectBlogDetails" parameterType="int" resultMap="detailedBlogResultMap"
- select
- B.id as blog_id,
- B.title as blog_title,
- B.author_id as blog_author_id,
- A.id as author_id,
- A.username as author_username,
- A.password as author_password,
- A.email as author_email,
- A.bio as author_bio,
- A.favourite_section as author_favourite_section,
-
P.id as post_id,
- P.blog_id as post_blog_id,
- P.author_id as post_author_id,
- P.created_on as post_created_on,
- P.section as post_section,
- P.subject as post_subject,
- P.draft as draft,
- P.body as post_body,
- C.id as comment_id,
- C.post_id as comment_post_id,
- C.name as comment_name,
-
C.comment as comment_text,
- T.id as tag_id,
- T.name as tag_name
- from Blog B
- left outer join Author A on B.author_id = A.id
- left outer join Post P on B.id = P.blog_id
- left outer join Comment C on P.id = C.post_id
- left outer join Post_Tag PT on PT.post_id = P.id
- left outer join Tag T on PT.tag_id = T.id
- where B.id = #{id}
- </select>
- <wbr>
您可能想要把它對映到一個智慧的物件模型,包括由一個作者寫的一個部落格,有許多文章(Post,帖子),每個文章由0個或者多個評論和標籤。下面是一個複雜ResultMap 的完整例子(假定作者、部落格、文章、評論和標籤都是別名)。仔細看看這個例子,但是不用太擔心,我們會一步步地來分析,一眼看上去可能讓人沮喪,但是實際上非常簡單的
檢視文字列印?- <!-- Very Complex Result Map -->
- <resultMap id="detailedBlogResultMap" type="Blog">
- <constructor>
- <idArg column="blog_id" javaType="int"/>
- </constructor>
- <result property="title" column="blog_title"/>
- <association property="author" column="blog_author_id" javaType=" Author">
- <id property="id" column="author_id"/>
- <result property="username" column="author_username"/>
- <result property="password" column="author_password"/>
- <result property="email" column="author_email"/>
- <result property="bio" column="author_bio"/>
- <result property="favouriteSection" column="author_favourite_section"/>
- </association>
- <collection property="posts" ofType="Post">
- <id property="id" column="post_id"/>
- <result property="subject" column="post_subject"/>
- <association property="author" column="post_author_id" javaType="Author"/>
- <collection property="comments" column="post_id" ofType=" Comment">
- <id property="id" column="comment_id"/>
- </collection>
- <collection property="tags" column="post_id" ofType=" Tag" >
- <id property="id" column="tag_id"/>
- </collection>
- <discriminator javaType="int" column="draft">
- <case value="1" resultType="DraftPost"/>
- </discriminator>
- </collection>
- </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 作為結果集的標識屬性。這有助於提高總體效能,特別是應用快取和巢狀結果對映的時候。
Id、result屬性如下:
Attribute |
Description |
property |
對映資料庫列的欄位或屬性。如果JavaBean 的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis 將搜尋給定名稱的欄位。兩種情況下您都可以使用逗點的屬性形式。比如,您可以對映到“username”,也可以對映到“address.street.number”。 |
column |
資料庫的列名或者列標籤別名。與傳遞給resultSet.getString(columnName)的引數名稱相同。 |
javaType |
完整java類名或別名(參考上面的內建別名列表)。如果對映到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果對映到一個HashMap,那您應該明確指定javaType 來確保所需行為。 |
jdbcType |
這張表下面支援的JDBC型別列表列出的JDBC型別。這個屬性只在insert,update或delete 的時候針對允許空的列有用。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>
其它的屬性與規則與id、result元素的一樣。
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。聯合對映與其它的結果集對映工作方式差不多,指定property、column、javaType(通常MyBatis會自動識別)、
MyBatis的建立基於這樣一個思想:資料庫並不是您想怎樣就怎樣的。雖然我們希望所有的資料庫遵守第三正規化或BCNF(修正的第三正規化),但它們不是。如果有一個數據庫能夠完美對映到所有應用程式,也將是非常棒的,但也沒有。結果集對映就是MyBatis為解決這些問題而提供
在一對多的關係中, 主表的資料回對應關聯表中的多條資料。 因此, 查詢時就會查詢出多條結果, 所以, 向類似的情況我們會使用 List 來進行儲存關聯表中獲取到的資訊。
1 資料準備
建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。
mybatis的高階結果對映可以很輕鬆的幫助我們處理一對一, 一對多的資料關係。
1 資料準備
1.1 資料庫
建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。
1.2 實體類, 介面和XML
以上為生成的專案結構。
2 一對一對映
建立
SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映(多表查詢)
問題情境:比如有張表,使用者和使用者詳情,這兩張表裡面沒長表都有一個id欄位,這兩個表的id欄位都是對應的。
實體類裡面分別對應兩個實體類,user和userdetail,還有一個很重要的實
這是mybatis的官方例子,基本上看一遍就會了,一定要先去看官方例子,這裡介紹的不詳細
http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select
我自己用的聯表查詢
實體類
public class MemberSaleR 最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸!
本篇部落格主要講解MyBatis中實現查詢結果一對一對映的3種方式:
使用別名實現自動對映
使用resultMap配置
使用resultMap的associ 在一對多的關係中, 主表的資料回對應關聯表中的多條資料。 因此, 查詢時就會查詢出多條結果, 所以, 向類似的情況我們會使用 List 來進行儲存關聯表中獲取到的資訊。
1 資料準備
建立以下的名為 mybatis 的資料庫, 並在其下建立4個表。
在此就不貼出來建表的 SQL 語句了 , 感興趣的
Mybatis連結3表查詢資料resultMap結果對映
一、前言
一、資料模型分析
1、分析
(1)明確每張表儲存的資訊
(2)明確每張表中關鍵欄位(主鍵、外來鍵、非空)
(3)明確資料庫中表與表之間的外來鍵關係
(4)明確業務中表與表的關係(建立在具體的業務)
2、分析圖解
(1)圖解:
二、一對一對 最近在讀劉增輝老師所著的《MyBatis從入門到精通》一書,很有收穫,於是將自己學習的過程以部落格形式輸出,如有錯誤,歡迎指正,如幫助到你,不勝榮幸!
本篇部落格主要講解MyBatis中如何使用collection標籤實現查詢結果一對多對映。
1. 使用collection標籤
需求:根據使用者id查詢使用者
一對一關係推薦使用唯一主外來鍵關聯,即兩個表使用外來鍵關聯,由於是一對一關聯,因此還需要給外來鍵增加unique唯一約束。
下面我們以每個人只有一張身份證,一個身份證對應一個人為例。
1、在資料庫mybatis中新建兩張表,並插入一條資料,表結構如下:
表資料如下:
一、聚合函式
聚合函式
函式名稱
作用
count()
返回某列的行數
sum()
返回某列值的和
avg()
返回某列的平均值
max()
返回某列的最大值
min()
返回某列的最小值
上面聚合函式的使用語法 問題:
在使用mybatis的過程中,多次檢驗傳參、sql語句等查詢條件,並未發現存在錯誤,直接執行後臺日誌中的sql也能夠查到正確結果,但是後臺mybatis返回的值一直是空。
原因:
經過測試發現是資料庫表結構中使用了char作為欄位型別,而引數的長度和char的長度不符。在oracle中如果cha
但是有些地方沒有解釋詳細,自己研究了一會,決定將之詳細化
首先是有兩張表,頭行結構。相當於是一張老師表一張學生表。
邏輯結構就是一個老師有多個學生,我們在查詢的時候想要的結果是查出所有的老師的
描述:有三張表,商家登入表,商家表,商家資料資訊表。商家登入後,通過商家id去查詢商家表資訊,然後通過商家表id去查詢商家資料表資訊,登入成功後需儲存三張表資訊到session中。這其中需要用到聯合查
<select id="selectUnionData" resultMap="YszbResultMap" parameterType="java.util.List" >
select total.* from (
select '漂流浮標
這篇文章主要介紹了Java的MyBatis框架中實現多表連線查詢和查詢結果分頁,藉助MyBatis框架中帶有的動態SQL查詢功能可以比普通SQL查詢做到更多,需要的朋友可以參考下
Java的MyBatis框架中實現多表連線查詢和查詢結果分頁 實現多表聯合查詢
1高階結果對映
1.1資料模型分析
1、明確每張表儲存的資訊
2、明確每張表中關鍵欄位(主鍵、外來鍵、非空)
3、明確資料庫中表與表之間的外來鍵關係
4、明確業務中表與表的關係(建立在具體的業務)
1.2一對一對映
1.2一對一對映
1.2一
目得:查詢評論的同時,將評論的圖片查詢出來
1.xml如下:
<span style="font-family:Microsoft YaHei;"> <select id="sele 相關推薦
mybatis聯合查詢 之 高階結果對映
mybatis-高階結果對映之一對多
mybatis-高階結果對映之一對一(多種方式, 有沒提到的你找我)
SSM框架學習-MyBatis篇 SQL對映檔案——實現高階結果對映和多表查詢
mybatis 高階結果對映關聯的巢狀查詢、一對多查詢
MyBatis從入門到精通(九):MyBatis高階結果對映之一對一對映
mybatis-高階結果對映之一對多(你知道一對多的結果是如何合併的嗎)
Mybatis連3表查詢資料resultMap結果對映
mybatis高階結果對映
MyBatis從入門到精通(十一):MyBatis高階結果對映之一對多對映
MyBatis筆記四之一對一關聯對映
MySQL 單表查詢之高階查詢
mybatis傳參正常且直接執行sql能獲得正確結果但通過mybatis卻查詢不到結果的原因:oracle資料庫中使用了char型別的欄位
Mybatis關聯查詢之一對多XML配置詳解
mybatis聯合查詢(未關聯)
mybatis聯合查詢使用union,limit--order by不起作用
SSM框架 Mybatis聯合查詢 多表查詢 分頁
Mybatisd 的高階結果對映
mybatis聯合查詢(2)