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