結果對映
resultMap
元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets
資料提取程式碼中解放出來,並在一些情形下允許你進行一些 JDBC 不支援的操作。實際上,在為一些比如連線的複雜語句編寫對映程式碼的時候,一份 resultMap
能夠代替實現同等功能的數千行程式碼。ResultMap 的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。
問題:
當定義的 bean 類屬性欄位和表中的欄位不一致時,查詢的結果無法精確的對映到 bean 物件中。
表結構定義:
CREATE TABLE `user`(
`id` INT(20) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
`name` VARCHAR(30) DEFAULT NULL COMMENT '姓名',
`pwd` VARCHAR(30) DEFAULT NULL COMMENT '密碼',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT charset=utf8;
複製程式碼
User.java
@Data
@AllArgsConstructor
@Alias("user")
public class User {
private int id;
private String name;
private String password;
}
複製程式碼
可以直觀的發現 password 和 pwd 名稱不一致,如果按照之前的 UserMapper.xml 檔案進行資料查詢,發現查詢的 user 物件中的 password 屬性值為 null。
解決方案
方案一:編寫 SQL 語句時指定別名,別名和 Java 實體類的屬性名一致。
<select id="selectUserById" resultType="User">
select id , name , pwd as password from user where id = #{id}
</select>
複製程式碼
方案二:使用結果集對映 ResultMap 【推薦】
<resultMap id="userMap" type="User">
<result property="password" column="pwd" />
</resultMap>
<select id="getUserList" resultMap="userMap">
select * from mybatis.user
</select>
複製程式碼
為了減少程式碼量,只需要將不一致的欄位對映好就可以了。
resultMap
ResultMap 的屬性列表
屬性 | 描述 |
---|---|
id | 當前名稱空間中的一個唯一標識,用於標識一個結果對映。 |
type | 類的完全限定名, 或者一個型別別名 |
autoMapping | 如果設定這個屬性,MyBatis 將會為本結果對映開啟或者關閉自動對映。 這個屬性會覆蓋全域性的屬性 autoMappingBehavior。預設值:未設定(unset)。 |
id & result
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
複製程式碼
這些元素是結果對映的基礎。id 和 result 元素都將一個列的值對映到一個簡單資料型別(String, int, double, Date 等)的屬性或欄位。
這兩者之間的唯一不同是,id 元素對應的屬性會被標記為物件的識別符號,在比較物件例項時使用。 這樣可以提高整體的效能,尤其是進行快取和巢狀結果對映(也就是連線對映)的時候。 我平時使用都是用 id 修飾表中主鍵。
關於 id 和 result 的屬性,重點關注 property 和 column 屬性,簡單來說就是,property 的值為 JavaBean 中的欄位名,column 指的是資料庫中的列名。