MyBatis之ResultMap的Association和Collection標(biāo)簽詳解
一、前言
MyBatis 創(chuàng)建時的一個思想是:數(shù)據(jù)庫不可能永遠(yuǎn)是你所想或所需的那個樣子。我們希望每個數(shù)據(jù)庫都具備良好的第三范式或 BCNF 范式,可惜它們并不都是那樣。如果能有一種數(shù)據(jù)庫映射模式,完美適配所有的應(yīng)用程序,那就太好了,但可惜也沒有。而 ResultMap 就是 MyBatis 對這個問題的答案。
二、ResultMap 的屬性列表
屬性 | 描述 |
id | 當(dāng)前命名空間中的一個唯一標(biāo)識,用于標(biāo)識一個結(jié)果映射。 |
type | 類的完全限定名, 或者一個類型別名(關(guān)于內(nèi)置的類型別名,可以參考上面的表格)。 |
autoMapping | 如果設(shè)置這個屬性,MyBatis 將會為本結(jié)果映射開啟或者關(guān)閉自動映射。這個屬性會覆蓋全局的屬性 autoMappingBehavior。默認(rèn)值:未設(shè)置(unset)。 |
extends | 可以繼承其他resultMap的一些寫好的屬性 |
三、resultMap標(biāo)簽介紹
- constructor - 用于在實例化類時,注入結(jié)果到構(gòu)造方法中。
- idArg - ID 參數(shù);標(biāo)記出作為 ID 的結(jié)果可以幫助提高整體性能。
- arg - 將被注入到構(gòu)造方法的一個普通結(jié)果。
- id – 一個 ID 結(jié)果;標(biāo)記出作為 ID 的結(jié)果可以幫助提高整體性能。
- result – 注入到字段或 JavaBean 屬性的普通結(jié)果。
- association – 一個復(fù)雜類型的關(guān)聯(lián);許多結(jié)果將包裝成這種類型。
嵌套結(jié)果映射 – 關(guān)聯(lián)可以是 resultMap 元素,或是對其它結(jié)果映射的引用。 - collection – 一個復(fù)雜類型的集合。
嵌套結(jié)果映射 – 集合可以是 resultMap 元素,或是對其它結(jié)果映射的引用。 - discriminator – 使用結(jié)果值來決定使用哪個 resultMap。
- case – 基于某些值的結(jié)果映射。
嵌套結(jié)果映射 – case 也是一個結(jié)果映射,因此具有相同的結(jié)構(gòu)和元素;或者引用其它的結(jié)果映射。
四、id & result標(biāo)簽參數(shù)詳解
屬性 | 描述 |
property | 映射到列結(jié)果的字段或?qū)傩?。如?JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的字段(field)。無論是哪一種情形,你都可以使用常見的點式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。人話為:就是你的Java實體類 |
column | 數(shù)據(jù)庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數(shù)一樣。 |
javaType | 一個 Java 類的全限定名,或一個類型別名(關(guān)于內(nèi)置的類型別名,可以參考上面的表格)。如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應(yīng)該明確地指定 javaType 來保證行為與期望的相一致。 |
jdbcType | JDBC 類型,所支持的 JDBC 類型參見這個表格之后的“支持的 JDBC 類型”。只需要在可能執(zhí)行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。 |
typeHandler | 我們在前面討論過默認(rèn)的類型處理器。使用這個屬性,你可以覆蓋默認(rèn)的類型處理器。這個屬性值是一個類型處理器實現(xiàn)類的全限定名,或者是類型別名。 |
常用例子展示
五、association標(biāo)簽常用參數(shù)詳解
屬性 | 描述 |
property | 映射到列結(jié)果的字段或?qū)傩?/strong>。如果用來匹配的 JavaBean 存在給定名字的屬性,那么它將會被使用。否則 MyBatis 將會尋找給定名稱的字段。無論是哪一種情形,你都可以使用通常的點式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。人話為:你要一對一的實體類中的另一個實體類的名稱 |
javaType | 一個 Java 類的完全限定名,或一個類型別名。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應(yīng)該明確地指定 javaType 來保證行為與期望的相一致。 |
例子演示
- 實體類演示
xml演示
六、collection標(biāo)簽常用參數(shù)詳解
屬性 | 描述 |
property | 映射到列結(jié)果的字段或?qū)傩?/strong>。如果用來匹配的 JavaBean 存在給定名字的屬性,那么它將會被使用。否則 MyBatis 將會尋找給定名稱的字段。無論是哪一種情形,你都可以使用通常的點式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。人話為:你要一對一的實體類中的另一個實體類的名稱 |
javaType | 這里和一對一的表示不太一樣,這里一般是一對多的集合類型,如:list |
ofType | 指定的這個一對多的集合的所存放的實體類的類型 |
例子演示
實體類演示
xml演示
七、jdbc Type與java Type對照表
JDBC Type | Java Type |
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
BOOLEAN | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | INTEGER |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
CLOB | Clob |
BLOB | Blob |
ARRAY | Array |
DISTINCT | mapping of underlying type |
STRUCT | Struct |
REF | Ref |
DATALINK | java.net.URL |
八、總結(jié)
這樣就對ResultMap具體參數(shù)進(jìn)行詳細(xì)的解釋,還有對association和collection標(biāo)簽的解釋和具體演示,希望能夠幫到你。