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

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

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

一、前言

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

  • 主查询对象
  • 关联对象

假设咱们现在有2张表,一张是item表,一张是sku表,对应关系是1对多的关系

如果在这个条件下,我们要查询item表的信息且对应item下的sku的数据:

java 复制代码
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代码如下:

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


相关推荐
Yan-英杰3 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
百代繁华一朝都-绮罗生5 小时前
检查是否存在占用内存过大的SQL
数据库·sql
chushiyunen10 小时前
dom操作笔记、xml和document等
xml·java·笔记
whisperrr.10 小时前
【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
xml·java·spring
橙序研工坊10 小时前
MySQL的进阶语法7(索引-B+Tree 、Hash、聚集索引 、二级索引(回表查询)、索引的使用及设计原则
数据库·sql·mysql
KATA~11 小时前
解决MyBatis-Plus枚举映射错误:No enum constant问题
java·数据库·mybatis
oh,huoyuyan14 小时前
火语言RPA--Sqlite-执行SQL
sql·sqlite·rpa
伊成15 小时前
Springboot整合Mybatis+Maven+Thymeleaf学生成绩管理系统
java·maven·mybatis·springboot·学生成绩管理系统
努力搬砖的咸鱼15 小时前
Qt中的数据解析--XML与JSON处理全攻略
xml·开发语言·qt·json
inxunoffice15 小时前
批量删除 txt/html/json/xml/csv 等文本文件中的重复行
xml