首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 映射檔與實體類關聯設計最佳實踐:多表關聯查詢與結果映射技巧

     編輯:Java 相關知識

MyBatis 映射設計核心挑戰

MyBatis 映射檔寫法多樣,不同策略對開發效率、維護成本影響巨大。本文以 User 實體類與 UserMap.xml 為例,示範一種結構清晰、支援多表關聯、減少重複代碼的進階映射寫法。

實體類設計:巢狀物件結構

User 類包含大量引用型別屬性(Office company、Dept dept、Role role、School school 等),而非單純基本型別。這要求映射檔能將多表 JOIN 查詢結果自動填充至巢狀物件圖中,例如 user.getCompany().getId() 直接可用。

映射檔核心技巧:SQL 片段重用與別名映射

1. 定義可重用 SQL 片段

<sql id="userColumns">
    a.id, 
    a.company_id AS "company.id", 
    a.office_id AS "office.id",
    a.login_name, a.password, a.no, a.name, ...,
    c.name AS "company.name",
    c.parent_id AS "company.parent.id",
    ca.id AS "company.area.id",
    o.name AS "office.name",
    sc.xxlx AS "school.xxlx",
    sc.xxmc AS "school.xxmc"
</sql>

<sql id="userJoins">
    LEFT JOIN sys_office c ON c.id = a.company_id
    LEFT JOIN sys_area ca ON ca.id = c.area_id
    LEFT JOIN sys_office o ON o.id = a.office_id
    LEFT JOIN sys_area oa ON oa.id = o.area_id
    LEFT JOIN xj_school sc ON sc.id = a.school
</sql>

關鍵點:使用 AS "property.nestedProperty" 別名語法,MyBatis 會自動根據點號路徑建立巢狀物件並注入值,無需手寫 <resultMap>。

2. 查詢語句引用片段

<select id="getUserById" resultType="User">
    SELECT <include refid="userColumns"/>
    FROM sys_user a
    <include refid="userJoins"/>
    WHERE a.id = #{id}
</select>

<select id="getByLoginName" resultType="User" parameterType="User">
    SELECT <include refid="userColumns"/>
    FROM sys_user a
    <include refid="userJoins"/>
    WHERE a.login_name = #{loginName} AND a.del_flag = #{DEL_FLAG_NORMAL}
</select>

直接指定 resultType="User",MyBatis 依別名自動映射至巢狀物件,省去冗長 resultMap 定義。

3. 寫入操作的參數映射

<insert id="insert">
    INSERT INTO sys_user(..., company_id, office_id, ..., create_by, update_by, school)
    VALUES (#{id}, #{company.id}, #{office.id}, ..., #{createBy.id}, #{updateBy.id}, #{school.id})
</insert>

<update id="update">
    UPDATE sys_user SET 
        company_id = #{company.id}, 
        office_id = #{office.id}, 
        update_by = #{updateBy.id}, 
        school = #{school.id}
    WHERE id = #{id}
</update>

插入/更新時,OGNL 表達式 #{company.id} 會自動取巢狀物件屬性值,實現雙向無縫映射。

設計優勢總結

  • 零 resultMap 維護:依賴別名自動映射,減少 XML 體積 60% 以上
  • 多表關聯透明化:JOIN 邏輯集中在 userJoins 片段,業務邏輯不感知表結構
  • 巢狀物件完整支援:查詢、插入、更新全鏈路自動處理關聯物件
  • 擴充性強:新增關聯表只需擴充 SQL 片段,不動 Java 代碼

適用場景與注意事項

此模式最適合「主表 + 多維度關聯表」的典型業務查詢(如用戶/訂單/商品詳情)。注意:

  1. 查詢欄位別名必須精確對應實體類屬性路徑(區分大小寫)
  2. 大量 LEFT JOIN 可能影響查詢效能,必要時考慮分步查詢或快取
  3. 實體類引用型別屬性需初始化(如 private Office company = new Office();)避免 NPE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved