MyBatis XML 映射器 自動映射、緩存

5?自動映射

當自動映射查詢結果時,MyBatis 會獲取結果中返回的列名并在 Java 類中查找相同名字的屬性(忽略大小寫)。 在下面的例子中,id 和 username 列將被自動映射,hashed_password 列將根據(jù)配置進行映射。

<select id="selectUsers" resultMap="userResultMap">

? select

? ? user_id? ? ? ? ? ? as "id",

? ? user_name? ? ? ? ? as "username",

? ? hashed_password

? from users

? where user_id = #{id}

</select>

<resultMap id="userResultMap" type="User">

? <result property="password" column="hashed_password"/>

</resultMap>

有三種自動映射等級:

NONE - 禁用自動映射。僅對手動映射的屬性進行映射。

PARTIAL - 對除在內(nèi)部定義了嵌套結果映射(也就是連接的屬性)以外的屬性進行映射

FULL - 自動映射所有屬性。

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

<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="username"/>

</resultMap>

無論設置的自動映射等級是哪種,你都可以通過在結果映射上設置 autoMapping 屬性來為指定的結果映射設置啟用/禁用自動映射。

<resultMap id="userResultMap" type="User" autoMapping="false">

? <result property="password" column="hashed_password"/>

</resultMap>

6?緩存

MyBatis 內(nèi)置了一個強大的事務性查詢緩存機制,它可以非常方便地配置和定制。 默認情況下,只啟用了本地的會話緩存,它僅僅對一個會話中的數(shù)據(jù)進行緩存。 要啟用全局的二級緩存,只需要在你的 SQL 映射文件中添加一行:

<cache/>

這個簡單語句的效果如下:

映射語句文件中的所有 select 語句的結果將會被緩存。

映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。

緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。

緩存不會定時進行刷新(也就是說,沒有刷新間隔)。

緩存會保存列表或對象(無論查詢方法返回哪種)的 1024 個引用。

緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。

這些屬性可以通過 cache 元素的屬性來修改。比如:

<cache

? eviction="FIFO"

? flushInterval="60000"

? size="512"

? readOnly="true"/>

這個更高級的配置創(chuàng)建了一個 FIFO 緩存,每隔 60 秒刷新,最多可以存儲結果對象或列表的 512 個引用,而且返回的對象被認為是只讀的,因此對它們進行修改可能會在不同線程中的調(diào)用者產(chǎn)生沖突。 可用的清除策略有:

LRU – 最近最少使用:移除最長時間不被使用的對象。

FIFO – 先進先出:按對象進入緩存的順序來移除它們。

SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對象。

WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對象。 默認的清除策略是 LRU。

flushInterval(刷新間隔)屬性可以被設置為任意的正整數(shù),設置的值應該是一個以毫秒為單位的合理時間量。 默認情況是不設置,也就是沒有刷新間隔,緩存僅僅會在調(diào)用語句時刷新。

size(引用數(shù)目)屬性可以被設置為任意正整數(shù),要注意欲緩存對象的大小和運行環(huán)境中可用的內(nèi)存資源。默認值是 1024。 readOnly(只讀)屬性可以被設置為 true 或 false。只讀的緩存會給所有調(diào)用者返回緩存對象的相同實例。 因此這些對象不能被修改。這就提供了可觀的性能提升。而可讀寫的緩存會(通過序列化)返回緩存對象的拷貝。 速度上會慢一些,但是更安全,因此默認值是 false。

————————————————

版權聲明:本文為CSDN博主「daqiang012」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/daqiang012/article/details/105374373

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 6,289評論 0 4
  • MyBatis 真正的力量是在映射語句中。這里是奇跡發(fā)生的地方。對于所有的力量,SQL 映射的 XML 文件是相當...
    zhDoveLie閱讀 907評論 1 0
  • SQL 映射文件的頂級元素(按照它們應該被定義的順序): cache – 給定命名空間的緩存配置。 cache-r...
    悠揚前奏閱讀 797評論 0 0
  • 3.XML映射文件 MyBatis 的真正強大在于它的映射語句,也是它的魔力所在。由于它的異常強大,映射器的 XM...
    王偵閱讀 372評論 0 0
  • 吃完晚飯,溜達溜達。 走過綠蔭道,來來往往,一對牽著手溜達的情侶,已經(jīng)反方向走到背后了,“我都沒時間睡覺了,哪有時...
    觀景深呼吸閱讀 205評論 0 1

友情鏈接更多精彩內(nèi)容