前言
專案中,有一個資料按不同型別被其他物件重複持有,如何做對映封裝的問題。
e.g. 有兩張表
- 課程表
- 教師表
- 一個課程有兩個教師,一個主教,一個輔教。
- 課程表中的課程有兩個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會自動把下劃線引數轉化為駝峰)。