MyBatis 实现一对多关联查询有几种方式,主要有两种常用的方式:嵌套查询和嵌套结果。
1. 嵌套查询(Nested Queries)
这种方式是通过在外层查询中调用内层查询来实现一对多关联查询。
步骤:
- 定义两个 SQL 查询语句: 一个查询主对象,另一个查询关联对象。
-
使用
<collection>
元素进行关联映射: 在主查询的 ResultMap 中使用<collection>
元素来映射关联对象,并指定关联查询语句。
示例:
<!-- 主对象查询 -->
<select id="getBlogById" resultMap="blogResult">
SELECT * FROM blogs WHERE blog_id = #{blogId}
</select>
<!-- 关联对象查询 -->
<select id="getPostsByBlogId" resultMap="postResult">
SELECT * FROM posts WHERE blog_id = #{blogId}
</select>
<!-- 主对象 ResultMap -->
<resultMap id="blogResult" type="Blog">
<id property="id" column="blog_id"/>
<result property="title" column="blog_title"/>
<!-- 嵌套查询关联对象 -->
<collection property="posts" ofType="Post" select="getPostsByBlogId"/>
</resultMap>
2. 嵌套结果(Nested Results)
这种方式是在单个查询中使用嵌套的 <resultMap>
来直接获取关联对象。
步骤:
- 定义单个 SQL 查询语句: 在查询中包含关联对象的字段,并使用嵌套的
<resultMap>
来映射关联对象。
示例:
<!-- 单个查询语句,同时获取主对象和关联对象 -->
<select id="getBlogWithPosts" resultMap="blogWithPostsResult">
SELECT b.blog_id, b.blog_title, p.post_id, p.post_content
FROM blogs b LEFT JOIN posts p ON b.blog_id = p.blog_id
WHERE b.blog_id = #{blogId}
</select>
<!-- 嵌套的 ResultMap -->
<resultMap id="blogWithPostsResult" type="Blog">
<id property="id" column="blog_id"/>
<result property="title" column="blog_title"/>
<!-- 嵌套关联对象的 ResultMap -->
<association property="posts" javaType="java.util.List" resultMap="postResult"/>
</resultMap>
这两种方式均能实现一对多关联查询,可以根据实际情况选择更适合的方式来查询并映射一对多关联的对象。
Was this helpful?
0 / 0