MyBatis之Mapper XML 文件詳解(五)-自動映射查詢結果
當自動映射查詢結果時,MyBatis會獲取sql返回的列名並在java類中查找相同名字的屬性(忽略大小寫)。 這意味著如果Mybatis發現了ID列和id屬性,Mybatis會將ID的值賦給id。
通常數據庫列使用大寫單詞命名,單詞間用下劃線分隔;而java屬性一般遵循駝峰命名法。 為了在這兩種命名方式之間啟用自動映射,需要將 mapUnderscoreToCamelCase設置為true。
自動映射甚至在特定的result map下也能工作。在這種情況下,對於每一個result map,所有的ResultSet提供的列, 如果沒有被手工映射,則將被自動映射。自動映射處理完畢後手工映射才會被處理。 在接下來的例子中, id 和 userName列將被自動映射, hashed_password 列將根據配置映射。
<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 - 將自動映射結果除了那些有內部定義內嵌結果映射的(joins).
FULL - 自動映射所有。
默認值是PARTIAL,這是有原因的。當使用FULL時,自動映射會在處理join結果時執行,並且join取得若幹相同行的不同實體數據,因此這可能導致非預期的映射。下面的例子將展示這種風險:
<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>
在結果中Blog和Author均將自動映射。但是註意Author有一個id屬性,在ResultSet中有一個列名為id, 所以Author的id將被填充為Blog的id,這不是你所期待的。所以需要謹慎使用FULL。
通過添加autoMapping屬性可以忽略自動映射等級配置,你可以啟用或者禁用自動映射指定的ResultMap。
<resultMap id="userResultMap" type="User" autoMapping="false">
<result property="password" column="hashed_password"/>
</resultMap>
關註微信公眾號:IT哈哈(it_haha),學習更多內容。
MyBatis之Mapper XML 文件詳解(五)-自動映射查詢結果