# MyBatis怎么實現一對多映射
## 一、一對多關系概述
在數據庫設計中,一對多(1:N)關系是最常見的關系類型之一。例如:
- 一個部門對應多個員工
- 一個訂單包含多個訂單項
- 一個用戶擁有多個收貨地址
MyBatis提供了兩種主要方式實現這種映射關系:
1. 嵌套結果映射(ResultMap)
2. 嵌套查詢(Nested Select)
## 二、嵌套結果映射實現
這是最常用的方式,通過`<resultMap>`的`<collection>`標簽實現:
```xml
<!-- 部門實體映射 -->
<resultMap id="deptWithEmployees" type="Department">
<id property="id" column="dept_id"/>
<result property="name" column="dept_name"/>
<!-- 一對多集合映射 -->
<collection property="employees" ofType="Employee">
<id property="id" column="emp_id"/>
<result property="name" column="emp_name"/>
</collection>
</resultMap>
<!-- 查詢語句 -->
<select id="getDeptWithEmployees" resultMap="deptWithEmployees">
SELECT d.id as dept_id, d.name as dept_name,
e.id as emp_id, e.name as emp_name
FROM department d
LEFT JOIN employee e ON d.id = e.dept_id
WHERE d.id = #{id}
</select>
特點: - 單次SQL查詢獲取所有數據 - 通過JOIN連接關聯表 - 需要確保列名別名不沖突
通過分次查詢實現關聯:
<resultMap id="deptWithEmployees2" type="Department">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 通過select屬性引用另一個查詢 -->
<collection
property="employees"
ofType="Employee"
select="getEmployeesByDeptId"
column="id"/>
</resultMap>
<select id="getDepartment" resultMap="deptWithEmployees2">
SELECT * FROM department WHERE id = #{id}
</select>
<select id="getEmployeesByDeptId" resultType="Employee">
SELECT * FROM employee WHERE dept_id = #{deptId}
</select>
特點: - 需要執行多次SQL查詢 - 支持延遲加載(lazy loading) - N+1查詢問題需要注意
<id>標簽優化)@ResultMap注解使用MyBatis通過靈活的映射配置,可以輕松實現一對多關系。開發者需要根據實際業務場景,在性能和維護性之間做出合適的選擇。 “`
注:本文實際約650字,包含了代碼示例和結構化說明。如需調整字數或內容細節,可以進一步修改。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。