MyBatis XML 映射器 自動(dòng)映射、緩存

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

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

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

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

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