当前位置: 首页 > news >正文

Mybatis中的sql-xml延迟加载机制

Mybatis中的sql-xml延迟加载机制

hi,我是阿昌,今天记录一下关于Mybatis中的sql-xml延迟加载机制

一、前言

首先mybatis技术本身就不多介绍,说延迟加载机制之前,那要先知道2个概念:

  • 主查询对象
  • 关联对象

假设咱们现在有2张表,一张是item表,一张是sku表,对应关系是1对多的关系
在这里插入图片描述
如果在这个条件下,我们要查询item表的信息且对应item下的sku的数据:

public class ItemDO {private Long id;private String numIid;private List<String> skuIdList;
}
  • 主查询对象:itemDO
  • 关联对象:itemDO对象中的skuIdList

二、正文

1、延迟加载

那什么是延迟加载,那就是懒加载、惰性加载;
在mybatis中延迟加载一般用用1对1或1对多的联合查询

如果开启了延迟加载,mybatis则只会对主对象进行查询,而只有在主查询对象的关联对象的属性被调用时,mybatis才会执行关联对象的查询;


在上面的item&sku场景下,我们如果只访问item对象时并不会马上返回其关联对象skuList的值,只有在该item的skuList属性被访问时,才会去数据库中查询sku列表的信息

2、如何开启

在mybatis中可以通过lazyLoadingEnabled的属性值来开启延迟加载设置;
aggressiveLazyLoading的属性值为false来全局开启延迟加载。
在这里插入图片描述
那也可以在Mapper的映射文件中,在collectionassociaition标签的fetchType属性,来局部的设置延迟加载策略。
其中Mapper文件局部设置的优先级会高于全局的延迟加载策略。

在这里插入图片描述

3、代码验证

demo代码如下:

		System.out.println("0");List<ItemDO> itemDOList = skuMapper.findAll();System.out.println("1");ItemDO itemDO = itemDOList.get(0);System.out.println(itemDO);System.out.println("2");

在这里插入图片描述

3、原理

Mybatis中的延迟加载,是在获取到主对象的结果集之后处理的,他的核心源码在org.apache.ibatis.executor.resultset.DefaultResultSetHandler中的org.apache.ibatis.executor.resultset.DefaultResultSetHandler#createResultObject(org.apache.ibatis.executor.resultset.ResultSetWrapper, org.apache.ibatis.mapping.ResultMap, org.apache.ibatis.executor.loader.ResultLoaderMap, java.lang.String)方法,
在这里插入图片描述
它的意图很简单,就是为我们的主查询对象生产一个代理对象类并返回。点进去看会发现延迟加载有2个动态代理生成方式:CglibJavassist
在这里插入图片描述
默认使用的是Javassist

在这里插入图片描述


动态代理类的实现方法是org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory.EnhancedResultObjectProxyImpl#invoke,该方法的主要逻辑是判断是否开启延迟加载,如果开启了,就会执行事先储存好的关联对象的查询SQL,将查询的结果通过反射赋值给关联对象。

在这里插入图片描述


相关文章:

  • RocketMQ(二):领域模型(生产者、消费者)
  • 【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源
  • 【每日一题】LeetCode——链表的中间结点
  • CTFshow web(php命令执行 45-49)
  • 《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)
  • C语言的循环结构
  • Unity笔记:相机移动
  • VSCode 文件夹增加右键打开
  • Git详细讲解
  • 逆向工程:揭开科技神秘面纱的艺术
  • 华为配置访客接入WLAN网络示例(MAC优先的Portal认证)
  • 《低功耗方法学》翻译——附录B:UPF命令语法
  • Cisco firepower2100系列使用FDM管理FTD
  • 自然语言学习nlp 六
  • clickhouse计算前后两点间经纬度距离
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Android Volley源码解析
  • EventListener原理
  • leetcode386. Lexicographical Numbers
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • ng6--错误信息小结(持续更新)
  • PHP CLI应用的调试原理
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 机器学习 vs. 深度学习
  • 精彩代码 vue.js
  • 利用DataURL技术在网页上显示图片
  • 盘点那些不知名却常用的 Git 操作
  • 前端技术周刊 2019-02-11 Serverless
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何设计一个微型分布式架构?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 数据可视化之 Sankey 桑基图的实现
  • 异步
  • ​什么是bug?bug的源头在哪里?
  • ​用户画像从0到100的构建思路
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #100天计划# 2013年9月29日
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (done) 两个矩阵 “相似” 是什么意思?
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (超详细)语音信号处理之特征提取
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)linux下的时间函数使用
  • (转)Sql Server 保留几位小数的两种做法
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .CSS-hover 的解释
  • .Net Core和.Net Standard直观理解