MyBatis 3 XML映射文件-自動映射

2022-04-09 14:49 更新

正如你在前面一節(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>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號