mybatis嵌套查询和嵌套集合
时间: 2025-05-29 20:17:36 浏览: 23
### MyBatis 中嵌套查询与嵌套集合的用法及区别
#### 一、嵌套查询
嵌套查询是指在一个 `resultMap` 的定义中,通过 `<association>` 或者 `<collection>` 标签中的 `select` 属性来指定另一个查询语句。这种方式会触发额外的一次数据库查询操作。
- **实现方式**
在 `resultMap` 定义中使用 `<association select="..." />` 或 `<collection select="...">...</collection>` 来执行子查询[^1]。例如:
```xml
<resultMap type="com.example.MyBatis.dao.model.Person" id="personResultMap">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!-- 关联查询 -->
<association property="address" column="address_id" select="selectAddressById"/>
</resultMap>
<select id="selectPersonById" resultMap="personResultMap">
SELECT * FROM person WHERE id = #{id}
</select>
<select id="selectAddressById" resultType="com.example.MyBatis.dao.model.Address">
SELECT * FROM address WHERE id = #{id}
</select>
```
- **特点**
- 数据库会被多次访问,因为每次都需要单独发起子查询。
- 更适合用于复杂逻辑处理或者当父表和子表之间存在一对多关系时,且子表的数据量较小时[^4]。
---
#### 二、嵌套集合
嵌套集合则是指在同一个 SQL 查询中完成所有的数据获取工作,并利用 `JOIN` 将多个表的数据组合在一起。之后,在 `resultMap` 中通过 `<collection>` 和 `<association>` 映射这些联合查询的结果。
- **实现方式**
使用单条 SQL 进行联合查询并映射到复杂的对象结构中[^3]。例如:
```xml
<resultMap type="com.example.MyBatis.dao.model.Course" id="courseWithSectionsAndLessons">
<id property="uuid" column="course_uuid"/>
<result property="title" column="course_title"/>
<!-- 节点集合 -->
<collection property="sections" ofType="com.example.MyBatis.dao.model.Section">
<id property="uuid" column="section_uuid"/>
<result property="name" column="section_name"/>
<!-- 子节点集合 -->
<collection property="lessons" ofType="com.example.MyBatis.dao.model.Lesson">
<id property="uuid" column="lesson_uuid"/>
<result property="title" column="lesson_title"/>
</collection>
</collection>
</resultMap>
<select id="getCourseDetail" resultMap="courseWithSectionsAndLessons">
SELECT *
FROM course c
LEFT JOIN section s ON c.uuid = s.course_uuid
LEFT JOIN lesson l ON s.uuid = l.section_uuid
WHERE c.uuid = #{courseId}
</select>
```
- **特点**
- 只需一次数据库查询即可完成所有数据加载。
- 对于大数据量的情况可能更高效,但也可能导致 SQL 复杂度增加以及性能瓶颈(如笛卡尔积等问题)[^3]。
---
#### 三、两者的对比分析
| 特性 | 嵌套查询 | 嵌套集合 |
|-------------------|----------------------------------|----------------------------------|
| **数据库交互次数** | 多次 | 单次 |
| **适用场景** | 父子表间一对一或多对一时,子表数据较少 | 当需要一次性获取大量父子关联数据时 |
| **SQL 编写难度** | 较低 | 较高(涉及多表连接) |
| **性能影响因素** | 如果子查询过多可能会降低效率 | 若返回记录数过大,则内存占用较高 |
---
#### 四、总结
如果希望减少 SQL 的复杂性和提高可读性,可以选择嵌套查询;而如果追求更高的查询效率并且能够接受一定的开发成本提升,则可以考虑采用嵌套集合的方式[^2]。
---
阅读全文
相关推荐



















