MyBatis 3 結(jié)果映射-鑒別器

2022-04-09 14:40 更新

鑒別器

<discriminator javaType="int" column="draft">
  <case value="1" resultType="DraftPost"/>
</discriminator>

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

一個鑒別器的定義需要指定 ?column ?和 ?javaType ?屬性。?column ?指定了 MyBatis 查詢被比較值的地方。 而 ?javaType ?用來確保使用正確的相等測試(雖然很多情況下字符串的相等測試都可以工作)。例如:

<resultMap id="vehicleResult" type="Vehicle">
  <id property="id" column="id" />
  <result property="vin" column="vin"/>
  <result property="year" column="year"/>
  <result property="make" column="make"/>
  <result property="model" column="model"/>
  <result property="color" column="color"/>
  <discriminator javaType="int" column="vehicle_type">
    <case value="1" resultMap="carResult"/>
    <case value="2" resultMap="truckResult"/>
    <case value="3" resultMap="vanResult"/>
    <case value="4" resultMap="suvResult"/>
  </discriminator>
</resultMap>

在這個示例中,MyBatis 會從結(jié)果集中得到每條記錄,然后比較它的 ?vehicle type? 值。 如果它匹配任意一個鑒別器的 case,就會使用這個 case 指定的結(jié)果映射。 這個過程是互斥的,也就是說,剩余的結(jié)果映射將被忽略(除非它是擴展的,我們將在稍后討論它)。 如果不能匹配任何一個 case,MyBatis 就只會使用鑒別器塊外定義的結(jié)果映射。 所以,如果 ?carResult ?的聲明如下:

<resultMap id="carResult" type="Car">
  <result property="doorCount" column="door_count" />
</resultMap>

那么只有 ?doorCount ?屬性會被加載。這是為了即使鑒別器的 case 之間都能分為完全獨立的一組,盡管和父結(jié)果映射可能沒有什么關系。在上面的例子中,我們當然知道 cars 和 ?vehicles ?之間有關系,也就是 Car 是一個 ?Vehicle?。因此,我們希望剩余的屬性也能被加載。而這只需要一個小修改。

<resultMap id="carResult" type="Car" extends="vehicleResult">
  <result property="doorCount" column="door_count" />
</resultMap>

現(xiàn)在 ?vehicleResult ?和 ?carResult ?的屬性都會被加載了。

可能有人又會覺得映射的外部定義有點太冗長了。 因此,對于那些更喜歡簡潔的映射風格的人來說,還有另一種語法可以選擇。例如:

<resultMap id="vehicleResult" type="Vehicle">
  <id property="id" column="id" />
  <result property="vin" column="vin"/>
  <result property="year" column="year"/>
  <result property="make" column="make"/>
  <result property="model" column="model"/>
  <result property="color" column="color"/>
  <discriminator javaType="int" column="vehicle_type">
    <case value="1" resultType="carResult">
      <result property="doorCount" column="door_count" />
    </case>
    <case value="2" resultType="truckResult">
      <result property="boxSize" column="box_size" />
      <result property="extendedCab" column="extended_cab" />
    </case>
    <case value="3" resultType="vanResult">
      <result property="powerSlidingDoor" column="power_sliding_door" />
    </case>
    <case value="4" resultType="suvResult">
      <result property="allWheelDrive" column="all_wheel_drive" />
    </case>
  </discriminator>
</resultMap>

請注意,這些都是結(jié)果映射,如果你完全不設置任何的 result 元素,MyBatis 將為你自動匹配列和屬性。所以上面的例子大多都要比實際的更復雜。 這也表明,大多數(shù)數(shù)據(jù)庫的復雜度都比較高,我們不太可能一直依賴于這種機制。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號