collection集合映射

创建结果实体类

我们需要创建一个 BlogPostBO,

public class BlogPostBO extends Blog {

    private List<Post> posts;

    public List<Post> getPosts() {
        return posts;
    }

    public void setPosts(List<Post> posts) {
        this.posts = posts;
    }
}

该类继承于 Blog 类, 并多了一个链表成员变量 posts, 我们后续获取到的发布的文章都在此链表中。

创建结果集

刚开始时, 是这样子创建的。

<resultMap id="BlogPostBO"  type="com.homejim.mybatis.entity.BlogPostBO" extends="BaseResultMap">
    <collection property="posts" columnPrefix="post_" ofType="com.homejim.mybatis.entity.Post">
        <id column="id" jdbcType="INTEGER" property="id" />
        <result column="blog_id" jdbcType="INTEGER" property="blogId" />
        <result column="draft" jdbcType="INTEGER" property="draft" />
        <result column="content" jdbcType="LONGVARCHAR" property="content" />
    </collection>
</resultMap>

此处注意一个问题, 在 collection 中, 我们用的是 ofType 来表示 List 中的 Pojo 的属性。而不是 type。

因为我们内部 Post 有对应的结果集, 可以引用另一个 Mapper 中的结果集, 就可以简化变成下面这样子:

<resultMap id="BlogPostBO"  type="com.homejim.mybatis.entity.BlogPostBO" extends="BaseResultMap">
    <collection property="posts" columnPrefix="post_" resultMap="com.homejim.mybatis.mapper.PostMapper.ResultMapWithBLOBs" />
</resultMap>

可以简单了好多。

创建对应的方法和XML

首先就是在对应的 Mapper 接口下创建方法:

    /**
     * 获取博客及其发布的文章内容 一对多
     * @return
     */
    List<BlogPostBO> selectBlogAndPostList();

同时在 XML 中创建对应的 SQL 语句:

<select id="selectBlogAndPostList"  resultMap="BlogPostBO">
    SELECT
    b.id,
    b.title,
    b.author_id,
    p.id as post_id,
    p.blog_id as post_blog_id,
    p.draft as post_draft,
    p.content as post_content
  FROM blog b left join post p on p.blog_id=b.id
  </select>

测试

   /**
    *  resultMap + collection 一对多映射
    */
   @Test
   public void testSelectBlogAndPostListByBlog() {
       SqlSession sqlSession = sqlSessionFactory.openSession();
       BlogMapper blogMapper = sqlSession.getMapper(BlogMapper.class);
       List<BlogPostBO> blogPostBOs = blogMapper.selectBlogAndPostList();

       sqlSession.close();

       for (int i = 0; i < blogPostBOs.size(); i++) {
           BlogPostBO blogPostBO = blogPostBOs.get(i);
           System.out.println(blogPostBO.getTitle());

           for (int j = 0; j < blogPostBO.getPosts().size(); j++) {
               System.out.println(blogPostBO.getPosts().get(j).getContent());
           }

           System.out.println("=============这是对象分割线===============");
       }
   }

更多例子:

<!-- 通用查询映射结果 -->
	<resultMap id="sanfeiPersonDTOResultMap"
		type="org.springblade.modules.sanfei.dto.SanfeiPersonDTO"
		extends="sanfeiPersonResultMap">
		<collection property="zpList" columnPrefix="zp_"
			resultMap="org.springblade.modules.sanfei.mapper.SanfeiPicMapper.sanfeiPicResultMap" />
		<collection property="hmList" columnPrefix="hm_"
			resultMap="org.springblade.modules.sanfei.mapper.SanfeiHmMapper.sanfeiHmResultMap" />
		<collection property="lxList" columnPrefix="lx_"
			resultMap="org.springblade.modules.sanfei.mapper.SanfeiPathMapper.sanfeiPathResultMap" />
	</resultMap>