99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

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

2022-04-09 14:49 更新

正如你在前面一節(jié)看到的,在簡單的場景下,MyBatis 可以為你自動映射查詢結果。但如果遇到復雜的場景,你需要構建一個結果映射。 但是在本節(jié)中,你將看到,你可以混合使用這兩種策略。讓我們深入了解一下自動映射是怎樣工作的。

當自動映射查詢結果時,MyBatis 會獲取結果中返回的列名并在 ?Java ?類中查找相同名字的屬性(忽略大小寫)。 這意味著如果發(fā)現(xiàn)了 ID 列和 id 屬性,MyBatis 會將列 ID 的值賦給 id 屬性。

通常數(shù)據庫列使用大寫字母組成的單詞命名,單詞間用下劃線分隔;而 ?Java ?屬性一般遵循駝峰命名法約定。為了在這兩種命名方式之間啟用自動映射,需要將 ?mapUnderscoreToCamelCase ?設置為 ?true?。

甚至在提供了結果映射后,自動映射也能工作。在這種情況下,對于每一個結果映射,在 ?ResultSet ?出現(xiàn)的列,如果沒有設置手動映射,將被自動映射。在自動映射處理完畢后,再處理手動映射。 在下面的例子中,?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 ?- 對除在內部定義了嵌套結果映射(也就是連接的屬性)以外的屬性進行映射
  • ?FULL ?- 自動映射所有屬性。

默認值是 ?PARTIAL?,這是有原因的。當對連接查詢的結果使用 ?FULL ?時,連接查詢會在同一行中獲取多個不同實體的數(shù)據,因此可能導致非預期的映射。 下面的例子將展示這種風險:

<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 id="userResultMap" type="User" autoMapping="false">
  <result property="password" column="hashed_password"/>
</resultMap>


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號