八、(了解即可)MyBatis懒加载(或者叫延迟加载)

news2024/11/21 13:27:28

在这里插入图片描述

文章目录

  • 八、懒加载(了解即可)
    • 8.1 为啥需要懒加载?
    • 8.2 懒加载是什么?
    • 8.3 开启方式
    • 8.4 既然fetchType可以控制懒加载那么我仅仅配置fetchType不配置全局的可以吗?
    • 8.5 aggressiveLazyLoading是做什么么的?
    • 8.6 注意点
    • 8.7 案例验证懒加载
      • 准备工作
      • 场景1:验证全局懒加载
      • 场景2:验证局部懒加载
  • 本人其他相关文章链接

八、懒加载(了解即可)

所谓的懒加载,延迟加载是同一个东西。指的就是需要才会加载,不需要就不会加载。

8.1 为啥需要懒加载?

答案:懒加载针对级联使用的,懒加载的目的是减少内存的浪费和减轻系统负担。

8.2 懒加载是什么?

答案:可以理解为按需加载,当调用到关联的数据时才与数据库交互否则不交互。

再具体点来说
比如user表和role表有关联关系,有这样一条语句:查询uesr的同时将user的某一列数据作为参数一并查询role表符合条件的数据,mybatis里叫做级联。只要执行这条语句,就会将这两张表符合需求的信息一起加载出来。而懒加载只会加载uesr表的数据出来不加载role表的数据。

8.3 开启方式

  • 方式1:全局设置,在mybatis-config.xml中进行开启
<settings>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
    </settings>
  • 方式2:局部设置,<association>和<collection>有个fetchType属性可以覆盖全局的懒加载状态:eager表示这个级联不使用懒加载要立即加载,lazy表示使用懒加载。

8.4 既然fetchType可以控制懒加载那么我仅仅配置fetchType不配置全局的可以吗?

答案:是可以的,

8.5 aggressiveLazyLoading是做什么么的?

它是控制具有懒加载特性的对象的属性的加载情况的。
true表示如果对具有懒加载特性的对象的任意调用会导致这个对象的完整加载,false表示每种属性按照需要加载。

8.6 注意点

  • 注意点1:只有分步查询才能让懒加载有效,也就是只能使用单条查询,而不能使用连表查询语句。
  • 注意点2:现实中用这个的场景我个人感觉也不太多,因为当多表查询,比如5个表查询的时候,写<resultMap>标签嵌套层次太多,太复杂不易理解,且不易使用。
  • 注意点3:懒加载分全局设置和局部设置。
  • 注意点4:如果是全局设置开启,要注意标签的放置位置,因为在mybatis-config.xml中标签是有顺序的。

8.7 案例验证懒加载

我有个用户表,有个地址表,其中地址表可以根据用户id进行关联查询,具体测试如下

准备工作

  • User
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
    //id
    private Integer id;
    //用户名称
    private String username;
    //用户密码
    private String password;
    //用户手机号码
    private String mobile;
    //性别
    private Integer gender;
    //最近一次登录IP地址
    private String lastLoginIp;

    private Address address;
  • Address
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Address implements Serializable {
    //id
    private Integer id;
    //用户名称
    private String name;
    //用户ID
    private Integer userId;

    private List<User> userList = new ArrayList<>();
}
  • mybatis-config.xml
<settings>
        <!--开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
</settings>
  • SelectMapper
List<User> getAllUser();
  • SelectMapper.xml
<resultMap id="userResultMapLazy" type="User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
        <result property="mobile" column="mobile"></result>
        <result property="gender" column="gender"></result>
        <result property="lastLoginIp" column="last_login_ip"></result>
        <collection property="address" column="id" select="com.mybatis.mapper.AddressMapper.getAddressByUserId"></collection>
    </resultMap>
    <!--List<User> getAllUser();-->
    <select id="getAllUser" resultType="User" resultMap="userResultMapLazy">
        select * from litemall_user
    </select>
  • AddressMapper
Address getAddressByUserId(@Param("userId") Integer userId);
  • AddressMapper.xml
<select id="getAddressByUserId" resultType="Address">
        select * from litemall_address where user_id = #{userId}
</select>

场景1:验证全局懒加载

当开启全局懒加载时,只调用item.getUsername()属性时,可以看到只调用user表sql,没有调用address表sql

@Test
    public void lazyLoading(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
        SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
        List<User> userList = selectMapper.getAllUser();
        userList.forEach(item -> {
            System.out.println(item.getUsername());
//            System.out.println(item.getAddress());
        });
    }

日志打印:

在这里插入图片描述

当调用item.getAddress()地址属性时

@Test
    public void lazyLoading(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
        SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
        List<User> userList = selectMapper.getAllUser();
        userList.forEach(item -> {
            System.out.println(item.getUsername());
            System.out.println(item.getAddress());
        });
    }

日志打印:

在这里插入图片描述

场景2:验证局部懒加载

其他不变,只设置<collection>属性为fetchType=“eager”,其中eager代表立即加载

<resultMap id="userResultMapLazy" type="User">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="password" column="password"></result>
        <result property="mobile" column="mobile"></result>
        <result property="gender" column="gender"></result>
        <result property="lastLoginIp" column="last_login_ip"></result>
        <collection property="address" column="id" select="com.mybatis.mapper.AddressMapper.getAddressByUserId" fetchType="eager"></collection>
    </resultMap>
@Test
    public void lazyLoading(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        AddressMapper addressMapper = sqlSession.getMapper(AddressMapper.class);
        SelectMapper selectMapper = sqlSession.getMapper(SelectMapper.class);
        List<User> userList = selectMapper.getAllUser();
        userList.forEach(item -> {
            System.out.println(item.getUsername());
        });
    }

日志打印:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQtkZzkO-1683265362370)(C:\Users\NINGMEI\Desktop\Typora文档图片\MyBatis\image-20230505132948595.png)]

最终结论:局部设置生效了,因为调接口打印输出只调用了item.getUsername(),而没有调用item.getAddress(),所以如果局部设置不生效,那么不会调用查询地址的sql。

本人其他相关文章链接

1.一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程
2.二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
3.三、MyBatis核心配置文件详解
4.四、MyBatis获取参数值的两种方式(重点)
5.五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map)
6.六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
7.七、MyBatis自定义映射resultMap
8.八、(了解即可)MyBatis懒加载(或者叫延迟加载)
9.九、MyBatis动态SQL
10.十、MyBatis的缓存
11.十一、MyBatis的逆向工程
12.十二、MyBatis分页插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler RISC-V 成功适配 LicheePi 4A 开发板,推动 RISC-V 生态发展

近期&#xff0c;RISC-V SIG 在 LicheePi 4A 开发板上成功实现了欧拉操作系统的适配。目前&#xff0c;最新版本的 openEuler RISC-V 23.03 V1 镜像已在 LicheePi 4A 开发板上可用&#xff0c;这一成果再次展现了 openEuler 在推动 RISC-V 生态发展过程中所取得的新突破。 下载…

JavaWeb综合案例1-2

1. 环境搭建 1.1 创建maven项目 补充相应的文件目录 1.2 修改pom文件及创建相应的基本框架 1.3 创建接口&#xff0c;实体类&#xff0c;映射到xml文件等等 创建xml映射文件 创建接口文件 创建实体类 导入对应的sqlsession工具类 导入对应的brand.html页面 2. 查询所有 2.1 编…

【看表情包学Linux】软硬链接

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;上面我们学到的所有东西&#xff0c;全部都是在内存中的。是不是所有的文件都被打开了呢&#xff1f;不是所有的文件&#xff0c;都被打开…

论文投稿技巧

论文的投稿技巧包括会议论文的投稿技巧和期刊论文的投稿技巧。会议论文和期刊论文投稿技巧差别较大&#xff0c;读者需要根据自己投稿的是会议论文还是期刊论文使用不同的技巧。 为了提高会议论文的录用率&#xff0c;需要重点考虑的因素包含如下几方面。 1. 会议的主题 投稿…

【Linux】冯诺依曼体系和操作系统:

1.冯诺依曼体系结构&#xff1a; 1.1体系概述理清&#xff1a; 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 &#x1f525;我们将冯诺依曼体系结构分为输入设备、输出设备、存储器和CPU 上述部分…

一个混淆Tailwindcss类的工具

一个混淆Tailwindcss类的工具 一个混淆Tailwindcss类的工具 前言方案的寻找如何实现混淆如何使用 1. 安装这2个包2. 执行一下脚本3. 添加 prepare script 在你的 package.json 里4. 注册这个插件 webpackvite 效果预览 核心原理 SSR 场景思考和解决方案 错误与反馈 前言 ta…

Ant Design Pro---【03 UMI中使用MOCK】

Mock 数据 Mock 数据是前端开发过程中必不可少的一环&#xff0c;是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口&#xff0c;模拟请求数据甚至逻辑&#xff0c;能够让前端开发独立自主&#xff0c;不会被服务端的开发所阻塞。 约定式 Mock 文件 Umi 约定 /mo…

SpringData-Redis配置及常用操作

文章目录 1.引入依赖2.yml配置文件3.设置Redis序列化4.使用教程5.操作String数据类型6.操作Hash数据类型7.操作Set数据类型8.操作List数据类型9.操作Sorted Set 数据类型 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId…

史上最烂 spring web 原理分析

盗引下篇spring web spring web、spring web 与 tomcat、映射器与适配器、参数解析器与类型转换器、返回值处理器与消息转换器、异常处理器、ControllerAdvice、spring web 工作流程。 版本 jdk&#xff1a;8spring&#xff1a;5.3.20spring boot&#xff1a;2.7.0 1 spring…

关键词高亮显示浏览器 Edge 插件开发 源码

插件功能 将网页中的关键词高亮显示 项目结构 $ tree . |-- content # 注入到网页中的 js 与 css | |-- content.css | -- content.js |-- icons # 插件用到的图标 | |-- icon128.png | |-- icon16.png | |-- icon32.png | -- icon48.png |-- manifest.json # …

Python+Yolov5电梯口跌倒识别

程序示例精选 PythonYolov5电梯口跌倒识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5电梯口跌倒识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#x…

【AGC】applinking服务接入产生崩溃问题

【关键字】 AGC、applinking、崩溃 【问题描述】 开发者反馈在应用中集成了AGC的applinking服务&#xff0c;在打开app时遇到了一些问题。具体如下所述&#xff1a; 在接入app linking后&#xff0c;从浏览器中访问短链接&#xff0c;能正常唤起app, 但app启动后就崩溃了&am…

UAD142A01 3BHE012551R0001使用以太网交叉电缆,您也可以直接连接。

​ UAD142A01 3BHE012551R0001使用以太网交叉电缆&#xff0c;您也可以直接连接。 如何将 MicroLogix PLC 连接到计算机并将程序下载到 MicroLogix 1100 MicroLogix PLC由美国罗克韦尔自动化旗下知名工业自动化厂商Allen-Bradley设计。MicroLogix 1100 主要用于小型工业。我们在…

【视频解读】动手学深度学习V2_02深度学习介绍

1.AI地图 人工智能的地图&#xff0c;x轴是不同模式&#xff0c;由符号学到概率模型 到机器学习&#xff0c;Y轴是我想做的东西&#xff0c;最底下的是感知&#xff0c;我得了解这是什么东西&#xff0c;然后做推理&#xff0c;形成自己的知识&#xff0c;最后做规划。最底层的…

07-Vue技术栈之(组件之间的通信方式)

目录 1、组件的自定义事件1.1 绑定自定义事件&#xff1a;1.1.1 第一种方式1.1.2 第二种方式1.1.3 自定义事件只触发一次 1.2 解绑自定义事件1.3绑定原生DOM事件1.4 总结 2、全局事件总线&#xff08;GlobalEventBus&#xff09;2.1 应用全局事件总线 3、 消息订阅与发布&#…

SwiftUI 极简实现文本摆动弹性动画

概览 SwiftUI 为我们来了界面设计和调试上的便利&#xff0c;只需几行代码我们就能实现一个不错的文本动画效果&#xff1a; 如上图所示&#xff0c;我们在 SwiftUI 中基本还没发力&#xff0c;就实现了文本摆动弹性动画。 这究竟是怎么做到的呢&#xff1f; 无需等待&#…

英文论文(sci)解读复现【NO.7】基于注意机制的改进YOLOv5s目标检测算法

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

Loadrunner性能测试(一)

备注&#xff1a;电脑最好安装有IE浏览器 一、下载安装包 链接&#xff1a;https://pan.baidu.com/s/1f5Sw0QK5zrLCU1EbN01evg?pwdbite 提取码&#xff1a;bite 包含的文件有&#xff1a; 二、安装loadrunner 注意&#xff0c;以下教程仅展示需要特别注意的步骤&#x…

PHP学习笔记第一天

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区&#xff1a;https://bbs.csdn.net/forums/angluoanquan 目录 PHP语法 基本的PHP语法 PHP的数据类型 PH…

Kubernetes 集群中某个节点出现 Error querying BIRD: unable to connect to BIRDv4 socket

1. 问题描述 Readiness probe failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/calico/bird.ctl: connect: connection refusedReadiness probe failed: 2023-05-04 22:13:23.706 [INFO]…