最近做得项目用到了MyBatis处理一对多的映射关系,下面的两个方法中用到了集合的嵌套查询方法,下面仔细学习一下这两种方式

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:

  • select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活但会将执行多次嵌套的SQL语句。

  • resultMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

两种加载方式格式如下:

集合的嵌套查询(select)

<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" column="关联主键ID(用于嵌套查询SQL语句传入参数,多个用逗号分开)" select="另一个select映射SQL的ID"/><select parameterType="int" resultType="另一Java类名" id="另一个select映射SQL的ID">SQL语句
</select>
<resultMap id="blogResult" type="Blog">  <collection property="posts" javaType=”ArrayList” column="blog_id" ofType="Post" select="selectPostsForBlog"/>
</resultMap>  <select id="selectBlog" parameterType="int" resultMap="blogResult">  SELECT * FROM BLOG WHERE ID = #{id}
</select>  <select id="selectPostsForBlog" parameterType="int" resultType="Author">  SELECT * FROM POST WHERE BLOG_ID = #{id}
</select>

注意:column属性的值必须与相应的SQL查询语句中的列名相同。MyBatis会将第一条SQL语句查询出来的该列的值用于所聚集的SQL映射语句的入参。因第一条SQL语句查询出来的每个该列的值都将用于执行另一个SQL语句,所以聚集的SQL语句将被多次执行

虽然这个方法简单,但是对于大数据集或列表查询,就不尽如人意了。这个问题被称为“N+1 选择问题”(N+1 Selects Problem)。概括地说,N+1选择问题是这样产生的:

您执行单条SQL语句去获取一个列表的记录( “+1”)。

对列表中的每一条记录,再执行一个联合select 语句来加载每条记录更加详细的信息(“N”)。

这个问题会导致成千上万的SQL语句的执行,因此并非总是可取的。

上面的例子,MyBatis可以使用延迟加载这些查询,因此这些查询立马可节省开销。然而,如果您加载一个列表后立即迭代访问嵌套的数据,这将会调用所有的延迟加载,因此性能会变得非常糟糕。

鉴于此,这有另外一种方式。

集合的嵌套结果集(Nested Results for Collection)

<resultMap id="resultMap的ID"  type="Java类名"><collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" resultMap="另一resultMap的ID"/>
</resultMap><resultMap="另一resultMap的ID" type="另一Java类名"><id property="id" column="关联主键ID"/>....
</resultMap>
<select id="selectBlog" parameterType="int" resultMap="blogResult">  select  B.id as blog_id,  B.title as blog_title,  B.author_id as blog_author_id,  P.id as post_id,  P.subject as post_subject,  P.body as post_body,  from Blog B  left outer join Post P on B.id = P.blog_id  where B.id = #{id}
</select>

同样,我们把Blog和Post两张表连接在一起,并且也保证列标签名在映射的时候是唯一且无歧义的。现在将Blog和Post的集合映射在一起是多么简单:

<resultMap id="blogResult" type="Blog">  <id property="id" column="blog_id" />  <result property="title" column="blog_title"/>  <collection property="posts" ofType="Post">  <id property="id" column="post_id"/>  <result property="subject" column="post_subject"/>  <result property="body" column="post_body"/>  </collection>
</resultMap>

再次强调一下,id 元素是非常重要的。
如果希望结果映射有更好的可重用性,您可以使用下面的方式:

<resultMap id="blogResult" type="Blog">  <id property="id" column="blog_id" />  <result property="title" column="blog_title"/>  <collection property="posts" ofType="Post" resultMap="blogPostResult"/>
</resultMap>  <resultMap id="blogPostResult" type="Post">  <id property="id" column="post_id"/>  <result property="subject" column="post_subject"/>  <result property="body" column="post_body"/>
</resultMap>

注意:column属性的值必须与相应的SQL查询语句的列名一样。

mybatis resultMap之collection聚集两种实现方式相关推荐

  1. Mybatis一对多查询的两种姿势,你值得拥有(收藏就完事了)

    文章目录 数据库表准备 实例演示 方法一:联合查询ResultMap映射 方法二:子查询映射 总结 前言 最近碰到了Mybatis一对多查询的场景,在这里总结对比下常见的两种实现方式. 本文以常见的订 ...

  2. mybatis一对多关联查询两种方式

    mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...

  3. mybatis 一对多 两种查询方式

    注意事项:  如果是多表 例如有A表,B表  A是多端,B是一端 那么就要在B端声明A端的集合 必须 上代码: 我使用的是java语言,先看实体类 这是单表的一对多 多表跟单表逻辑是一致 public ...

  4. mybatis 级联查询兑现_MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)...

    A:首先先看下一个简单的面试题 斐波那契数列 计算数组{1,1,2,3,5,8.......} 第30位值 规律:1 1 从第三项开始,每一项都是前两项之和 有两种实现方式 第一种方式: public ...

  5. Mybatis打印调试sql的两种方式

    问题描述 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql ...

  6. MongoDB——MongoDB分片集群(Sharded Cluster)两种搭建方式

    MongoDB分片集群(Sharded Cluster)两种搭建方式 MongoDB分片的概念 分片集群包含的组件 分片集群架构目标 MongoDB分片集群搭建 第一套副本集 第二套副本集 配置节点副 ...

  7. C++中的两种绑定方式(静态绑定、动态绑定)

    两种绑定方式 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类. 动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类. ...

  8. (C++)string 的两种输入方式和输出方式

    注:头文件如下 #include<string> #include<cstdio> #include<iostream>using namespace std; 注 ...

  9. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...

最新文章

  1. PHP进行生成并且导出CSV文件
  2. Linux基础命令---apachectl
  3. Java—这把线程池ThreadPoolExecutor操作,你学会了吗?
  4. AndroidManifest.xml中的android:name是否带.的区别
  5. AcWing 1054. 股票买卖
  6. asp.net生成随机数或字母验证码代码
  7. CE认证---EMC最新标准-EN55032
  8. vue-router路由文档详解
  9. 看看!挺动人的故事!!!
  10. 开展软件测试的目标和目的究竟是什么?
  11. Android 代码设置来电铃声
  12. 单节点 Elasticsearch 健康状态为 yellow 问题的解决
  13. 基于EEG-EMG混合控制方法的研究—生物机器人应用:现状、挑战与未来方向(三)
  14. 中国联通MEC边缘云架构与部署实践
  15. Lidar based off-road negative obstacle detection and analysis(论文翻译)
  16. 微信小程序+java后台实现openid获取
  17. AI2021下载Illustrator2021最新下载AI最新下载安装1分钟看完就会
  18. 360系统急救箱扫服务器,今晚使用360系统急救箱扫描系统发现问题,之后windows 更新不能启动了...
  19. 基于百度API的开源自动翻译.srt文件软件的实现的几个技术细节总结附源代码
  20. Android APN的显示流程源代码分析

热门文章

  1. 轻松绘制用户体验旅程图
  2. csv批量转换为excel
  3. 机器学习算法工程师面试知识点汇总
  4. 当贝显示服务器生病,【当贝市场】DNS服务器失效,解决江苏移动故障
  5. centos7桌面能看到计算机,【14-10-29】 【总结】教你怎么将centos7打造成桌面系统。。。...
  6. 倍福TwinCAT无法添加ADS路由的排查方法
  7. LED的电磁干扰问题探讨
  8. 张云皓计算机,2014年华北五、自治区和港澳台大学生计算机应用大.PDF
  9. 新媒体运营如何寻找热点新闻,有哪些有效手段?
  10. 利用计算机技术执行去自动化,分析办公自动化中的计算机技术应用