MyBatis之Mapper XML 文件詳解(五)-自動映射查詢結果

正如你在前面一節看到的,在簡單的場景下,MyBatis可以替你自動映射查詢結果。 如果遇到複雜的場景,你需要構建一個result map。 但是在本節你將看到,你也可以混合使用這兩種策略。 讓我們到深一點的層面上看看自動映射是怎樣工作的。 

當自動映射查詢結果時,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),學習更多內容。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章