mybatis -- 延迟加载源码分析

目录

  • 准备
  • 需求
  • 通过源码分析子查询
    • 测试代码

准备

现在有三个类, 博客, 作者, 评论 , 每个类中有不同的属性

  • 博客 : blog :
    • id
    • title(标题)
    • userId(作者id)
  • 作者 : user
    • id
    • name
    • age
    • sex
    • idCard
  • 评论 : comment
    • id
    • context(内容)
    • blogId

需求

现在想通过一个博客id, 查询到博客的一些信息, 包括博客的所有评论, 看一下返回结果集对象
mybatis -- 延迟加载源码分析_第1张图片
看一下CommentResp这个类中的属性
mybatis -- 延迟加载源码分析_第2张图片
CommentResp类中同样包括BlogResp对象, 此时如果使用两个相同的resultMap作为结果集映射(见下图sql), 就会出现循环依赖, 但是不用担心, mybatis通过一级缓存, 解决了循环依赖问题
mybatis -- 延迟加载源码分析_第3张图片

通过源码分析子查询

测试代码

mybatis -- 延迟加载源码分析_第4张图片
mybatis -- 延迟加载源码分析_第5张图片
进入156行
mybatis -- 延迟加载源码分析_第6张图片
189行是我们查询出来的结果集, 逗她进行遍历
194行是用来处理结果集的, 这正是我们要关注的,进入
mybatis -- 延迟加载源码分析_第7张图片
301行处理行数据, 进入此方法
mybatis -- 延迟加载源码分析_第8张图片
397行创建一个空的结果集对象rowValue,
399行, 将结果集对象转化为metaObject类型的对象, 通过这个对象给rowValue赋值, (如果不知道metaObject对象的作用, 请自行百度一下)
401-403行的作用就是判断是否开启自动映射, 如果开启自动映射则将全部能自动映射的属性赋值
404行进行嵌套查询操作, 进入方法
mybatis -- 延迟加载源码分析_第9张图片
480行为处理非自动映射与嵌套查询的属性的赋值, 进入
mybatis -- 延迟加载源码分析_第10张图片
504行 : 嵌套查询
509-511 : 非自动映射属性赋值
进入504行, 主要的方法
mybatis -- 延迟加载源码分析_第11张图片
790行判断查询是否存在一级缓存中, 如果存在进行延迟加载,
795-797行判断是否开启了懒加载, 如果开启了就进行懒加载的逻辑, 懒加载下一个章节再说
此时为主查询, 则进入799行, 这里面主要是进行子查询操作,

最后让我们看一下延迟加载的处理逻辑
mybatis -- 延迟加载源码分析_第12张图片
此时可以看到, list.commentRespList.blogResp值为null, 这个值需要延迟加载, 同时也解决了循环依赖问题, 这都是一级缓存的作用

161行判断是否是主查询, 为主查询的结果集赋值, 162-164就是进行延迟加载赋值
mybatis -- 延迟加载源码分析_第13张图片
就是获取一级缓存的值, 然后在赋值就可以了

你可能感兴趣的:(mybatis,mybatis)