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>