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

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,将查询的结果通过反射赋值给关联对象。

在这里插入图片描述



http://www.kler.cn/a/232321.html

相关文章:

  • 【2025最新计算机毕业设计】基于SpringBoot+Vue电脑在线装机指南教程网站【源码+文档】
  • web与网络编程
  • 计算机网络HTTP——针对实习面试
  • leetcode hot100【LeetCode 236.二叉树的最近公共祖先】java实现
  • C++静态成员
  • Go开发指南- Goroutine
  • DBeaver连接mysql时报错com.mysql.cj.jdbc.Driver的解决方法【修改驱动下载的maven地址和重新下载驱动】
  • 从github上拉取项目到pycharm中
  • 【数据分享】1929-2023年全球站点的逐月平均能见度(Shp\Excel\免费获取)
  • C++ “万能血“ void*指针
  • 一篇文章理解时间复杂度和空间复杂度
  • wyh的迷宫
  • Linux基础入门
  • 相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装
  • Ubuntu搭建计算集群
  • Redis篇之分布式锁
  • STM32——LCD(1)认识
  • ResizeObserver的使用
  • 网络编程-Socket套接字
  • Netty源码系列 之 HashedWheelTimer源码
  • 《幻兽帕鲁》攻略:0基础入门及游戏基础操作 幻兽帕鲁基础设施 幻兽帕鲁基础攻击力 Mac苹果电脑玩幻兽帕鲁 幻兽帕鲁加班加点
  • Kubernetes基础(十五)-k8s网络通信
  • ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image
  • 如何使用宝塔面板搭建MySQL 5.5数据库并实现公网远程连接
  • C++ pair 的使用
  • Elasticsearch:通过 ingest pipeline 对大型文档进行分块