Mybatis 高级结果映射 ResultMap Association Collection
來源:http://www.verydemo.com/demo_c152_i1880.html
MyBatis的創(chuàng)建基于這樣一個思想:數(shù)據(jù)庫并不是您想怎樣就怎樣的。雖然我們希望所有的數(shù)據(jù)庫遵守第三范式或BCNF(修正的第三范式),但它們不是。如果有一個數(shù)據(jù)庫能夠完美映射到所有應(yīng)用程序,也將是非常棒的,但也沒有。結(jié)果集映射就是MyBatis為解決這些問題而提供的解決方案。例如,我們?nèi)绾?strong>映射下面這條語句?
查看文本打印?您可能想要把它映射到一個智能的對象模型,包括由一個作者寫的一個博客,有許多文章(Post,帖子),每個文章由0個或者多個評論和標(biāo)簽。下面是一個復(fù)雜ResultMap?的完整例子(假定作者、博客、文章、評論和標(biāo)簽都是別名)。仔細(xì)看看這個例子,但是不用太擔(dān)心,我們會一步步地來分析,一眼看上去可能讓人沮喪,但是實(shí)際上非常簡單的
查看文本打印?這個resultMap?的元素的子元素比較多,討論起來比較寬泛。下面我們從概念上概覽一下這個resultMap的元素。
?
resultMap
·constructor–實(shí)例化的時候通過構(gòu)造器將結(jié)果集注入到類中
oidArg– ID?參數(shù);?將結(jié)果集標(biāo)記為ID,以方便全局調(diào)用
oarg–注入構(gòu)造器的結(jié)果集
·id–結(jié)果集ID,將結(jié)果集標(biāo)記為ID,以方便全局調(diào)用
·result–注入一個字段或者javabean屬性的結(jié)果
·association–復(fù)雜類型聯(lián)合;許多查詢結(jié)果合成這個類型
o嵌套結(jié)果映射– associations能引用自身,或者從其它地方引用
·collection–復(fù)雜類型集合
o嵌套結(jié)果映射– collections能引用自身,或者從其它地方引用
·discriminator–使用一個結(jié)果值以決定使用哪個resultMap
ocase–基于不同值的結(jié)果映射
§嵌套結(jié)果映射–case也能引用它自身,?所以也能包含這些同樣的元素。它也可以從外部引用resultMap
?
è最佳實(shí)踐:逐步地生成resultMap,單元測試對此非常有幫助。如果您嘗試一下子就生成像上面這樣巨大的resultMap,可能會出錯,并且工作起來非常吃力。從簡單地開始,再一步步地?cái)U(kuò)展,并且進(jìn)行單元測試。使用框架開發(fā)有一個缺點(diǎn),它們有時像是一個黑合。為了確保達(dá)到您所預(yù)想的行為,最好的方式就是進(jìn)行單元測試。這對提交bugs?也非常有用。
?
下一節(jié),我們一步步地查看這些細(xì)節(jié)。
id, result元素
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
?
這是最基本的結(jié)果集映射。id?和result?將列映射到屬性或簡單的數(shù)據(jù)類型字段(String, int, double, Date等)。
這兩者唯一不同的是,在比較對象實(shí)例時id?作為結(jié)果集的標(biāo)識屬性。這有助于提高總體性能,特別是應(yīng)用緩存和嵌套結(jié)果映射的時候。
?
Id、result屬性如下:
?
| Attribute | Description |
| property | 映射數(shù)據(jù)庫列的字段或?qū)傩浴H绻?span lang="EN-CA">JavaBean?的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis?將搜索給定名稱的字段。兩種情況下您都可以使用逗點(diǎn)的屬性形式。比如,您可以映射到“username”,也可以映射到“address.street.number”。 |
| column | 數(shù)據(jù)庫的列名或者列標(biāo)簽別名。與傳遞給resultSet.getString(columnName)的參數(shù)名稱相同。 |
| javaType | 完整java類名或別名(參考上面的內(nèi)置別名列表)。如果映射到一個JavaBean,那MyBatis?通常會自行檢測到。然而,如果映射到一個HashMap,那您應(yīng)該明確指定javaType?來確保所需行為。 |
| jdbcType | 這張表下面支持的JDBC類型列表列出的JDBC類型。這個屬性只在insert,update或delete?的時候針對允許空的列有用。JDBC?需要這項(xiàng),但MyBatis?不需要。如果您直接編寫JDBC代碼,在允許為空值的情況下需要指定這個類型。 |
| typeHandler | 我們已經(jīng)在文檔中討論過默認(rèn)類型處理器。使用這個屬性可以重寫默認(rèn)類型處理器。它的值可以是一個TypeHandler實(shí)現(xiàn)的完整類名,也可以是一個類型別名。 |
支持的JDBC類型
MyBatis支持如下的JDBC類型:
| BIT | FLOAT | CHAR | TIMESTAMP | OTHER | UNDEFINED |
| TINYINT | REAL | VARCHAR | BINARY | BLOB | NVARCHAR |
| SMALLINT | DOUBLE | LONGVARCHAR | VARBINARY | CLOB | NCHAR |
| INTEGER | NUMERIC | DATE | LONGVARBINARY | BOOLEAN | NCLOB |
| BIGINT | DECIMAL | TIME | NULL | CURSOR | ? |
?
Constructor元素
<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
?
當(dāng)屬性與DTO,或者與您自己的域模型一起工作的時候,許多場合要用到不變類。通常,包含引用,或者查找的數(shù)據(jù)很少或者數(shù)據(jù)不會改變的的表,適合映射到不變類中。構(gòu)造器注入允許您在類實(shí)例化后給類設(shè)值,這不需要通過public方法。MyBatis同樣也支持private屬性和JavaBeans的私有屬性達(dá)到這一點(diǎn),但是一些用戶可能更喜歡使用構(gòu)造器注入。構(gòu)造器元素可以做到這點(diǎn)。
?
考慮下面的構(gòu)造器:
?
public class User {
//…
public User(int id, String username) {
//…
}
//…
}
?
為了將結(jié)果注入構(gòu)造器,MyBatis需要使用它的參數(shù)類型來標(biāo)記構(gòu)造器。Java沒有辦法通過參數(shù)名稱來反射獲得。因此當(dāng)創(chuàng)建constructor?元素,確保參數(shù)是按順序的并且指定了正確的類型。
?
<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
?
其它的屬性與規(guī)則與id、result元素的一樣。
?
| Attribute | Description |
| column | 數(shù)據(jù)庫的列名或者列標(biāo)簽別名。與傳遞給resultSet.getString(columnName)的參數(shù)名稱相同。 |
| javaType | 完整java類名或別名(參考上面的內(nèi)置別名列表)。如果映射到一個JavaBean,那MyBatis?通常會自行檢測到。然而,如果映射到一個HashMap,那您應(yīng)該明確指定javaType?來確保所需行為。 |
| jdbcType | 支持的JDBC類型列表中列出的JDBC類型。這個屬性只在insert,update?或delete?的時候針對允許空的列有用。JDBC?需要這項(xiàng),但MyBatis?不需要。如果您直接編寫JDBC代碼,在允許為空值的情況下需要指定這個類型。 |
| typeHandler | 我們已經(jīng)在文檔中討論過默認(rèn)類型處理器。使用這個屬性可以重寫默認(rèn)類型處理器。它的值可以是一個TypeHandler實(shí)現(xiàn)的完整類名,也可以是一個類型別名。 |
Association元素
<association property="author" column="blog_author_id" javaType=" Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
</association>
Association元素處理“has-one”(一對一)這種類型關(guān)系。比如在我們的例子中,一個Blog有一個Author。聯(lián)合映射與其它的結(jié)果集映射工作方式差不多,指定property、column、javaType(通常MyBatis會自動識別)、jdbcType(如果需要)、typeHandler。
不同的地方是您需要告訴MyBatis?如何加載一個聯(lián)合查詢。MyBatis使用兩種方式來加載:
·Nested Select:通過執(zhí)行另一個返回預(yù)期復(fù)雜類型的映射SQL語句(即引用外部定義好的SQL語句塊)。
·Nested Results:通過嵌套結(jié)果映射(nested result mappings)來處理聯(lián)接結(jié)果集(joined results)的重復(fù)子集。
首先,讓我們檢查一下元素屬性。正如您看到的,它不同于普通只有select和resultMap屬性的結(jié)果映射。
| Attribute | Description |
| property | 映射數(shù)據(jù)庫列的字段或?qū)傩浴H绻?span lang="EN-CA">JavaBean?的屬性與給定的名稱匹配,就會使用匹配的名字。否則,MyBatis?將搜索給定名稱的字段。兩種情況下您都可以使用逗點(diǎn)的屬性形式。比如,您可以映射到”username”,也可以映射到更復(fù)雜點(diǎn)的”address.street.number”。 |
| column | 數(shù)據(jù)庫的列名或者列標(biāo)簽別名。與傳遞給resultSet.getString(columnName)的參數(shù)名稱相同。 注意: 在處理組合鍵時,您可以使用column= “{prop1=col1,prop2=col2}”這樣的語法,設(shè)置多個列名傳入到嵌套查詢語句。這就會把prop1和prop2設(shè)置到目標(biāo)嵌套選擇語句的參數(shù)對象中。 |
| javaType | 完整java類名或別名(參考上面的內(nèi)置別名列表)。如果映射到一個JavaBean,那MyBatis?通常會自行檢測到。然而,如果映射到一個HashMap,那您應(yīng)該明確指定javaType?來確保所需行為。 |
| jdbcType | 支持的JDBC類型列表中列出的JDBC類型。這個屬性只在insert,update?或delete?的時候針對允許空的列有用。JDBC?需要這項(xiàng),但MyBatis?不需要。如果您直接編寫JDBC代碼,在允許為空值的情況下需要指定這個類型。 |
| typeHandler | 我們已經(jīng)在文檔中討論過默認(rèn)類型處理器。使用這個屬性可以重寫默認(rèn)類型處理器。它的值可以是一個TypeHandler實(shí)現(xiàn)的完整類名,也可以是一個類型別名。 |
聯(lián)合嵌套選擇(Nested Select for Association)
| select | 通過這個屬性,通過ID引用另一個加載復(fù)雜類型的映射語句。從指定列屬性中返回的值,將作為參數(shù)設(shè)置給目標(biāo)select?語句。表格下方將有一個例子。注意:在處理組合鍵時,您可以使用column=”{prop1=col1,prop2=col2}”這樣的語法,設(shè)置多個列名傳入到嵌套語句。這就會把prop1和prop2設(shè)置到目標(biāo)嵌套語句的參數(shù)對象中。 |
?例如:??
查看文本打印?我們使用兩個select語句:一個用來加載Blog,另一個用來加載Author。Blog的resultMap?描述了使用“selectAuthor”語句來加載author的屬性。
如果列名和屬性名稱相匹配的話,所有匹配的屬性都會自動加載。
?
| 譯者注: 上面的例子,首先執(zhí)行<select id=“selectBlog”>,執(zhí)行結(jié)果存放到<resultMap id=“blogResult”>結(jié)果映射中。“blogResult”是一個Blog類型,從<select id=“selectBlog”>查出的數(shù)據(jù)都會自動賦值給”blogResult”的與列名匹配的屬性,這時blog_id,title等就被賦值了。同時“blogResult”還有一個關(guān)聯(lián)屬性"Author",執(zhí)行嵌套查詢select=”selectAuthor”后,Author對象的屬性id,username,password,email,bio也被賦于數(shù)據(jù)庫匹配的值。 ? Blog { blog_id; title; Author author { id; username; password; email; bio; ? } ? } |
?
雖然這個方法簡單,但是對于大數(shù)據(jù)集或列表查詢,就不盡如人意了。這個問題被稱為“N+1?選擇問題”(N+1 Selects Problem)。概括地說,N+1選擇問題是這樣產(chǎn)生的:
·您執(zhí)行單條SQL語句去獲取一個列表的記錄( “+1”)。
·對列表中的每一條記錄,再執(zhí)行一個聯(lián)合select?語句來加載每條記錄更加詳細(xì)的信息(“N”)。
這個問題會導(dǎo)致成千上萬的SQL語句的執(zhí)行,因此并非總是可取的。
上面的例子,MyBatis可以使用延遲加載這些查詢,因此這些查詢立馬可節(jié)省開銷。然而,如果您加載一個列表后立即迭代訪問嵌套的數(shù)據(jù),這將會調(diào)用所有的延遲加載,因此性能會變得非常糟糕。
鑒于此,這有另外一種方式。
聯(lián)合嵌套結(jié)果集(Nested Results for Association)?
| resultMap | 一個可以映射聯(lián)合嵌套結(jié)果集到一個適合的對象視圖上的ResultMap?。這是一個替代的方式去調(diào)用另一個select?語句。它允許您去聯(lián)合多個表到一個結(jié)果集里。這樣的結(jié)果集可能包括冗余的、重復(fù)的需要分解和正確映射到一個嵌套對象視圖的數(shù)據(jù)組。簡言之,MyBatis?讓您把結(jié)果映射‘鏈接’到一起,用來處理嵌套結(jié)果。舉個例子會更好理解,例子在表格下方。 |
您已經(jīng)在上面看到了一個非常復(fù)雜的嵌套聯(lián)合的例子,接下的演示的例子會更簡單一些。我們把Blog和Author表聯(lián)接起來查詢,而不是執(zhí)行分開的查詢語句:
查看文本打印?注意到這個連接(join),要確保所有的別名都是唯一且無歧義的。這使映射容易多了,現(xiàn)在我們來映射結(jié)果集:
查看文本打印?在上面的例子中,您會看到Blog的作者(“author”)聯(lián)合一個“authorResult”結(jié)果映射來加載Author實(shí)例。
重點(diǎn)提示:id元素在嵌套結(jié)果映射中扮演了非常重要的角色,您應(yīng)該總是指定一個或多個屬性來唯一標(biāo)識這個結(jié)果集。事實(shí)上,如果您沒有那樣做,MyBatis也會工作,但是會導(dǎo)致嚴(yán)重性能開銷。選擇盡量少的屬性來唯一標(biāo)識結(jié)果,而使用主鍵是最明顯的選擇(即使是復(fù)合主鍵)。
上面的例子使用一個擴(kuò)展的resultMap?元素來聯(lián)合映射。這可使Author結(jié)果映射可重復(fù)使用。然后,如果您不需要重用它,您可以直接嵌套這個聯(lián)合結(jié)果映射。下面例子就是使用這樣的方式:?
查看文本打印?在上面的例子中您已經(jīng)看到如果處理“一對一”(“has one”)類型的聯(lián)合查詢。但是對于“一對多”(“has many”)的情況如果處理呢?這個問題在下一節(jié)討論。
Collection元素?
查看文本打印?collection元素的作用差不多和association元素的作用一樣。事實(shí)上,它們非常相似,以至于再對相似點(diǎn)進(jìn)行描述會顯得冗余,因此我們只關(guān)注它們的不同點(diǎn)。
繼續(xù)我們上面的例子,一個Blog只有一個Author。但一個Blog有許多帖子(文章)。在Blog類中,會像下面這樣定義相應(yīng)屬性:?
private List<Post> posts;
映射一個嵌套結(jié)果集到一個列表,我們使用collection元素。就像association?元素那樣,我們使用嵌套查詢,或者從連接中嵌套結(jié)果集。?
集合嵌套選擇(Nested Select for Collection)
首先我們使用嵌套選擇來加載Blog的文章。?
查看文本打印?一看上去這有許多東西需要注意,但大部分看起與我們在association元素中學(xué)過的相似。首先,您會注意到我們使用了collection元素,然后會注意到一個新的屬性“ofType”。這個元素是用來區(qū)別JavaBean屬性(或者字段)類型和集合所包括的類型。因此您會讀到下面這段代碼。
?
<collection property="posts" javaType=”ArrayList” column="blog_id"
ofType="Post" select=”selectPostsForBlog”/>
è理解為:“一個名為posts,類型為Post的ArrayList集合(A collection of posts in an ArrayList of type Post)” 。
javaType屬性不是必須的,通常MyBatis?會自動識別,所以您通常可以簡略地寫成:
<collection property="posts" column="blog_id" ofType="Post"
select=”selectPostsForBlog”/>
集合的嵌套結(jié)果集(Nested Results for Collection)
這時候,您可能已經(jīng)猜出嵌套結(jié)果集是怎樣工作的了,因?yàn)樗cassociation非常相似,只不過多了一個屬性“ofType”。
讓我們看下這個SQL:?
查看文本打印?同樣,我們把Blog和Post兩張表連接在一起,并且也保證列標(biāo)簽名在映射的時候是唯一且無歧義的。現(xiàn)在將Blog和Post的集合映射在一起是多么簡單:
查看文本打印?再次強(qiáng)調(diào)一下,id?元素是非常重要的。如果您忘了或者不知道id?元素的作用,請先讀一下上面association?一節(jié)。
如果希望結(jié)果映射有更好的可重用性,您可以使用下面的方式:
查看文本打印?èNote:在您的映射中沒有深度、寬度、聯(lián)合和集合數(shù)目的限制。但應(yīng)該謹(jǐn)記,在進(jìn)行映射的時候也要考慮性能的因素。應(yīng)用程序的單元測試和性能測試幫助您發(fā)現(xiàn)最好的方式可能要花很長時間。但幸運(yùn)的是,MyBatis允許您以后可以修改您的想法,這時只需要修改少量代碼就行了。
關(guān)于高級聯(lián)合和集合映射是一個比較深入的課題,文檔只能幫您了解到這里,多做一些實(shí)踐,一切將很快變得容易理解。
Discriminator元素
<discriminator javaType="int" column="draft">
<case value="1" resultType="DraftPost"/>
</discriminator>
?
有時候一條數(shù)據(jù)庫查詢可能會返回包括各種不同的數(shù)據(jù)類型的結(jié)果集。Discriminator(識別器)元素被設(shè)計(jì)來處理這種情況,以及其它像類繼承層次情況。識別器非常好理解,它就像java里的switch語句。
?
Discriminator定義要指定column和javaType屬性。列是MyBatis將要取出進(jìn)行比較的值,javaType用來確定適當(dāng)?shù)臏y試是否正確運(yùn)行(雖然String在大部分情況下都可以工作),例:??
查看文本打印?在這個例子中,MyBatis將會從結(jié)果集中取出每條記錄,然后比較它的vehicle type的值。如果匹配任何discriminator中的case,它將使用由case指定的resultMap。這是排它性的,換句話說,其它的case的resultMap將會被忽略(除非使用我們下面說到的extended)。如果沒有匹配到任何case,MyBatis只是簡單的使用定義在discriminator塊外面的resultMap。所以,如果carResult像下面這樣定義:
?
<resultMap id="carResult" type="Car">
<result property=”doorCount” column="door_count" />
</resultMap>
?
那么,只有doorCount屬性會被加載。這樣做是為了與識別器cases群組完全獨(dú)立開來,哪怕它與上一層的resultMap?一點(diǎn)關(guān)系都沒有。在剛才的例子里我們當(dāng)然知道cars和vehicles的關(guān)系,a Car is-a Vehicle。因此,我們也要把其它屬性加載進(jìn)來。我們要稍稍改動一下resultMap:
?
<resultMap id="carResult" type="Car"extends=”vehicleResult”>
<result property=”doorCount” column="door_count" />
</resultMap>
?
現(xiàn)在,vehicleResult和carResult的所有屬性都會被加載。
可能有人會認(rèn)為這樣擴(kuò)展映射定義有一點(diǎn)單調(diào)了,所以還有一種可選的更加簡單明了的映射風(fēng)格語法。例如:
查看文本打印?è記住:對于這么多的結(jié)果映射,如果您不指定任何的結(jié)果集,那么MyBatis?會自動地將列名與屬性相匹配。所以上面所舉的例子比實(shí)際中需要的要詳細(xì)。盡管如此,大部分?jǐn)?shù)據(jù)庫有點(diǎn)復(fù)雜,并且它并不是所有情況都是完全可以適用的。
Cache元素
MyBatis包含一個強(qiáng)大的、可配置、可定制的查詢緩存機(jī)制。MyBatis 3?的緩存實(shí)現(xiàn)有了許多改進(jìn),使它更強(qiáng)大更容易配置。默認(rèn)的情況,緩存是沒有開啟,除了會話緩存以外,它可以提高性能,且能解決循環(huán)依賴。開啟二級緩存,您只需要在SQL映射文件中加入簡單的一行:
?
<cache/>
?
這句簡單的語句作用如下:
·所有映射文件里的select語句的結(jié)果都會被緩存。
·所有映射文件里的insert、update和delete語句執(zhí)行都會清空緩存。
·緩存使用最近最少使用算法(LRU)來回收。
·緩存不會被設(shè)定的時間所清空。
·每個緩存可以存儲1024?個列表或?qū)ο蟮囊?#xff08;不管查詢方法返回的是什么)。
·緩存將作為“讀/寫”緩存,意味著檢索的對象不是共享的且可以被調(diào)用者安全地修改,而不會被其它調(diào)用者或者線程干擾。
所有這些特性都可以通過cache元素進(jìn)行修改。例如:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
?
這種高級的配置創(chuàng)建一個每60秒刷新一次的FIFO?緩存,存儲512個結(jié)果對象或列表的引用,并且返回的對象是只讀的。因此在不用的線程里的調(diào)用者修改它們可能會引用沖突。
?
可用的回收算法如下:
·LRU–最近最少使用:移出最近最長時間內(nèi)都沒有被使用的對象。
·FIFO–先進(jìn)先出:移除最先進(jìn)入緩存的對象。
·SOFT–軟引用:?基于垃圾回收機(jī)制和軟引用規(guī)則來移除對象(空間內(nèi)存不足時才進(jìn)行回收)。
·WEAK–弱引用:基于垃圾回收機(jī)制和弱引用規(guī)則(垃圾回收器掃描到時即進(jìn)行回收)。
默認(rèn)使用LRU。
flushInterval:設(shè)置任何正整數(shù),代表一個以毫秒為單位的合理時間。默認(rèn)是沒有設(shè)置,因此沒有刷新間隔時間被使用,在語句每次調(diào)用時才進(jìn)行刷新。
Size:屬性可以設(shè)置為一個正整數(shù),您需要留意您要緩存對象的大小和環(huán)境中可用的內(nèi)存空間。默認(rèn)是1024。
readOnly:屬性可以被設(shè)置為true?或false。只讀緩存將對所有調(diào)用者返回同一個實(shí)例。因此這些對象都不能被修改,這可以極大的提高性能。可寫的緩存將通過序列化來返回一個緩存對象的拷貝。這會比較慢,但是比較安全。所以默認(rèn)值是false。
?
使用自定義緩存
除了上面已經(jīng)定義好的緩存方式,您能夠通過您自己的緩存實(shí)現(xiàn)來完全重寫緩存行為,或者通過創(chuàng)建第三方緩存解決方案的適配器。
<cache type=”com.domain.something.MyCustomCache”/>
這個例子演示了如果自定義緩存實(shí)現(xiàn)。由type指定的類必須實(shí)現(xiàn)org.mybatis.cache.Cache接口。這個接口是MyBatis框架比較復(fù)雜的接口之一,先給個示例:
public interface Cache {
String getId();
int getSize();
void putObject(Object key, Object value);
Object getObject(Object key);
boolean hasKey(Object key);
Object removeObject(Object key);
void clear();
ReadWriteLock getReadWriteLock();
}
?
要配置您的緩存,簡單地添加一個公共的JavaBeans?屬性到您的緩存實(shí)現(xiàn)中,然后通過cache?元素設(shè)置屬性進(jìn)行傳遞,下面示例,將在您的緩存實(shí)現(xiàn)上調(diào)用一個setCacheFile(String file)方法。
?
<cache type=”com.domain.something.MyCustomCache”>
<property name=”cacheFile” value=”/tmp/my-custom-cache.tmp”/>
</cache>
?
您可以使用所有簡單的JavaBeans屬性,MyBatis會自動進(jìn)行轉(zhuǎn)換。
需要牢記的是一個緩存配置和緩存實(shí)例都綁定到一個SQL Map?文件命名空間。因此,所有的這個相同命名空間的語句也都和這個緩存綁定。語句可以修改如何與這個緩存相匹配,或者使用兩個簡單的屬性來完全排除它們自己。默認(rèn)情況下,語句像下面這樣來配置:
<select ... flushCache=”false” useCache=”true”/>
<insert ... flushCache=”true”/>
<update ... flushCache=”true”/>
<delete ... flushCache=”true”/>?
因?yàn)橛心J(rèn)值,所以您不需要使用這種方式明確地配置這些語句。如果您想改變默認(rèn)的動作,只需要設(shè)置flushCache和useCache?屬性即可。舉個例子來說,在許多的場合下您可能排除緩存中某些特定的select語句。或者您想用select語句清空緩存。同樣的,您也可能有一些update?語句在執(zhí)行的時候不需要清空緩存。
?
cache-ref元素
回想上一節(jié),我們僅僅只是討論在某一個命名空間里使用或者刷新緩存。但有可能您想要在不同的命名空間里共享同一個緩存配置或者實(shí)例。在這種情況下,您就可以使用cache-ref?元素來引用另外一個緩存。
<cache-ref namespace=”com.someone.application.data.SomeMapper”/>
總結(jié)
以上是生活随笔為你收集整理的Mybatis 高级结果映射 ResultMap Association Collection的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 91手机助手怎么用?91手机助手使用教程
- 下一篇: spring security只要熟悉每