5?自動(dòng)映射
當(dāng)自動(dòng)映射查詢(xún)結(jié)果時(shí),MyBatis 會(huì)獲取結(jié)果中返回的列名并在 Java 類(lèi)中查找相同名字的屬性(忽略大小寫(xiě))。 在下面的例子中,id 和 username 列將被自動(dòng)映射,hashed_password 列將根據(jù)配置進(jìn)行映射。
<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>
有三種自動(dòng)映射等級(jí):
NONE - 禁用自動(dòng)映射。僅對(duì)手動(dòng)映射的屬性進(jìn)行映射。
PARTIAL - 對(duì)除在內(nèi)部定義了嵌套結(jié)果映射(也就是連接的屬性)以外的屬性進(jìn)行映射
FULL - 自動(dòng)映射所有屬性。
默認(rèn)值是 PARTIAL,這是有原因的。當(dāng)對(duì)連接查詢(xún)的結(jié)果使用 FULL 時(shí),連接查詢(xún)會(huì)在同一行中獲取多個(gè)不同實(shí)體的數(shù)據(jù),因此可能導(dǎo)致非預(yù)期的映射。 下面的例子將展示這種風(fēng)險(xiǎn):
<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>
無(wú)論設(shè)置的自動(dòng)映射等級(jí)是哪種,你都可以通過(guò)在結(jié)果映射上設(shè)置 autoMapping 屬性來(lái)為指定的結(jié)果映射設(shè)置啟用/禁用自動(dòng)映射。
<resultMap id="userResultMap" type="User" autoMapping="false">
? <result property="password" column="hashed_password"/>
</resultMap>
6?緩存
MyBatis 內(nèi)置了一個(gè)強(qiáng)大的事務(wù)性查詢(xún)緩存機(jī)制,它可以非常方便地配置和定制。 默認(rèn)情況下,只啟用了本地的會(huì)話緩存,它僅僅對(duì)一個(gè)會(huì)話中的數(shù)據(jù)進(jìn)行緩存。 要啟用全局的二級(jí)緩存,只需要在你的 SQL 映射文件中添加一行:
<cache/>
這個(gè)簡(jiǎn)單語(yǔ)句的效果如下:
映射語(yǔ)句文件中的所有 select 語(yǔ)句的結(jié)果將會(huì)被緩存。
映射語(yǔ)句文件中的所有 insert、update 和 delete 語(yǔ)句會(huì)刷新緩存。
緩存會(huì)使用最近最少使用算法(LRU, Least Recently Used)算法來(lái)清除不需要的緩存。
緩存不會(huì)定時(shí)進(jìn)行刷新(也就是說(shuō),沒(méi)有刷新間隔)。
緩存會(huì)保存列表或?qū)ο螅o(wú)論查詢(xún)方法返回哪種)的 1024 個(gè)引用。
緩存會(huì)被視為讀/寫(xiě)緩存,這意味著獲取到的對(duì)象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。
這些屬性可以通過(guò) cache 元素的屬性來(lái)修改。比如:
<cache
? eviction="FIFO"
? flushInterval="60000"
? size="512"
? readOnly="true"/>
這個(gè)更高級(jí)的配置創(chuàng)建了一個(gè) FIFO 緩存,每隔 60 秒刷新,最多可以存儲(chǔ)結(jié)果對(duì)象或列表的 512 個(gè)引用,而且返回的對(duì)象被認(rèn)為是只讀的,因此對(duì)它們進(jìn)行修改可能會(huì)在不同線程中的調(diào)用者產(chǎn)生沖突。 可用的清除策略有:
LRU – 最近最少使用:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。
FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。
SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對(duì)象。
WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對(duì)象。 默認(rèn)的清除策略是 LRU。
flushInterval(刷新間隔)屬性可以被設(shè)置為任意的正整數(shù),設(shè)置的值應(yīng)該是一個(gè)以毫秒為單位的合理時(shí)間量。 默認(rèn)情況是不設(shè)置,也就是沒(méi)有刷新間隔,緩存僅僅會(huì)在調(diào)用語(yǔ)句時(shí)刷新。
size(引用數(shù)目)屬性可以被設(shè)置為任意正整數(shù),要注意欲緩存對(duì)象的大小和運(yùn)行環(huán)境中可用的內(nèi)存資源。默認(rèn)值是 1024。 readOnly(只讀)屬性可以被設(shè)置為 true 或 false。只讀的緩存會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例。 因此這些對(duì)象不能被修改。這就提供了可觀的性能提升。而可讀寫(xiě)的緩存會(huì)(通過(guò)序列化)返回緩存對(duì)象的拷貝。 速度上會(huì)慢一些,但是更安全,因此默認(rèn)值是 false。
————————————————
版權(quán)聲明:本文為CSDN博主「daqiang012」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/daqiang012/article/details/105374373