MyBatis 建立時的一個思想是:資料庫不可能永遠是你所想或所需的那個樣子。 我們希望每個資料庫都具備良好的第三正規化或 BCNF 正規化,可惜它們並不都是那樣。 如果能有一種資料庫對映模式,完美適配所有的應用程式,那就太好了,但可惜也沒有。 而 ResultMap 就是 MyBatis 對這個問題的答案。
屬性 | 描述 |
---|---|
id | 當前名稱空間中的一個唯一標識,用於標識一個結果對映。 |
type | 類的完全限定名, 或者一個型別別名(關於內建的型別別名,可以參考上面的表格)。 |
autoMapping | 如果設定這個屬性,MyBatis 將會為本結果對映開啟或者關閉自動對映。 這個屬性會覆蓋全域性的屬性 autoMappingBehavior。預設值:未設定(unset)。 |
extends | 可以繼承其他resultMap的一些寫好的屬性 |
屬性 | 描述 |
---|---|
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>
屬性 | 描述 |
---|---|
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>
屬性 | 描述 |
---|---|
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 |
---|---|
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標籤的解釋和具體演示,希望能夠幫到你,一起學習,如果用到收藏一下唄!!!!
歡迎大家關注小編的微信公眾號,謝謝大家!