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

在这里插入图片描述

文章目录

  • 八、懒加载(了解即可)
    • 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.mfbz.cn/a/17877.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自学Python必须知道的优秀社区

国内学习Python网站&#xff1a; 知乎学习平台&#xff1a;Python - 基础入门 - 知学堂黑马程序员视频库&#xff1a;大数据学习路线2023版-黑马程序员大数据学习路线图菜鸟教程&#xff1a;菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01;极客学院&#xff1a;极…

进阶自动化测试,这3点你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…

玩转服务器之Java Web篇:手把手教你搭建Java Web环境

前言 Java Web项目&#xff0c;简单来说就是我们在浏览器上可以看到的内容。就简单的Web来说&#xff0c;服务器上也同样需要有计算机上所需要的运行环境&#xff0c;如&#xff1a;java,tomcat,mysql 。Java Web环境可以用来开发和部署各种Web应用程序&#xff0c;例如网站、…

Redis基础

Redis基础 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis 1. 前言 1.1 什么是Redis Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0…

HTTP的特点

灵活可扩展 HTTP 协议最初诞生的时候就比较简单&#xff0c;本着开放的精神只规定了报文的基本格式&#xff0c;比如用空格分隔单词&#xff0c;用换行分隔字段&#xff0c;“headerbody”等&#xff0c;报文里的各个组成部分都没有做严格的语法语义限制&#xff0c;可以由开发…

优先级队列(大根堆与小根堆)

优先级队列&#xff08;大根堆与小根堆&#xff09; 文章目录 优先级队列&#xff08;大根堆与小根堆&#xff09;堆的介绍模拟堆以数组模型为例&#xff0c;创建堆向下调整&#xff08;shiftDown&#xff09;入队&#xff08;push&#xff09;及向上调整&#xff08;shiftUp&a…

SLAM中将地图映射到谷歌地图上的方法——完美运行

文章目录 前言一、rviz_satellite二、mapviz 前言 老是看到论文中有将地图映射到谷歌地图上的图&#xff0c;实在是泰裤辣&#xff01;&#xff01;&#xff08;武汉大学&#xff09; 搜索了很久&#xff0c;发现有两种可视化软件&#xff0c;分别为rviz_satellite和mapviz。…

第4章-动态规划

第4章-动态规划 总分&#xff1a;100分 得分&#xff1a;100.0分 10.0 分 1 . 多选题 中等 10分 有关0-1背包问题,用c[i][j]描述子问题:1...i共i个物品,背包容量为j的最优值(装入背包的最大价值),则其子问题为:1...i-1共i-1个物品,背包容量为j-w ix i,以下说法正确的是( AB…

如何利用分钟级降水预报 API 优化城市水利管理?

引言 降水预报对于城市水利管理部门来说至关重要&#xff0c;它可以帮助管理者及时了解当地的降雨情况&#xff0c;以便更好地管理城市水利设施&#xff0c;保障公共安全。然而&#xff0c;传统的降水预报数据一般只提供每小时或每3小时的粗略预报数据&#xff0c;无法满足城市…

ICV: 全球QRNG产业规模在2030年有望突破200亿美元

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了《全球量子随机数发生器的产业研究报告》&#xff0c;从多个角度对QRNG的市场进行预测。 QRNG 是解决与随机数相关的问题&#xff08;例如密码解决方案&#xff09;的重要硬件来源。 QRNG 是随着量子物理技术的发展…

2023年6月DAMA-CDGA/CDGP数据治理认证报名请尽早啦!

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证开班时间&#xff1a;5月7日 DAMA认证为数据管理专业人士提供…

项目管理:项目进度跟踪的好处有哪些?

项目进度跟踪主要针对项目计划、任务和项目成员三个方面&#xff0c;即为了了解整个项目计划完成情况、了解项目的实际进展情况、解成员工作完成情况。 项目跟踪可以证明计划是否可执行&#xff0c;可以说明计划是否可以被完成。 在项目执行过程中&#xff0c;我们也可以通过跟…

windows安装node.js和vue3.x

目录 下载并安装node配置环境变量配置淘宝镜像源安装webpack全局打包工具安装cnpm安装vue-cli 3.xcnpm问题警告的解决办法 下载并安装node 1&#xff0c;下载nodejs 直接从node.js官网下载&#xff1a;https://nodejs.org/en/download 根据自己电脑的版本选择32位或者64位&…

智慧城市3d可视化管理大屏系统有效提高服务质量和效率

随着新一代信息技术飞速融入传统产业&#xff0c;农业数字化、网络化、智能化逐步成为农业现代化发展的基石。实现农业生产环境的智能感知、智能预警、智能决策、智能分析等功能&#xff0c;为农业生产提供精准化保障、高质量运营水平、智能化决策支撑。 3D可视化智慧管理 1&am…

中断-STM32

中断-STM32 中断:在主程序运行过程中&#xff0c;出现了特定的中断触发条件 (中断源)&#xff0c;使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行。 中断优先级:当有多个中断源同时申请中断时&#xff0c;CPU会根据中断源的轻重缓…

【Halcon】 Halcon 22.11 安装详细教程

文章目录 1安装2 获取许可证 license2.1 license下载2.2 激活 license放置在相应文件夹下3 DLT 安装1安装 1.解压安装包 2.打开运行 exe 程序 跳转至页面 点击“可获得的”,并安装选择: AVAILABLE ->INSTALL 可获得的 ->安装

云计算中的边缘计算技术及其应用

章节一&#xff1a;云计算和边缘计算的简介 随着互联网的发展&#xff0c;数据中心的规模不断扩大&#xff0c;云计算也成为了越来越受欢迎的计算模式。但是&#xff0c;云计算存在着一些问题&#xff0c;比如延迟较高&#xff0c;网络瓶颈&#xff0c;数据隐私和安全性等等。…

Wikidata 模型分析+实体抽取+数据处理

Wikidata 数据分析与处理 需求&#xff1a;Wikidata 数据描述了很多实体&#xff0c;以及实体属性。比如某一个公司/组织/机构名称是&#xff1a;阿里巴巴&#xff0c;对数据内该组织的相关属性进行观察、分析、治理、抽取等&#xff0c;最后用图数据库进行存储和展示其关系&am…

蓝牙资讯|苹果与谷歌起草蓝牙定位追踪设备行业规范

苹果与谷歌于当地时间5月2日联合提交了一份行业规范草案&#xff0c;以帮助应对蓝牙定位追踪设备遭滥用的问题。目前已有包括三星在内的追踪设备制造厂商宣布支持该草案。 据了解&#xff0c;苹果与谷歌此次联合提交的行业规范草案将云熙蓝牙定位追踪设备兼容跨iOS以及Android平…

asp.net+sqlserver漫画绘本借阅管理系统

摘 要1 第1章 系统概述5 1.1 研究背景5 1.2 研究的意义5 1.3 主要研究内容5 第2章 系统开发环境7 2.1 ASP.NET概述7 2.2 动态网站技术介绍8 2.3 数据库技术8 第3章 需求分析9 3.1 需求分析9 3.1.1 功能需求9 3.2 可行性分析9 3.2.1 可行性分析9 3.2.2 技术可行性9 3.2.3 运行可…
最新文章