mybatis -- 嵌套查询

环境准备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原理解析

在这里插入图片描述

  1. 首先创建主查询的RowKey, 根据主查询的数据库值
  2. 读取暂存区, 判断根据key是否可以获取到值, 如果获取到就不需要创建对象,否则创建对象
  3. 填充符合属性, 填充查询评论的数据库值
  4. 将RowKey填充到数据库中, 为了处理resultSet为多个值的情况

从上面的流程可以知道 :
5. 嵌套查询会根据主查询数据进行分组, 下图中根据id进行分组, 填充评论数据, 如果不配置id会默认根据全部的result进行分组, 如果去掉图中的id, 则会抛出异常

  • 存在多个result时, 根据多个result值进行分组
  • 存在一个result时, 根据这个result值进行分组
  • 如果存在id和result, 则只会根据id进行分组
  1. collection中为嵌套查询数据, 默认也会生成一个resultMap
    在这里插入图片描述

源码分析

在这里插入图片描述
走到此方法, 数据库结果集已经查询完成, resultSet中包含三条数据
在这里插入图片描述
899行 : 创建一个缓存key, 存入到nestedResultObjects中, nestedResultObjects的作用就是判断主表的数据是否被查询过
因为是第一次查询, 900行肯定为null, 902行为false,
进入909行
在这里插入图片描述
417行 : 为null, 进入else逻辑
425行 : 创建一个空对象
429-431 : 为自动映射属性赋值, 看"环境准备中的sql", 只有title属性为自动映射, 为title赋值属性
在这里插入图片描述
432行 : 进行结果集映射, 为id值赋值
在这里插入图片描述
434行 : 处理嵌套查询, 进入
在这里插入图片描述
根据resultMap查询, 生成两个查询条件id和commentDOS, id为普通映射, commentDOS为嵌套映射,
我们进入第二次for循环
在这里插入图片描述
946行 : 生成一个key, 根据查询到的评论信息
947行 : 之前生成的key与946行生成的key, 合并成一个联合key
948行 : 为null
950行 : 为返回值赋值一个空集合
在这里插入图片描述
952行 : 递归调用getRowValue()方法, 将resultSet中评论部分, 赋值到rowValue中,== 同时将联合key放入到nestedResultObjects中==
954行 : 为metaObject对象赋值,

到此为止, resultSet中的第一行数据数据完毕, 让我们看一下第二行数据的处理逻辑
在这里插入图片描述
900行 : 获取的值不为null,
在这里插入图片描述
接下来就是进行第二条评论的填充
在这里插入图片描述
进入418行的if逻辑
421行的逻辑和第一次分析的逻辑相同

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值