resultMap 和 resultType 的欄位對映覆蓋問題

emanjusaka發表於2024-03-15

在MyBatis中,如果你使用resultType而不是resultMap,並且結果集中有同名欄位,則預設情況下後出現的欄位值會覆蓋前面的欄位值。這是因為MyBatis在將結果集對映到Java物件時,是按照欄位名稱一一對應進行賦值的。
但若你希望更精確地控制對映關係,並且避免自動覆蓋行為,則可以用resultMap來顯式指定每個欄位應該對映到哪個屬性上,它在遇到同名欄位時不會進行覆蓋,尤其是當涉及到多表查詢時。
例如,如果有兩個表中的欄位名相同,你可以分別為它們起不同的別名:

<select id="selectExample" resultMap="combinedResult">
    SELECT 
        t1.id as t1_id,
        t2.id as t2_id,
        ...
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.id = t2.t1_id
</select>

<resultMap id="combinedResult" type="YourJavaType">
    <id property="idFromTable1" column="t1_id"/>
    <!-- 其他來自table1的欄位 -->
    <id property="idFromTable2" column="t2_id"/>
    <!-- 其他來自table2的欄位 -->
</resultMap>

這樣透過column屬性指定了資料庫中的欄位別名與Java實體類中屬性的對應關係,即使欄位名相同,也能確保正確對映到不同屬性上而不會被覆蓋。

相關文章