MyBatis之ResultMap的association和collection標籤詳解

2022-10-10 12:01:38

一、前言

MyBatis 建立時的一個思想是:資料庫不可能永遠是你所想或所需的那個樣子。 我們希望每個資料庫都具備良好的第三正規化或 BCNF 正規化,可惜它們並不都是那樣。 如果能有一種資料庫對映模式,完美適配所有的應用程式,那就太好了,但可惜也沒有。 而 ResultMap 就是 MyBatis 對這個問題的答案。

二、ResultMap 的屬性列表

屬性 描述
id 當前名稱空間中的一個唯一標識,用於標識一個結果對映。
type 類的完全限定名, 或者一個型別別名(關於內建的型別別名,可以參考上面的表格)。
autoMapping 如果設定這個屬性,MyBatis 將會為本結果對映開啟或者關閉自動對映。 這個屬性會覆蓋全域性的屬性 autoMappingBehavior。預設值:未設定(unset)。
extends 可以繼承其他resultMap的一些寫好的屬性

三、resultMap標籤介紹

  • constructor - 用於在範例化類時,注入結果到構造方法中
    • idArg - ID 引數;標記出作為 ID 的結果可以幫助提高整體效能
    • arg - 將被注入到構造方法的一個普通結果
  • id – 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體效能
  • result – 注入到欄位或 JavaBean 屬性的普通結果
  • association – 一個複雜型別的關聯;許多結果將包裝成這種型別
    巢狀結果對映 – 關聯可以是 resultMap 元素,或是對其它結果對映的參照
  • collection – 一個複雜型別的集合
    巢狀結果對映 – 集合可以是 resultMap 元素,或是對其它結果對映的參照
  • discriminator – 使用結果值來決定使用哪個 resultMap
    • case – 基於某些值的結果對映
      巢狀結果對映 – case 也是一個結果對映,因此具有相同的結構和元素;或者參照其它的結果對映

四、id & result標籤引數詳解

屬性 描述
property 對映到列結果的欄位或屬性。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的欄位(field)。 無論是哪一種情形,你都可以使用常見的點式分隔形式進行復雜屬性導航。 人話為:就是你的Java實體類
column 資料庫中的列名,或者是列的別名。一般情況下,這和傳遞給 resultSet.getString(columnName) 方法的引數一樣。
javaType 一個 Java 類的全限定名,或一個型別別名(關於內建的型別別名,可以參考上面的表格)。 如果你對映到一個 JavaBean,MyBatis 通常可以推斷型別。然而,如果你對映到的是 HashMap,那麼你應該明確地指定 javaType 來保證行為與期望的相一致。
jdbcType JDBC 型別,所支援的 JDBC 型別參見這個表格之後的「支援的 JDBC 型別」。 只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 型別。這是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 程式設計,你需要對可以為空值的列指定這個型別。
typeHandler 我們在前面討論過預設的型別處理器。使用這個屬性,你可以覆蓋預設的型別處理器。 這個屬性值是一個型別處理器實現類的全限定名,或者是型別別名。

- 常用例子展示

<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標籤常用引數詳解

屬性 描述
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為資料庫欄位 jdbcType為實體類對應的jdbc型別-->
    <id property="id" column="b_id" jdbcType="VARCHAR"></id>
    <!-- 普通屬性  property為實體類屬性 column為資料庫欄位  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標籤常用引數詳解

屬性 描述
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具體引數進行詳細的解釋,還有對association和collection標籤的解釋和具體演示,希望能夠幫到你,一起學習,如果用到收藏一下唄!!!!

歡迎大家關注小編的微信公眾號,謝謝大家!