集合的多结果集(ResultSet)

像关联元素那样,我们可以通过执行存储过程实现,它会执行两个查询并返回两个结果集,一个是博客的结果集,另一个是文章的结果集:

  1. SELECT * FROM BLOG WHERE ID = #{id}
  2. SELECT * FROM POST WHERE BLOG_ID = #{id}

在映射语句中,必须通过 resultSets 属性为每个结果集指定一个名字,多个名字使用逗号隔开。

  1. <select id="selectBlog" resultSets="blogs,posts" resultMap="blogResult">
  2. {call getBlogsAndPosts(#{id,jdbcType=INTEGER,mode=IN})}
  3. </select>

我们指定 “posts” 集合将会使用存储在 “posts” 结果集中的数据进行填充:

  1. <resultMap id="blogResult" type="Blog">
  2. <id property="id" column="id" />
  3. <result property="title" column="title"/>
  4. <collection property="posts" ofType="Post" resultSet="posts" column="id" foreignColumn="blog_id">
  5. <id property="id" column="id"/>
  6. <result property="subject" column="subject"/>
  7. <result property="body" column="body"/>
  8. </collection>
  9. </resultMap>

注意 对关联或集合的映射,并没有深度、广度或组合上的要求。但在映射时要留意性能问题。 在探索最佳实践的过程中,应用的单元测试和性能测试会是你的好帮手。 而 MyBatis 的好处在于,可以在不对你的代码引入重大变更(如果有)的情况下,允许你之后改变你的想法。

高级关联和集合映射是一个深度话题。文档的介绍只能到此为止。配合少许的实践,你会很快了解全部的用法。