Mybatis結果對映

hresh發表於2020-03-30

結果對映

resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 資料提取程式碼中解放出來,並在一些情形下允許你進行一些 JDBC 不支援的操作。實際上,在為一些比如連線的複雜語句編寫對映程式碼的時候,一份 resultMap 能夠代替實現同等功能的數千行程式碼。ResultMap 的設計思想是,對簡單的語句做到零配置,對於複雜一點的語句,只需要描述語句之間的關係就行了。

問題:

當定義的 bean 類屬性欄位和表中的欄位不一致時,查詢的結果無法精確的對映到 bean 物件中。

表結構定義:

CREATE TABLE `user`(
    `id` INT(20NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
    `name` VARCHAR(30DEFAULT NULL COMMENT '姓名',
    `pwd` VARCHAR(30DEFAULT 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"/>
複製程式碼

這些元素是結果對映的基礎。idresult 元素都將一個列的值對映到一個簡單資料型別(String, int, double, Date 等)的屬性或欄位。

這兩者之間的唯一不同是,id 元素對應的屬性會被標記為物件的識別符號,在比較物件例項時使用。 這樣可以提高整體的效能,尤其是進行快取和巢狀結果對映(也就是連線對映)的時候。 我平時使用都是用 id 修飾表中主鍵。

關於 id 和 result 的屬性,重點關注 property 和 column 屬性,簡單來說就是,property 的值為 JavaBean 中的欄位名,column 指的是資料庫中的列名。

參考文獻

Mybatis官網XML對映檔案

相關文章