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的映射文件中,在collection或associaition标签的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个动态代理生成方式:Cglib 和 Javassist

默认使用的是Javassist


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


相关推荐
乌暮42 分钟前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
AllData公司负责人14 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
Decay__19 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
阿达和自己1 天前
springboot学习-springboot引入MyBatis-Plus
spring boot·学习·mybatis
星恒随风2 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
2603_969694852 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
数据技术说2 天前
在 KES AI 数据库上搭一条 NL2SQL 链路:语义、召回、权限各放哪
人工智能·sql·代码规范
wang_shu_mo_ran2 天前
MyBatis 从入门到进阶(一)
java·spring·mybatis
瑞雪兆丰年兮2 天前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
codeejun2 天前
每日一Go·MySQL-14、慢 SQL 产生原因全解
sql·mysql·golang