mybatis 同一張表的資料被對映到 一個結果物件例項 的 多個屬性物件 上

lilingyan發表於2019-05-06

前言

專案中,有一個資料按不同型別被其他物件重複持有,如何做對映封裝的問題。
e.g. 有兩張表

  1. 課程表
  2. 教師表
  • 一個課程有兩個教師,一個主教,一個輔教。
  • 課程表中的課程有兩個id,分別應用兩個教師。
    所以最終結果物件就是:
class 課程{
    主教;
    輔教;
}
複製程式碼

原處理

課程表連兩次教師表,然後把兩次教師表返回的行資料都附帶上不一樣的別名(字首)。mybatis做兩次map。

簡化處理

<sql id="教師Field">
    ${alias}.`id` AS ${alias}_id,
    ${alias}.`name` AS ${alias}_name,
    ...
</sql>
複製程式碼
<resultMap id="教師Map" type="教師">
    <id column="教師_id" property="id"/>
    <result  column="教師_name" property="name"/>
    ...
</resultMap>
複製程式碼
<resultMap id="課程DtoMap" type="課程dto" extends="課程Map">
    <association property="主教" columnPrefix="主_" resultMap="namespace...教師Map" />
    <association property="輔教" columnPrefix="輔_" resultMap="namespace...教師Map" />
</resultMap>
複製程式碼
<select id="page" resultMap="課程DtoMap">
    SELECT
    <include refid="namespace...教師Field">
        <property name="alias" value="主_教師"/>
    </include>,
    <include refid="namespace...教師Field">
        <property name="alias" value="輔_教師"/>
    </include>
    FROM
      表...
</select>
複製程式碼

更簡化處理

如果需求比較簡單,那就 教師Map 的對映都不用寫。在association元素中,columnPrefix屬性直接 主_教師_ 這樣擷取,然後返回javaType為教師(高版本的mybatis會自動把下劃線引數轉化為駝峰)。

相關文章