通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

Mybatis中,resultMap collection的应用场景是什么样子的

collection标签是集合标签,处理“一对多”类型的关系。它与association关联标签几乎是一样的,它们相似的程度之高,常常让人产生误解。关联association标签处理“一对一”类型的关系。

一、Mybatis中,resultMap collection的应用场景

collection标签是集合标签,处理“一对多”类型的关系。它与association关联标签几乎是一样的,它们相似的程度之高,常常让人产生误解。关联association标签处理“一对一”类型的关系。一个博客有一个博主,则使用association标签,但一个博客有很多文章(Post),则使用collection标签。

需要注意的是,在MyBatis框架,存在collection属性和collection标签两种情况,不要搞混了。

一个博客(Blog)只有一个作者(Author),但一个博客有很多文章(Post)。 在博客类中,这可以用下面的写法来表示:

  1. private List<Post> posts;
  2.  

映射结果集合到一个 List 中,可以使用集合元素<collection>。和关联映射一样,我们可以使用嵌套 Select 查询,或基于连接的嵌套结果映射集合。

1、集合的嵌套 Select 查询

首先,让我们看看如何使用嵌套 Select 查询来为博客加载文章。

  1. <resultMap id=”blogResult” type=”Blog”>
  2.  
  3.   <collection property=”posts” javaType=”ArrayList” column=”id” ofType=”Post” select=”selectPostsForBlog”/>
  4.  
  5. </resultMap>
  6.  
  7.  
  8.  
  9. <select id=”selectBlog” resultMap=”blogResult”>
  10.  
  11.   SELECT * FROM BLOG WHERE ID = #{id}
  12.  
  13. </select>
  14.  
  15.  
  16.  
  17. <select id=”selectPostsForBlog” resultType=”Post”>
  18.  
  19.   SELECT * FROM POST WHERE BLOG_ID = #{id}
  20.  
  21. </select>
  22.  

此时出现一个新的 “ofType” 属性。这个属性非常重要,它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。所以你可以按照下面这样来阅读映射:

  1. <collection property=”posts” javaType=”ArrayList” column=”id” ofType=”Post” select=”selectPostsForBlog”/>
  2.  

读作: posts 是一个存储 Post 的 ArrayList 集合

在一般情况下,MyBatis 可以推断 javaType 属性,因此并不需要填写。所以很多时候你可以简略成:

  1. <collection property=”posts” column=”id” ofType=”Post” select=”selectPostsForBlog”/>
  2.  

2、集合的嵌套结果映射

首先,让我们看看对应的 SQL 语句:

  1. <select id=”selectBlog” resultMap=”blogResult”>
  2.  
  3.   select
  4.  
  5.   B.id as blog_id,
  6.  
  7.   B.title as blog_title,
  8.  
  9.   B.author_id as blog_author_id,
  10.  
  11.   P.id as post_id,
  12.  
  13.   P.subject as post_subject,
  14.  
  15.   P.body as post_body,
  16.  
  17.   from Blog B
  18.  
  19.   left outer join Post P on B.id = P.blog_id
  20.  
  21.   where B.id = #{id}
  22.  
  23. </select>
  24.  

我们再次连接了博客表和文章表,并且为每一列都赋予了一个有意义的别名,以便映射保持简单。要映射博客里面的文章集合,就这么简单:

  1. <resultMap id=”blogResult” type=”Blog”>
  2.  
  3.   <id property=”id” column=”blog_id” />
  4.  
  5.   <result property=”title” column=”blog_title”/>
  6.  
  7.   <collection property=”posts” ofType=”Post”>
  8.  
  9.     <id property=”id” column=”post_id”/>
  10.  
  11.     <result property=”subject” column=”post_subject”/>
  12.  
  13.     <result property=”body” column=”post_body”/>
  14.  
  15.   </collection>
  16.  
  17. </resultMap>
  18.  

如果你喜欢更详略的、可重用的结果映射,你可以使用下面的等价形式:

  1. <resultMap id=”blogResult” type=”Blog”>
  2.  
  3.   <id property=”id” column=”blog_id” />
  4.  
  5.   <result property=”title” column=”blog_title”/>
  6.  
  7.   <collection property=”posts” ofType=”Post” resultMap=”blogPostResult” columnPrefix=”post_”/>
  8.  
  9. </resultMap>
  10.  
  11.  
  12.  
  13. <resultMap id=”blogPostResult” type=”Post”>
  14.  
  15.   <id property=”id” column=”id”/>
  16.  
  17.   <result property=”subject” column=”subject”/>

延伸阅读:

二、resultMap 知识点

resultMap 元素用来描述如何将结果集映射到 Java 对象,使用 resultMap 对列表展示所需的必要字段来进行自动映射,特别是当数据库的字段名和实体类 POJO 中的属性名不一致的情况下,比如角色名称,字段名/列名 column 是 roleName,而 User 对象的属性名则为 userRoleName ,此时就需要做映射。

resultMap 元素的属性值和子节点

id 属性:少数标识,此 id 值用于 select 元素 resultMap 属性的引用。

type 属性:表示该 resultMap 的映射结果类型。

result 子节点:用于标识一些简单属性,其中 column 属性表示从数据库中查询的字段名或别名, property 属性则表示查询出来的字段对应的值赋给实体对象的哪个属性。

说明:MyBatis 中在对查询进行 select 映射的时候,返回类型可以用 resultType 也可以用 resultMap ,resultType和 resultMap 有一定关联和区别,应用场景也不同。

相关文章