MyBatis中的ResultMap的association和collection標簽詳解
一、前言
MyBatis 創(chuàng)建時的一個思想是:數(shù)據(jù)庫不可能永遠是你所想或所需的那個樣子。 我們希望每個數(shù)據(jù)庫都具備良好的第三范式或 BCNF 范式,可惜它們并不都是那樣。 如果能有一種數(shù)據(jù)庫映射模式,完美適配所有的應用程序,那就太好了,但可惜也沒有。 而 ResultMap 就是 MyBatis 對這個問題的答案。
二、ResultMap 的屬性列表
| 屬性 | 描述 |
|---|---|
| id | 當前命名空間中的一個唯一標識,用于標識一個結果映射。 |
| type | 類的完全限定名, 或者一個類型別名(關于內置的類型別名,可以參考上面的表格)。 |
| autoMapping | 如果設置這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射。 這個屬性會覆蓋全局的屬性 autoMappingBehavior。默認值:未設置(unset)。 |
| extends | 可以繼承其他resultMap的一些寫好的屬性 |
三、resultMap標簽介紹
- constructor - 用于在實例化類時,注入結果到構造方法中
- idArg - ID 參數(shù);標記出作為 ID 的結果可以幫助提高整體性能
- arg - 將被注入到構造方法的一個普通結果
- id – 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能
- result – 注入到字段或 JavaBean 屬性的普通結果
- association – 一個復雜類型的關聯(lián);許多結果將包裝成這種類型
嵌套結果映射 – 關聯(lián)可以是 resultMap 元素,或是對其它結果映射的引用 - collection – 一個復雜類型的集合
嵌套結果映射 – 集合可以是 resultMap 元素,或是對其它結果映射的引用 - discriminator – 使用結果值來決定使用哪個 resultMap
- case – 基于某些值的結果映射
嵌套結果映射 – case 也是一個結果映射,因此具有相同的結構和元素;或者引用其它的結果映射
- case – 基于某些值的結果映射
四、id & result標簽參數(shù)詳解
| 屬性 | 描述 |
|---|---|
| property | 映射到列結果的字段或屬性。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的字段(field)。 無論是哪一種情形,你都可以使用常見的點式分隔形式進行復雜屬性導航。 人話為:就是你的Java實體類 |
| column | 數(shù)據(jù)庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的參數(shù)一樣。 |
| javaType | 一個 Java 類的全限定名,或一個類型別名(關于內置的類型別名,可以參考上面的表格)。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。 |
| jdbcType | JDBC 類型,所支持的 JDBC 類型參見這個表格之后的“支持的 JDBC 類型”。 只需要在可能執(zhí)行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。 |
| typeHandler | 我們在前面討論過默認的類型處理器。使用這個屬性,你可以覆蓋默認的類型處理器。 這個屬性值是一個類型處理器實現(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標簽常用參數(shù)詳解
| 屬性 | 描述 |
|---|---|
| property | 映射到列結果的字段或屬性。如果用來匹配的 JavaBean 存在給定名字的屬性,那么它將會被使用。否則 MyBatis 將會尋找給定名稱的字段。 無論是哪一種情形,你都可以使用通常的點式分隔形式進行復雜屬性導航。 人話為:你要一對一的實體類中的另一個實體類的名稱 |
| javaType | 一個 Java 類的完全限定名,或一個類型別名。 如果你映射到一個 JavaBean,MyBatis 通??梢酝茢囝愋?。然而,如果你映射到的是 HashMap,那么你應該明確地指定 javaType 來保證行為與期望的相一致。 |
例子演示
實體類演示
@Data
//書籍
public class Book {
private String id;
private String name;
private String author;
private Double price;
private Integer del;
private Date publishdate;
private String info;
//把出版社對象當作屬性
private Publisher pub;//------重點在這里一本書對應一個出版社,這是一個出版社對象
}@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為實體類屬性 column為數(shù)據(jù)庫字段 jdbcType為實體類對應的jdbc類型-->
<id property="id" column="b_id" jdbcType="VARCHAR"></id>
<!-- 普通屬性 property為實體類屬性 column為數(shù)據(jù)庫字段 jdbcType為實體類對應的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>
<!--一對一映射association property 為實體類book中的屬性名字 javaType為實體類屬性的類型 -->
<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標簽常用參數(shù)詳解
| 屬性 | 描述 |
|---|---|
| property | 映射到列結果的字段或屬性。如果用來匹配的 JavaBean 存在給定名字的屬性,那么它將會被使用。否則 MyBatis 將會尋找給定名稱的字段。 無論是哪一種情形,你都可以使用通常的點式分隔形式進行復雜屬性導航。 人話為:你要一對一的實體類中的另一個實體類的名稱 |
| javaType | 這里和一對一的表示不太一樣,這里一般是一對多的集合類型,如:list |
| ofType | 指定的這個一對多的集合的所存放的實體類的類型 |
例子演示
- 實體類演示
@Data
//班級類
public class Class {
private String id;
private String name;
private List<Student> students;//----重點在這里,一個班級對應多個學生
}@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>
<!--一對多映射用這個 ofTyp是一對多的集合的所存放的實體類 javaType實體類的屬性類型-->
<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對照表
| 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 |
| 附:表格來源 |
八、總結
這樣就對ResultMap具體參數(shù)進行詳細的解釋,還有對association和collection標簽的解釋和具體演示,希望能夠幫到你,一起學習,如果用到收藏一下唄!!!!
到此這篇關于MyBatis中的ResultMap的association和collection標簽詳解的文章就介紹到這了,更多相關MyBatis association和collection標簽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
idea中springboot整合mybatis找不到mapper接口的原因分析
這篇文章主要介紹了idea中springboot整合mybatis找不到mapper接口的原因分析及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring boot整合Mybatis實現(xiàn)級聯(lián)一對多CRUD操作的完整步驟
這篇文章主要給大家介紹了關于Spring boot整合Mybatis實現(xiàn)級聯(lián)一對多CRUD操作的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07
最新jsonwebtoken-jwt 0.12.3 基本使用小結
這篇文章主要介紹了最新jsonwebtoken-jwt 0.12.3 基本使用小結,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-12-12
Springboot使用POI進行excel文件的導出與下載方式
這篇文章主要介紹了Springboot使用POI進行excel文件的導出與下載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Spring @Transactional注解的聲明式事務簡化業(yè)務邏輯中的事務管理
這篇文章主要為大家介紹了Spring @Transactional注解的聲明式事務簡化業(yè)務邏輯中的事務管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10

