MyBatis中的ResultMap的association和collection標(biāo)簽詳解
一、前言
MyBatis 創(chuàng)建時(shí)的一個(gè)思想是:數(shù)據(jù)庫(kù)不可能永遠(yuǎn)是你所想或所需的那個(gè)樣子。 我們希望每個(gè)數(shù)據(jù)庫(kù)都具備良好的第三范式或 BCNF 范式,可惜它們并不都是那樣。 如果能有一種數(shù)據(jù)庫(kù)映射模式,完美適配所有的應(yīng)用程序,那就太好了,但可惜也沒(méi)有。 而 ResultMap 就是 MyBatis 對(duì)這個(gè)問(wèn)題的答案。
二、ResultMap 的屬性列表
屬性 | 描述 |
---|---|
id | 當(dāng)前命名空間中的一個(gè)唯一標(biāo)識(shí),用于標(biāo)識(shí)一個(gè)結(jié)果映射。 |
type | 類的完全限定名, 或者一個(gè)類型別名(關(guān)于內(nèi)置的類型別名,可以參考上面的表格)。 |
autoMapping | 如果設(shè)置這個(gè)屬性,MyBatis 將會(huì)為本結(jié)果映射開(kāi)啟或者關(guān)閉自動(dòng)映射。 這個(gè)屬性會(huì)覆蓋全局的屬性 autoMappingBehavior。默認(rèn)值:未設(shè)置(unset)。 |
extends | 可以繼承其他resultMap的一些寫(xiě)好的屬性 |
三、resultMap標(biāo)簽介紹
- constructor - 用于在實(shí)例化類時(shí),注入結(jié)果到構(gòu)造方法中
- idArg - ID 參數(shù);標(biāo)記出作為 ID 的結(jié)果可以幫助提高整體性能
- arg - 將被注入到構(gòu)造方法的一個(gè)普通結(jié)果
- id – 一個(gè) ID 結(jié)果;標(biāo)記出作為 ID 的結(jié)果可以幫助提高整體性能
- result – 注入到字段或 JavaBean 屬性的普通結(jié)果
- association – 一個(gè)復(fù)雜類型的關(guān)聯(lián);許多結(jié)果將包裝成這種類型
嵌套結(jié)果映射 – 關(guān)聯(lián)可以是 resultMap 元素,或是對(duì)其它結(jié)果映射的引用 - collection – 一個(gè)復(fù)雜類型的集合
嵌套結(jié)果映射 – 集合可以是 resultMap 元素,或是對(duì)其它結(jié)果映射的引用 - discriminator – 使用結(jié)果值來(lái)決定使用哪個(gè) resultMap
- case – 基于某些值的結(jié)果映射
嵌套結(jié)果映射 – case 也是一個(gè)結(jié)果映射,因此具有相同的結(jié)構(gòu)和元素;或者引用其它的結(jié)果映射
- case – 基于某些值的結(jié)果映射
四、id & result標(biāo)簽參數(shù)詳解
屬性 | 描述 |
---|---|
property | 映射到列結(jié)果的字段或?qū)傩浴H绻?JavaBean 有這個(gè)名字的屬性(property),會(huì)先使用該屬性。否則 MyBatis 將會(huì)尋找給定名稱的字段(field)。 無(wú)論是哪一種情形,你都可以使用常見(jiàn)的點(diǎn)式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。 人話為:就是你的Java實(shí)體類 |
column | 數(shù)據(jù)庫(kù)中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數(shù)一樣。 |
javaType | 一個(gè) Java 類的全限定名,或一個(gè)類型別名(關(guān)于內(nèi)置的類型別名,可以參考上面的表格)。 如果你映射到一個(gè) JavaBean,MyBatis 通??梢酝茢囝愋?。然而,如果你映射到的是 HashMap,那么你應(yīng)該明確地指定 javaType 來(lái)保證行為與期望的相一致。 |
jdbcType | JDBC 類型,所支持的 JDBC 類型參見(jiàn)這個(gè)表格之后的“支持的 JDBC 類型”。 只需要在可能執(zhí)行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對(duì)可以為空值的列指定這個(gè)類型。 |
typeHandler | 我們?cè)谇懊嬗懻撨^(guò)默認(rèn)的類型處理器。使用這個(gè)屬性,你可以覆蓋默認(rèn)的類型處理器。 這個(gè)屬性值是一個(gè)類型處理器實(shí)現(xiàn)類的全限定名,或者是類型別名。 |
- 常用例子展示
<resultMap id="UsersMap" type="com.wang.test.demo.entity.User"> <id property="id" column="id" jdbcType="INTEGER"/> <result property="username" column="username" jdbcType="VARCHAR"/> <result property="password" column="password" jdbcType="VARCHAR"/> <result property="role" column="role" jdbcType="VARCHAR"/> <result property="addTime" column="add_time" jdbcType="TIMESTAMP"/> </resultMap>
五、association標(biāo)簽常用參數(shù)詳解
屬性 | 描述 |
---|---|
property | 映射到列結(jié)果的字段或?qū)傩?/strong>。如果用來(lái)匹配的 JavaBean 存在給定名字的屬性,那么它將會(huì)被使用。否則 MyBatis 將會(huì)尋找給定名稱的字段。 無(wú)論是哪一種情形,你都可以使用通常的點(diǎn)式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。 人話為:你要一對(duì)一的實(shí)體類中的另一個(gè)實(shí)體類的名稱 |
javaType | 一個(gè) Java 類的完全限定名,或一個(gè)類型別名。 如果你映射到一個(gè) JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應(yīng)該明確地指定 javaType 來(lái)保證行為與期望的相一致。 |
例子演示
實(shí)體類演示
@Data //書(shū)籍 public class Book { private String id; private String name; private String author; private Double price; private Integer del; private Date publishdate; private String info; //把出版社對(duì)象當(dāng)作屬性 private Publisher pub;//------重點(diǎn)在這里一本書(shū)對(duì)應(yīng)一個(gè)出版社,這是一個(gè)出版社對(duì)象 }
@Data //出版社 public class Publisher { private String id; private String name; private String phone; private String address; }
- xml演示
<resultMap id="rMap_book" type="com.wang.test.demo.entity.Book"> <!-- 主鍵 property為實(shí)體類屬性 column為數(shù)據(jù)庫(kù)字段 jdbcType為實(shí)體類對(duì)應(yīng)的jdbc類型--> <id property="id" column="b_id" jdbcType="VARCHAR"></id> <!-- 普通屬性 property為實(shí)體類屬性 column為數(shù)據(jù)庫(kù)字段 jdbcType為實(shí)體類對(duì)應(yīng)的jdbc類型--> <result property="name" column="b_name" jdbcType="VARCHAR"></result> <result property="author" column="author" jdbcType="VARCHAR"></result> <result property="price" column="price" jdbcType="VARCHAR"></result> <result property="del" column="del" jdbcType="NUMERIC"></result> <result property="publisherid" column="publisher_id" jdbcType="VARCHAR"></result> <result property="publishdate" column="publish_date" jdbcType="TIMESTAMP"></result> <!--一對(duì)一映射association property 為實(shí)體類book中的屬性名字 javaType為實(shí)體類屬性的類型 --> <association property="pub" javaType="com.wang.test.demo.entity.Publisher"> <id property="id" column="p_id" jdbcType="VARCHAR"></id> <result property="name" column="name" jdbcType="VARCHAR"></result> <result property="phone" column="phone" jdbcType="VARCHAR"></result> <result property="address" column="address" jdbcType="VARCHAR"></result> </association> </resultMap>
六、collection標(biāo)簽常用參數(shù)詳解
屬性 | 描述 |
---|---|
property | 映射到列結(jié)果的字段或?qū)傩?/strong>。如果用來(lái)匹配的 JavaBean 存在給定名字的屬性,那么它將會(huì)被使用。否則 MyBatis 將會(huì)尋找給定名稱的字段。 無(wú)論是哪一種情形,你都可以使用通常的點(diǎn)式分隔形式進(jìn)行復(fù)雜屬性導(dǎo)航。 人話為:你要一對(duì)一的實(shí)體類中的另一個(gè)實(shí)體類的名稱 |
javaType | 這里和一對(duì)一的表示不太一樣,這里一般是一對(duì)多的集合類型,如:list |
ofType | 指定的這個(gè)一對(duì)多的集合的所存放的實(shí)體類的類型 |
例子演示
- 實(shí)體類演示
@Data //班級(jí)類 public class Class { private String id; private String name; private List<Student> students;//----重點(diǎn)在這里,一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生 }
@Data public class Student { private int id; private String name; private int age; }
- xml演示
<resultMap id="rMap_class" type="com.wang.test.demo.entity.Class"> <id property="id" column="id" jdbcType="VARCHAR"></id> <result property="name" column="name" jdbcType="VARCHAR"></result> <!--一對(duì)多映射用這個(gè) ofTyp是一對(duì)多的集合的所存放的實(shí)體類 javaType實(shí)體類的屬性類型--> <collection property="students" ofType="com.wang.test.demo.entity.Student" javaType="list"> <id property="id" column="id" jdbcType="INTEGER"></id> <result property="name" column="name" jdbcType="VARCHAR"></result> <result property="age" column="age" jdbcType="INTEGER"></result> </collection> </resultMap>
七、jdbc Type與java Type對(duì)照表
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 |
附:表格來(lái)源 |
八、總結(jié)
這樣就對(duì)ResultMap具體參數(shù)進(jìn)行詳細(xì)的解釋,還有對(duì)association和collection標(biāo)簽的解釋和具體演示,希望能夠幫到你,一起學(xué)習(xí),如果用到收藏一下唄!!!!
到此這篇關(guān)于MyBatis中的ResultMap的association和collection標(biāo)簽詳解的文章就介紹到這了,更多相關(guān)MyBatis association和collection標(biāo)簽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Struts2中ognl遍歷數(shù)組,list和map方法詳解
這篇文章主要介紹了Struts2中ognl遍歷數(shù)組,list和map方法詳解,需要的朋友可以參考下。2017-09-09SpringBoot連接Nacos集群報(bào)400問(wèn)題及完美解決方法
這篇文章主要介紹了解決SpringBoot連接Nacos集群報(bào)400問(wèn)題?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02快速學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法
這篇文章主要幫助大家快速學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法,感興趣的小伙伴們可以參考一下2016-09-09idea2020.2卡死在reading maven projects
這篇文章主要介紹了idea2020.2卡死在reading maven projects,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java求字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù)
這篇文章主要為大家詳細(xì)介紹了Java統(tǒng)計(jì)字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04java連接MySQL數(shù)據(jù)庫(kù)的代碼
這篇文章主要為大家詳細(xì)介紹了java連接MySQL數(shù)據(jù)庫(kù)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Spring數(shù)據(jù)庫(kù)事務(wù)的實(shí)現(xiàn)機(jī)制講解
這篇文章主要介紹了Spring數(shù)據(jù)庫(kù)事務(wù)的實(shí)現(xiàn)機(jī)制講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10java開(kāi)發(fā)之Jdbc分頁(yè)源碼詳解
這篇文章主要介紹了java開(kāi)發(fā)之Jdb分頁(yè)源碼詳解,需要的朋友可以參考下2020-02-02