mybatis延迟加载

mybatis延迟加载

1、延迟加载概述

  1. 应用场景

    ​ 如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。

  2. 延迟加载的好处

    ​ 先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。

  3. 延迟加载的条件:

    1)resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。

    2)延迟加载是针对分步查询而言的

2、开启延迟加载

Mybatis的延迟加载功能默认是关闭的

需要在mybatis-config.xml全局配置文件中通过setting标签配置来开启延迟加载功能

需要在mybatis-config.xml全局配置文件中通过setting标签配置来开启延迟加载功能开启延迟加载的属性:

lazyLoadingEnabled:全局性设置懒加载。默认为false,true表示开启延迟加载
aggressiveLazyLoading:false表示关闭积极加载
说明:这两个属性必须一起设置

【示例】

<settings><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/><!--关闭积极加载--><setting name="aggressiveLazyLoading" value="false"/></settings>

3、延迟加载测试

延迟加载需求:通过订单编号20140921003查询order并延迟加载user。就是演示上述演示过的一对一的表关系案例。

如果通过订单编号查询order并且查询user信息,在正常情况下的查询语句应该是:

在这里插入图片描述

分析:

如果改成延迟加载,也就意味着,先查询order,等需要的时候再去查询user,那就相当于将上面的一条语句变成了两条语句:

1、通过订单编号查询order

在这里插入图片描述

2、通过查询出来的order中的user_id查询user

在这里插入图片描述

sql语句:

分步查询:#第一步:根据order_number查询订单信息;SELECT * FROM tb_order WHERE order_number = '20140921003';#第二步:根据订单信息中的user_id查询出下单人的信息;SELECT * FROM tb_user WHERE id = 1;
第一步:编写接口方法

在OrderMapper接口中新建:queryOrderUserLazy方法

    /*** 根据orderNumber懒加载查询订单及用户信息* @param orderNumber* @return*/Order queryOrderUserLazy(@Param("orderNumber") String orderNumber);
第二步:编写SQL

【OrderMapper.xml】

 <!--懒加载结果集--><resultMap id="orderUserLazyResultMap" type="Order"><id property="id" column="id"/><!--1.column属性:延迟加载的sql语句中所需的参数,就是SELECT * FROM tb_user WHERE id = ?;该sql语句的?位置。这里书写 user_id因为执行  SELECT * FROM tb_order WHERE order_number = #{orderNumber} 语句查询的用户id对应的列名就是user_id2.select属性:调用指定sql语句来执行延迟加载,就是指定sql语句所在的位置,根据用户id查询用户信息位于UserMapper.xml文件中,具体地址是:namespace.id3.执行流程:先执行SELECT * FROM tb_order WHERE order_number = #{orderNumber} 根据订单号获取订单信息(包括用户id)然后根据 select="com.itheima.sh.dao.UserMapper.selectById" 找到UserMapper.xml文件中的:<select id="selectById" resultType="User">select * from tb_user where id = #{id}</select>并将column="user_id" 对应的列值传递过去并将查询的结果封装到User对象中,最后将User对象封装到Order对象中--><association property="user" javaType="User" column="user_id"  select="com.itheima.sh.dao.UserMapper.selectById"></association></resultMap><select id="queryOrderUserLazy" resultMap="orderUserLazyResultMap">SELECT * FROM tb_order WHERE order_number = #{orderNumber}</select>

【UserMapper.xml】

<mapper namespace="com.itheima.sh.dao.UserMapper"><!--查询语句id: 接口中方法的名字resultType:返回的实体类的类型,类全名--><select id="selectById" resultType="User">select * from tb_user where id = #{id}</select></mapper>

说明:

 1.column属性:延迟加载的sql语句中所需的参数,就是SELECT * FROM tb_user WHERE id = ?;该sql语句的?位置。这里书写 user_id因为执行  SELECT * FROM tb_order WHERE order_number = #{orderNumber} 语句查询的用户id对应的列名就是user_id2.select属性:调用指定sql语句来执行延迟加载,就是指定sql语句所在的位置,根据用户id查询用户信息位于UserMapper.xml文件中,具体地址是:namespace.id3.执行流程:先执行SELECT * FROM tb_order WHERE order_number = #{orderNumber} 根据订单号获取订单信息(包括用户id)然后根据 select="com.itheima.sh.dao.UserMapper.selectById" 找到UserMapper.xml文件中的:<select id="selectById" resultType="User">select * from tb_user where id = #{id}</select>并将column="user_id" 对应的列值传递过去并将查询的结果封装到User对象中,最后将User对象封装到Order对象中

【注意】

  1. 懒加载首先是把SQL拆分;
  2. 然后在resultMap中,通过关联映射配置中的,select属性引入需要懒加载进来的对象;
第三步:开启懒加载

在mybatis-config.xml全局配置文件中,开启懒加载

在这里插入图片描述

    <!--settings属性配置--><settings><!--开启延迟加载--><setting name="lazyLoadingEnabled" value="true"/><!--关闭积极加载--><setting name="aggressiveLazyLoading" value="false"/></settings>
第四步:测试

【没有访问关联对象】

在没有访问关联对象的属性时,只发送了一条SQL。

在这里插入图片描述

【访问关联对象的属性】

在这里插入图片描述

访问关联对象属性时,发送了两条SQL语句。按需查询-----懒加载!

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

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

相关文章

C++ 数据库MySQL 学习笔记(3) - 数据库操作

C 数据库MySQL 学习笔记(3) - 数据库操作 视图操作 视图是从一个或多个表中导出来的表&#xff0c;是一种虚拟存在的表。视图就像一个窗口&#xff0c;通过这个窗口可以看到系统专门提供的数据&#xff0c;这样用户可以不看整个数据库表中的数据&#xff0c;而只关心对自己有…

【加密与解密】【07】SSL安全套件全解析

SSL/TLS协议 SSL&#xff0c;Secure Socket Layer&#xff0c;安全套接层 TLS&#xff0c;Transport Layer Security&#xff0c;传输层安全协议 TLS是SSL的最终完善版本&#xff0c;一般也可称为SSL协议 SSL是负责传输层安全&#xff0c;确定传输层数据如何封装的一套协议…

讨论Nginx服务器的反爬虫和反DDoS攻击策略

Nginx服务器是一个高性能的Web服务器和反向代理服务器&#xff0c;具有强大的反爬虫和反DDoS攻击能力。本文将讨论Nginx服务器的反爬虫和反DDoS攻击策略&#xff0c;并给出相关的代码示例。 一、反爬虫策略 爬虫是一种自动化程序&#xff0c;用于从互联网上收集特定网站的数据…

Java 内存分页

1. 查询出要分页的总数 2. 根据 stream 流进行分页 3. 当分页数超过总数&#xff0c;返回空集合。例&#xff1a;总数10&#xff0c;页码2&#xff0c;pagesize10 4. 当最后一页不够 pageSize, limit(pageSize) 返回实际条数 例&#xff1a;12条数据&#xff0c;pageSize10…

使用Petalinux设计linux系统

文章目录 1.通过 Vivado 创建硬件平台&#xff0c;得到 hdf 硬件描述文件2.设置 Petalinux 环境变量3.创建 Petalinux 工程4.配置Petalinux 工程5.配置Linux内核6.配置Linux根文件系统7.配置设备树文件8.编译 Petalinux 工程9.制作BOOT.BIN启动文件10.制作SD启动卡 1.通过 Viva…

GaussDB关键技术原理:高性能(三)

GaussDB关键技术原理&#xff1a;高性能&#xff08;二&#xff09;从查询处理综述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行分享。 目录 3 高性能…

Jupyter Notebook相关

Jupyter Notebook 相关 一、什么是 Jupyter Notebook&#xff1f; 1.1 基本概念 Jupyter Notebook 是一个基于 web 的应用程序&#xff0c;可以用来创建和共享包含代码、文本、公式、图像和图表的文档。它类似于一个电子笔记本&#xff0c;你可以在一个页面上写代码并立即运行…

.secret勒索病毒详解,如何防御网络隐秘威胁

引言&#xff1a; 在数字化日益普及的今天&#xff0c;网络安全问题愈发凸显&#xff0c;其中勒索病毒作为一种极具破坏性的恶意软件&#xff0c;给个人用户和企业带来了巨大的损失和心理压力。.secret勒索病毒&#xff0c;作为这一威胁中的佼佼者&#xff0c;以其高度的隐蔽性…

Android Graphics 显示系统 - BufferQueue的状态监测

“ BufferQueue作为连接生产者和消费者的桥梁&#xff0c;时刻掌握队列中每一块Buffer的状态&#xff0c;对于解决一些卡死卡顿问题很有帮助&#xff0c;辨别是否有生产者或消费者长期持有大量Buffer不放导致运行不畅的情况。” 01 — 前言 在Android系统中&#xff0c;应用U…

Redis基础教程(四):redis键(key)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

多层感知机与CLIP在推荐系统和多模态学习中的应用

MLP多层感知机 在推荐系统中,MLP(Multi-Layer Perceptron,多层感知机)是一种常用的神经网络模型,用于捕捉用户和物品之间的复杂非线性关系,从而生成高质量的推荐结果。以下是 MLP 在推荐系统中的应用及其优势。 MLP 在推荐系统中的作用 用户和物品特征的表示: MLP 能够…

Spring Boot应用的部署与扩展

Spring Boot应用的部署与扩展 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 Spring Boot作为现代化Java应用的首选框架之一&#xff0c;以其简化的配置…

MicroBin好用的粘贴板工具

有时候你可能想从一台电脑上粘贴文本到另一台电脑上&#xff0c;或者是你想要分享一张图片或者是一些文件&#xff0c;某些设备上登陆qq和微信有不太方便&#xff0c;那么就可以使用MicroBin&#xff0c;它不但可以实现跨设备复制粘贴的功能&#xff0c;还支持文件上传等功能 …

微信小程序的在线客服系统源码 附带完整的源代码包以及搭建部署教程

系统概述 微信小程序的在线客服系统源码是一套专门为微信小程序开发的客服解决方案。它通过与微信小程序的紧密集成&#xff0c;为用户提供了便捷、高效的客服沟通渠道。该系统源码采用先进的技术架构&#xff0c;具备良好的稳定性和扩展性&#xff0c;能够满足不同规模企业的…

大数据开发语言 Scala(二):变量和数据类型

目录 1. 变量的基本概念 1.1 不可变变量&#xff08;val&#xff09; 1.2 可变变量&#xff08;var&#xff09; 2. 数据类型详解 2.1 基本数据类型 2.1.1 数字类型 2.1.2 字符类型 2.1.3 布尔类型 2.2 复杂数据类型 2.2.1 数组 2.2.2 元组 2.2.3 列表 2.2.4 集合…

韩顺平0基础学java——第34天

p675-689 UDP网络编程 1.类 DatagramSocket和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。 2.UDP数据报通过数据报套接字DatagramSocket发送和接收&#xff0c;系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 3.DatagramPacket对象…

【前端】从零开始学习编写HTML

目录 一、什么是前端 二、什么是HTML 三、HTML文件的基本结构 四、HTML常见标签 4.1 注释标签 4.2 标题标签 4.3 段落标签 4.4 换行标签 4.5 格式化标签 4.6 图片标签 4.7 超链接标签 4.8 表格标签 4.9 列表标签 4.10 表单标签 &#xff08;1&#xff09;form标…

Python 学习之面向对象(四)

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计应用程序和软件系统。在Python中&#xff0c;面向对象编程是一个核心概念&#xff0c;并得到了广泛的支持。 以下是Python面向对象编程的一些基本概念和特…

MySQL高可用(MHA高可用)

什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…

内容营销专家刘鑫炜:如何撰写一篇吸睛又能转化的医疗推广软文?

在我每天要处理的稿件中&#xff0c;有1/3以上是医疗软文&#xff0c;但稿件质量情况不容乐观&#xff0c;大部分医疗软文甚至用极其糟糕来形容都为过&#xff0c;互联网都到下半场了&#xff0c;很多医疗机构营销人员的营销思维还是停留在二十几年前&#xff0c;投放的软文还是…