W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
正如你在前面一節(jié)看到的,在簡單的場景下,MyBatis 可以為你自動映射查詢結(jié)果。但如果遇到復(fù)雜的場景,你需要構(gòu)建一個結(jié)果映射。 但是在本節(jié)中,你將看到,你可以混合使用這兩種策略。讓我們深入了解一下自動映射是怎樣工作的。
當(dāng)自動映射查詢結(jié)果時,MyBatis 會獲取結(jié)果中返回的列名并在 ?Java
?類中查找相同名字的屬性(忽略大小寫)。 這意味著如果發(fā)現(xiàn)了 ID 列和 id 屬性,MyBatis 會將列 ID 的值賦給 id 屬性。
通常數(shù)據(jù)庫列使用大寫字母組成的單詞命名,單詞間用下劃線分隔;而 ?Java
?屬性一般遵循駝峰命名法約定。為了在這兩種命名方式之間啟用自動映射,需要將 ?mapUnderscoreToCamelCase
?設(shè)置為 ?true
?。
甚至在提供了結(jié)果映射后,自動映射也能工作。在這種情況下,對于每一個結(jié)果映射,在 ?ResultSet
?出現(xiàn)的列,如果沒有設(shè)置手動映射,將被自動映射。在自動映射處理完畢后,再處理手動映射。 在下面的例子中,?id
?和 ?userName
?列將被自動映射,?hashed_password
?列將根據(jù)配置進行映射。
<select id="selectUsers" resultMap="userResultMap">
select
user_id as "id",
user_name as "userName",
hashed_password
from some_table
where id = #{id}
</select>
<resultMap id="userResultMap" type="User">
<result property="password" column="hashed_password"/>
</resultMap>
有三種自動映射等級:
NONE
?- 禁用自動映射。僅對手動映射的屬性進行映射。
PARTIAL
?- 對除在內(nèi)部定義了嵌套結(jié)果映射(也就是連接的屬性)以外的屬性進行映射
FULL
?- 自動映射所有屬性。默認(rèn)值是 ?PARTIAL
?,這是有原因的。當(dāng)對連接查詢的結(jié)果使用 ?FULL
?時,連接查詢會在同一行中獲取多個不同實體的數(shù)據(jù),因此可能導(dǎo)致非預(yù)期的映射。 下面的例子將展示這種風(fēng)險:
<select id="selectBlog" resultMap="blogResult">
select
B.id,
B.title,
A.username,
from Blog B left outer join Author A on B.author_id = A.id
where B.id = #{id}
</select>
<resultMap id="blogResult" type="Blog">
<association property="author" resultMap="authorResult"/>
</resultMap>
<resultMap id="authorResult" type="Author">
<result property="username" column="author_username"/>
</resultMap>
在該結(jié)果映射中,Blog 和 Author 均將被自動映射。但是注意 Author 有一個 id 屬性,在 ?ResultSet
?中也有一個名為 id 的列,所以 Author 的 id 將填入 Blog 的 id,這可不是你期望的行為。 所以,要謹(jǐn)慎使用 FULL。
無論設(shè)置的自動映射等級是哪種,你都可以通過在結(jié)果映射上設(shè)置 ?autoMapping
?屬性來為指定的結(jié)果映射設(shè)置啟用/禁用自動映射。
<resultMap id="userResultMap" type="User" autoMapping="false">
<result property="password" column="hashed_password"/>
</resultMap>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: