新聞中心
鑒別器
有時(shí)候,一個(gè)數(shù)據(jù)庫查詢可能會(huì)返回多個(gè)不同的結(jié)果集(但總體上還是有一定的聯(lián)系的)。 鑒別器(?discriminator?)元素就是被設(shè)計(jì)來應(yīng)對(duì)這種情況的,另外也能處理其它情況,例如類的繼承層次結(jié)構(gòu)。 鑒別器的概念很好理解——它很像 Java 語言中的 switch 語句。

成都創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)十年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都封陽臺(tái)等企業(yè),備受客戶稱揚(yáng)。
一個(gè)鑒別器的定義需要指定 ?column ?和 ?javaType ?屬性。?column ?指定了 Mybatis 查詢被比較值的地方。 而 ?javaType ?用來確保使用正確的相等測試(雖然很多情況下字符串的相等測試都可以工作)。例如:
在這個(gè)示例中,MyBatis 會(huì)從結(jié)果集中得到每條記錄,然后比較它的 ?vehicle type? 值。 如果它匹配任意一個(gè)鑒別器的 case,就會(huì)使用這個(gè) case 指定的結(jié)果映射。 這個(gè)過程是互斥的,也就是說,剩余的結(jié)果映射將被忽略(除非它是擴(kuò)展的,我們將在稍后討論它)。 如果不能匹配任何一個(gè) case,MyBatis 就只會(huì)使用鑒別器塊外定義的結(jié)果映射。 所以,如果 ?carResult ?的聲明如下:
那么只有 ?doorCount ?屬性會(huì)被加載。這是為了即使鑒別器的 case 之間都能分為完全獨(dú)立的一組,盡管和父結(jié)果映射可能沒有什么關(guān)系。在上面的例子中,我們當(dāng)然知道 cars 和 ?vehicles ?之間有關(guān)系,也就是 Car 是一個(gè) ?Vehicle?。因此,我們希望剩余的屬性也能被加載。而這只需要一個(gè)小修改。
現(xiàn)在 ?vehicleResult ?和 ?carResult ?的屬性都會(huì)被加載了。
可能有人又會(huì)覺得映射的外部定義有點(diǎn)太冗長了。 因此,對(duì)于那些更喜歡簡潔的映射風(fēng)格的人來說,還有另一種語法可以選擇。例如:
請(qǐng)注意,這些都是結(jié)果映射,如果你完全不設(shè)置任何的 result 元素,MyBatis 將為你自動(dòng)匹配列和屬性。所以上面的例子大多都要比實(shí)際的更復(fù)雜。 這也表明,大多數(shù)數(shù)據(jù)庫的復(fù)雜度都比較高,我們不太可能一直依賴于這種機(jī)制。
網(wǎng)站欄目:創(chuàng)新互聯(lián)MyBatis教程:MyBatis3結(jié)果映射-鑒別器
文章地址:http://m.fisionsoft.com.cn/article/cogggoo.html


咨詢
建站咨詢
