我是靠谱客的博主 霸气蜻蜓,最近开发中收集的这篇文章主要介绍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行的逻辑和第一次分析的逻辑相同

最后

以上就是霸气蜻蜓为你收集整理的mybatis -- 嵌套查询环境准备原理解析源码分析的全部内容,希望文章能够帮你解决mybatis -- 嵌套查询环境准备原理解析源码分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部