mybatis的延迟加载机制

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6) 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 阅读详情

mybatis的延迟加载机制

延迟加载的含义: 用到的时候才会去进行相关操作

Mybatis支持association关联对象和collection关联集合对象的延迟加载

区别:association使用场景是一对一的关联查询,collection是一对多的关联查询

它的原理是

  • 使用CGLIB动态代理创建目标对象的代理对象,当调用目标方法时,进入拦截器方法查看是否有值
  • 比如调用user.getAccount(),拦截器invoke()方法发现user.getAccount()是null值,那么就会单独发送查询关联user对象的sql,把这个account查询上来
  • 然后调用user.setAccount(account),于是user的account属性就有值了
示例

一个account,一个user表

CREATE TABLE `account` (
  `acc_id` int(11) NOT NULL,
  `num` int(10) unsigned zerofill DEFAULT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`acc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这里给user实体类增加了一个Account成员变量,用于测试延迟加载

public class User{
    private Integer userId;

    private String name;

    private Account account;
}
public class Account{
    private Integer accId;

    private Integer num;

    private Integer userId;
}

当我们正常按id查询user时,只查询了一条sql语句

//java代码
User user = userMapper.selectByPrimaryKey(1);
System.out.println("user.getUserId() = " + user.getUserId());
System.out.println("user.getName() = " + user.getName());
System.out.println("user.getAccount() = " + user.getAccount());

//sql
select user_id, `name` from test.`user` where user_id = ?
//结果
user.getUserId() = 1
user.getName() = test
user.getAccount() = null

如果我们开启延迟加载

在Mybatis配置文件中,可以配置是否启用延迟加载

# 开启延迟加载
mybatis.configuration.lazy-loading-enabled=true
# 将积极加载改为消极加载,即延迟加载
mybatis.configuration.aggressive-lazy-loading=false

在UserMapper.xml文件中的resultMap里加入一个association标签

(如果是一对一的关系用association标签,一对多用collection标签)

表示我不仅要把数据库中原有的user_id和name查出来

我还要将下列特征对应的属性一同延迟加载出来

  • property属性名称为account

  • javaType全类名为com.ifyyf.boot_test.pojo.Account

  • select查询方法位置是com.ifyyf.boot_test.dao.AccountMapper.selectByUserId(AccountMapper中的方法)

  • column传入的参数是user_id(因为AccountMapper中的selectByUserId是根据user_id查询的)

  <resultMap id="BaseResultMap" type="com.ifyyf.boot_test.pojo.User">
    <!--@mbg.generated-->
    <!--@Table test.`user`-->
    <id column="user_id" jdbcType="INTEGER" property="userId" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <association property="account"
                 javaType="com.ifyyf.boot_test.pojo.Account"
                 select="com.ifyyf.boot_test.dao.AccountMapper.selectByUserId"
                 column="user_id">
    </association>
  </resultMap>
结果分析

我们查看图片可以看到这里一共执行两次sql代码,而且执行的时机是不同的

  • select user_id,namefrom test.userwhere user_id = ?,先通过id查询出来user对象,并输出了userId与name(这个是正常执行的)
  • 然后当其执行System.out.println("user.getAccount() = " + user.getAccount());时发现user.getAccount()为null,然后又去执行了一次select * from account where user_id = ?
  • 然后将查询出来的account结果set进了user,即user.setAccount(account)
  • 最后再打印出来user.getAccount()

【git】win 10 / win 11:git 首次拉取云效平台代码详细教程 git 首次拉取云效平台代码详细教程:Git 生成 SSH 公钥、云效工作台添加 SSH 公钥、git 使用 SSH / HTTP 链接拉取云效代码 阅读详情

相关推荐

SAP SD核心流程解析:从销售订单到财务结算的实战指南

本文深入解析SAP SD模块从销售订单到财务结算的核心流程,重点剖析了销售订单中的行项目类别如何作为流程的“总开关”,决定了后续交货、开票及财务集成的走向。文章结合实战案例,详细拆解了正常销售、退货、第三方销售、寄售等典型流程的配置要点与国内化适配方案,并阐述了SD与财务模块集成的关键连接点,为顾问和用户提供了一份全面的实战指南。

weixin_29250403的博客 425

Mybatis是否支持延迟加载?

在这个背景下,MyBatis作为一种优秀的持久层框架,提供了灵活的SQL映射配置和强大的功能,为开发者提供了便捷的数据库访问解决方案。本文将深入探讨MyBatis的延迟加载特性,了解如何通过全局配置或按需设置,实现对数据的精准加载,提高应用性能和效率。通过配置全局延迟加载或按需延迟加载,可以根据实际业务需求灵活地使用延迟加载功能,提高系统性能。延迟加载是一种加载数据的策略,只有在实际需要使用数据的时候才进行加载,可以提高性能和减少资源消耗。这样,对于所有的关联关系,都会按照配置进行延迟加载。

X_islu的博客 735

手把手教你用STM32F030实现功率MOS双脉冲测试(附完整电路图)

本文详细介绍了如何使用STM32F030微控制器搭建功率MOSFET双脉冲测试平台。通过分析双脉冲测试原理,提供了完整的硬件电路设计、驱动电路选型、软件时序生成方法,并指导如何利用示波器捕获和分析开关波形,从而评估功率器件的动态特性与开关损耗。

juice的博客 711

Mybatis是否支持延迟加载

在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true,默认是关闭的。2、当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,执行sql查询。延迟加载的意思:在需要用到数据时才进行加载,不需要用到数据时就不加载数据。3、获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。Mybatis支持一对一关联对象和一对多管理集合对象的延迟加载。Mybatis支持延迟加载,但默认没有开启。1、使用CGLIB创建目标对象的代理对象。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 670

JavaFx之集成FontAwesomeFX与JFoenix(十五)

本文详细介绍了如何在JavaFx项目中同时集成JFoenix和FontAwesomeFX,以创建现代化、美观的桌面应用界面。通过Maven依赖配置、动态代码创建和FXML静态声明两种方式,演示了如何将JFoenix的Material Design控件与FontAwesomeFX的丰富矢量图标完美结合,并提供了实战案例展示如何构建一个功能完善的现代化工具栏。

pepsi的博客 437

算法交易VWAP&TWAP

VWAP的一些算法模型细节参考博客地址http://blog.sina.com.cn/s/blog_ad47bc5b01014elx.html 日内交易量预测模型http://blog.sina.com.cn/s/blog_976461170102v43p.html 算法交易其实主要是用在基金公司、券商量化比较多。例如我已经选好股,要大量买入,但是单凭交易员的操作海量单而且要完

shulixu的博客 1万+

Java中mybatis是否支持延迟加载?延迟加载的原理是什么?

是的,MyBatis支持延迟加载。延迟加载是指在查询对象时,只加载其基本属性,而将关联对象的数据暂不加载,等到真正需要使用关联对象时再去查询加载其数据的一种技术。2.如果延迟加载的对象在外部环境中被修改或删除,那么在加载关联对象时可能会出现数据不一致的情况。原理是当查询对象时,只加载对象的基本属性,而对于延迟加载的关联对象,只在真正需要使用时,通过创建代理对象,再次向数据库查询加载其数据。3.在延迟加载时,MyBatis会创建代理对象来代替真正的关联对象,这可能会导致一些问题,如无法对代理对象进行序列化。

Blue92120的博客 1165

【PLIO学习总结】laserMapping中的时间戳与状态更新逻辑

本文仅用于个人学习总结记录。如有错误,请批评指正。

larrydong的博客 1646

22、Mybatis 是否支持延迟加载?如果支持,它的实现原理是 什么?

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加 载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。 它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦 截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.ge.

IT匠人的博客 1014

大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”

原标题:BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”BIM研究的先驱、佐治亚理工教授Charles (Chuck) M. Eastman于本周一(11月9日)在其Atlanta家中逝世。特转韩国Yonsei大学Ghang Lee教授的讣文以作纪念。过世原因未说明。BIM的出现是与当今时代科技的发展分不开的。在信息时代建筑发展面临的挑战巨大:建筑物越建越高...

weixin_39941262的博客 3302

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9746

Mybatis面试题--MyBatis延迟加载

延迟加载在底层主要使用的CGLIB动态代理完成的 第一是,使用CGLIB创建目标对象的代理对象,这里的目标对象就是开启了 延迟加载的mapper 第二个是当调用目标方法时,进入拦截器invoke方法,发现目标方法是null 值,再执行sql查询 第三个是获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了。: 是支持的, 延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时 就不加载数据。查询用户的时候,暂时不查询订单数据,当需要订单的时候,再查询订单,这个就是延迟加载。

qq_53868937的博客 670

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

Mybatis延迟加载机制

Mybatis延迟加载机制--à 效率蛮高   @Test    public void testFindById() {       OrderType ot = new OrderType();       try {         ot = otd.findById(1); //      System.out.println(ot.getFlowList().size())...

简约不简单 374

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Mybatis的缓存机制和延迟加载

上一篇部分阅读了Mybatis的源码梳理了一下它作为ORM层解决方案是如何帮助我们访问数据库的,今天想再总结一下Mybatis的两个特性。 Mybatis缓存机制分为一级缓存和二级缓存。 一级缓存是sqlSession级的,即利用同一个sqlSession执行查询相同的SQL,数据会直接从缓存中取。我们都知道一个sqlSession会对应new一个调度器Excutor对象,每次Excutor去...

白白胖胖充满希望 453

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Mybatis延迟加载以及缓存机制

1.延迟加载的概述 延迟加载的使用:嵌套查询。 延迟加载又称懒加载、按需加载。作用是使用数据的时候才去做数据库的查询,从而降低系统的消耗。 当数据量过大时,不建议使用 2.延迟加载的实现 2.1 局部加载 1.导入依赖 <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.1</...

qq_43814760的博客 679

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MyBatis第八篇:使用延迟加载和缓存机制来提升效率

我们开发过程中效率最慢的就是数据库的操作部分,所以我们想尽办法去提高数据库的性能,今天介绍的延迟加载和缓存机制就是提升数据库访问性能的两种方式,但是我们在真实的开发环境中往往不会使用的。往往我们会使用Redis来提升性能,在Redis面前这个缓存机制就是小儿科。但是不使用并不代表不需要了解。 文章目录前言一、延迟加载?二、缓存机制1.一级缓存2.二级缓存总结 前言 一、延迟加载? 当查询一个对象时,与它相关联的对象的查询尽量的往后延,延到我要使用这个相关联的对象的属性时,才进行查询。要知道数据

qq_44828283的博客 501

MyBatis分步查询延迟加载机制

mybatis分布查询的延迟加载机制

m0_63823719的博客 748

mybatis源代码分析:mybatis延迟加载机制改进

在上一篇博客《深入了解mybatis延迟加载机制 》 

u014569459的专栏 1083

Mybatis延迟加载&缓存机制

目录 延迟加载 1. 局部延时加载 2. 全局延迟加载 缓存机制 1. 一级缓存(Sql级别的缓存) 2. 二级缓存(SqlSessionFactory级别的缓存) 延迟加载 在查询一对象时,它相关联的对象的查询尽量往后延时查询,延时到我在程序需要访问相关系对象时,再查询相关联对象。 1. 局部延时加载 在association、collection标签有一个fetchType属性,该属性的默认值为eager(立即加载) fetchType="eager",如果想用延时加载设置fetc.

qq_41028544的博客 604

Mybatis中的sql-xml延迟加载机制

主查询对象关联对象假设咱们现在有2张表,一张是item表,一张是sku表,对应关系是1对多的关系主查询对象:itemDO关联对象:itemDO对象中的skuIdList。

阿昌爱Java 1255

深入理解 MyBatis 延迟加载机制与实现原理

登录后复制public class User implements Serializable { // 实现Serializable接口避免序列化问题// getter和setter方法// getter和setter方法1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.登录后复制// 使用Jackson注解忽略代理相关属性// 实体类定义1.2.3.4.5.

cnzzs的博客 1184

mybatis延迟加载 | 缓存机制详解

八,Mybatis延迟加载 1.概念 延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。 好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。 坏处:因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗时间,所以可能造成用户等待时间变长,造成用户体验下降。 2.开启mybatis延迟加载策略 <!-- 开启延迟加载的支持 --> <setting

星海IT学习之路 576
上一篇: 简单谈谈动态代理
下一篇: nginx反向代理的简单使用
Jay_Chou345
博客等级 码龄7年 199粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值