📚 分类
spring
🕵🏽‍♀️ 问题描述
mybatis是否支持延迟加载?
👨‍🏫 问题讲解
❒ Mybatis支持延迟记载,但默认没有开启

✔ 单条查询配置 fetchType="lazy"

✔ 全局配置
mybatis-config.xml
<settings>
    <!--开启二级缓存-->
    <setting name="cacheEnabled"value="true"/>
    <!-- 开启驼峰命名自动映射 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 开启延时加载 -->
    <setting name="lazyLoadingEnabled" value ="true" />
</settings>

❒ 什么叫做延迟加载?

✔ 查询用户的时候,把用户所属的订单数据也查询出来,这个是立即加载
✔ 查询用户的时候,暂时不查询订单数据,当需要订单的时候,再查询订单,这个就是延迟加载

❒ 延迟加载的原理

1.使用CGLIB创建目标对象的代理对象
2.当调用目标方法user.getOrderlist()时,进入拦截器invoke方法,发现user.getOrderlist()是null值,执行sql查询order列表
3.把order查询上来,然后调用user.setOrderlist(List<Order>orderList),接着完成user.qetOrderlist()方法的调用
🏳️‍🌈 问题总结
❒ Mybatis是否支持延迟加载?

✔ 延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
✔ Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载
✔ 在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true/false,默认是关闭的

❒ 延迟加载的底层原理知道吗?

✔ 使用CGLIB创建目标对象的代理对象
✔ 当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询
✔ 获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了
📖 问题信息
📈 浏览次数:6 | 📅 更新时间:2025-12-02 04:01:15
📦 创建信息
🏷️ ID:53 | 📅 创建时间:2024-11-07 09:15:16