在 MyBatis 中,處理遞歸查詢結果的方法有兩種:一種是使用嵌套結果映射(Nested Result Mapping),另一種是使用 resultMap 的 association 和 collection 標簽。
嵌套結果映射是指在一個查詢中,將多個表的數據組合成一個對象。這種方法適用于查詢結果較少且不需要遞歸查詢的情況。例如,查詢一個部門及其所有員工的信息,可以使用嵌套結果映射。
首先,創建一個 Department 類和一個 Employee 類,然后在 MyBatis 的映射文件中定義查詢語句和結果映射:
<!-- 查詢部門及其員工信息 --><select id="getDepartmentWithEmployees" resultMap="departmentResultMap">
SELECT d.*, e.*
FROM department d
LEFT JOIN employee e ON d.id = e.department_id
WHERE d.id = #{departmentId}
</select>
<!-- 定義部門和員工的結果映射 --><resultMap id="departmentResultMap" type="Department">
<id property="id" column="d.id"/>
<result property="name" column="d.name"/>
<collection property="employees" ofType="Employee">
<id property="id" column="e.id"/>
<result property="name" column="e.name"/>
<result property="departmentId" column="e.department_id"/>
</collection>
</resultMap>
當查詢結果需要遞歸查詢時,可以使用 resultMap 的 association 和 collection 標簽。這些標簽可以幫助我們將查詢結果映射到對象的屬性上。例如,查詢一個菜單及其所有子菜單的信息,可以使用 association 和 collection 標簽。
首先,創建一個 Menu 類,然后在 MyBatis 的映射文件中定義查詢語句和結果映射:
<!-- 查詢菜單及其子菜單信息 --><select id="getMenuWithChildren" resultMap="menuResultMap">
SELECT m.*
FROM menu m
WHERE m.parent_id = #{parentId}
</select>
<!-- 定義菜單的結果映射 --><resultMap id="menuResultMap" type="Menu">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="parentId" column="parent_id"/>
<collection property="children" ofType="Menu" select="getMenuWithChildren" column="id"/>
</resultMap>
在這個例子中,我們使用了 collection 標簽來遞歸查詢子菜單。當 MyBatis 執行 getMenuWithChildren 查詢時,它會自動將查詢結果映射到 Menu 對象的 children 屬性上。這樣,我們就可以得到一個包含所有子菜單的菜單對象。