MyBatis ResultMap 的基本用法示例詳解
MyBatis 中的 resultMap
在 MyBatis 中,resultMap
用于 定義數(shù)據庫查詢結果到 Java 對象屬性的映射關系。適合處理 復雜的映射關系,如 嵌套對象、集合、一對多或多對一的關系,以及 字段和屬性名不一致 的情況。
resultMap
明確指定數(shù)據庫查詢結果(字段)如何映射到 Java 對象的屬性。通常,resultMap
被用于 SELECT
查詢時的 結果映射,但也可以用于 插入 和 更新 等操作。
1. resultMap 的基本語法
resultMap
通常寫在 MyBatis 的 Mapper.xml
文件中,通過 <resultMap>
標簽定義。以下是 resultMap
的基本語法結構:
<resultMap id="resultMapId" type="Java類類型"> <result property="屬性名" column="列名"/> </resultMap>
id
:resultMap
的唯一標識,可以在select
、insert
等語句中引用。type
:指定查詢結果映射的 Java 類型(通常是一個 POJO 類)。property
:Java 對象的屬性名。column
:數(shù)據庫表的列名。
2. 簡單的 resultMap 示例
假設數(shù)據庫表 t_user
和實體類 User
如下:
t_user
表:
CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), user_email VARCHAR(100), user_age INT );
User
實體類:
public class User { private Integer id; private String username; private String email; private Integer age; // Getters and Setters }
resultMap
示例:
<mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="email" column="user_email"/> <result property="age" column="user_age"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT id, username, user_email, user_age FROM t_user WHERE id = #{id} </select> </mapper>
<resultMap>
標簽用于定義數(shù)據庫列和 Java 屬性之間的映射。<result>
標簽用于指定字段和屬性的具體映射關系(**<resultMap>
**中用于具體描述映射關系的子標簽)。column
是數(shù)據庫列名,property
是 Java 實體類的屬性。
在這個例子中,當執(zhí)行查詢時,MyBatis 會將 t_user
表中的字段映射到 User
類的屬性上。
關于上面的例子,大家可能會有這樣的問題,為什么屬性名和字段名一樣也要寫出來,這種情況MyBatis不是會自動映射嗎?這其實是出于一種 清晰和規(guī)范化的考慮,使用resultMap 的時候盡量把所有屬性和字段的映射關系都寫出來。詳細可以參考:
Mybatis系列第8篇:自動映射,使用需謹慎!
【MyBatis自動映射】為什么即使字段名和屬性名一致,使用resultMap時也應該顯式列出所有映射?
3. 常用的 resultMap 功能
(1) 處理字段名和屬性名不一致
有時數(shù)據庫的列名與 Java 類的屬性名不一致,resultMap
可以幫助處理這種映射。使用 column
來指定數(shù)據庫中的列名,property
來指定 Java 類的屬性名。
例如:
<resultMap id="userResultMap" type="User"> <result property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="user_email"/> </resultMap>
(2) 一對一映射(<association>
)
如果查詢的結果需要映射到一個嵌套的對象(如一對一關系),可以使用 <association>
標簽。
示例:一對一關系(用戶和地址)
假設 t_user
表中有 address_id
字段,表示該用戶的地址 ID,而地址信息存儲在 t_address
表中。我們需要將查詢結果映射為用戶和地址的組合。
t_address
表:
CREATE TABLE t_address ( id INT PRIMARY KEY AUTO_INCREMENT, street VARCHAR(100), city VARCHAR(50) );
Address
實體類:
public class Address { private Integer id; private String street; private String city; // Getters and Setters }
User
實體類(修改版):
public class User { private Integer id; private String username; private Address address; // 關聯(lián)一個 Address 對象 // Getters and Setters }
resultMap
示例:
<mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="User"> <result property="id" column="user_id"/> <result property="username" column="user_name"/> <association property="address" column="address_id" javaType="Address" select="selectAddressById"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT user_id, user_name, address_id FROM t_user WHERE user_id = #{id} </select> <select id="selectAddressById" resultType="Address"> SELECT id, street, city FROM t_address WHERE id = #{addressId} </select> </mapper>
- 使用
<association>
標簽實現(xiàn) 一對一 映射,property
是 Java 對象中的屬性(address
),column
是數(shù)據庫中關聯(lián)的列(address_id
)。 javaType
是關聯(lián)對象的類型(Address
),select
屬性指定了通過address_id
查詢地址完整信息的 SQL 查詢。
原本只能查出
address_id
,現(xiàn)在在userResultMap
中定義把查出來的address_id
映射到address
,但是一個Integer
類的id怎么賦值給Address
類?所以需要在association
的select
屬性中指定根據這個id去對應表中查詢出對應實體類的全部信息,然后再賦值,這就是為什么還要寫一個selectAddressById
的select
語句。
(3) 一對多映射(<collection>
)
如果查詢的結果是多個對象(如一對多關系),可以使用 <collection>
標簽。
示例:一對多關系(用戶和訂單)
假設 t_user
表與 t_order
表之間有一對多關系,即一個用戶有多個訂單。我們可以使用 resultMap
和 <collection>
來映射多個訂單。
t_order
表:
CREATE TABLE t_order ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, order_date DATE );
Order
實體類:
public class Order { private Integer id; private Date orderDate; // Getters and Setters }
User
實體類(修改版):
public class User { private Integer id; private String username; private List<Order> orders; // 一對多的訂單列表 // Getters and Setters }
resultMap
示例:
<mapper namespace="com.example.mapper.UserMapper"> <resultMap id="userResultMap" type="User"> <result property="id" column="user_id"/> <result property="username" column="user_name"/> <collection ofType="Order" property="orders" select="selectOrdersByUserId" column="user_id"/> </resultMap> <select id="selectUserById" resultMap="userResultMap"> SELECT user_id, user_name FROM t_user WHERE user_id = #{id} </select> <select id="selectOrdersByUserId" resultType="Order"> SELECT id, order_date FROM t_order WHERE user_id = #{userId} </select> </mapper>
<collection>
標簽用于一對多的關系映射。property
對應 Java 類中的集合屬性(如orders
),ofType
指定集合元素的類型(如Order
),select
指定查詢訂單的 SQL。collection ofType="Order"
:字面意思就是關于“Order”的集合property="orders"
,column="user_id"
:表示我們要從查詢出的user_id
映射到orders
屬性,但是一個是Integer
類,一個是List
類,怎么對應?select="selectOrdersByUserId"
:所以用指定一個查詢語句,我們可以根據這個Integer
類的id(user_id
)查詢出List
類(這個用戶對應的所有訂單的List)
4. 總結
resultMap
是 MyBatis 中強大的映射工具,能夠幫助我們處理復雜的 字段到屬性的映射關系,如一對一、一對多、嵌套對象等。- 對于 簡單的字段映射,我們可以使用
@Results
注解;但對于 復雜的關聯(lián)關系,resultMap
給予我們更大的靈活性。 <association>
和<collection>
是resultMap
中常用的標簽,用于處理 一對一 和 一對多 的關系映射。- 使用
resultMap
可以讓查詢結果映射更明確和可控,尤其適用于多表聯(lián)查或關系復雜的場景。
到此這篇關于MyBatis ResultMap 的基本用法的文章就介紹到這了,更多相關MyBatis ResultMap用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot參數(shù)校驗之@Valid的使用詳解
這篇文章主要通過示例為大家詳細介紹一下介紹了SpringBoot參數(shù)校驗中@Valid的使用方法,文中的示例代碼講解詳細,需要的可以參考一下2022-06-06Java NegativeArraySizeException異常解決方案
這篇文章主要介紹了Java NegativeArraySizeException異常解決方案,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08MyBatis游標Cursor的正確使用和百萬數(shù)據傳輸?shù)膬却鏈y試
這篇文章主要介紹了MyBatis游標Cursor的正確使用和百萬數(shù)據傳輸?shù)膬却鏈y試,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01