MyBatis的lazy-loading是什么?

2023-11-10

MyBatis的lazy-loading是什么?

MyBatis的lazy-loading(延迟加载)是一种数据查询策略,它允许仅在需要时才从数据库中获取相关联的数据。这是通过创建 Java 代理对象来实现的,该代理对象在真正需要相关对象时将其加载到内存中。

例如,考虑一个包含User和Role两个实体类的系统,并且每个用户分配了多个角色。那么我们可以使用延迟加载机制来避免在查询所有用户信息时,同时查询出所有角色信息而导致的性能瓶颈。

下面基于一个示例代码来具体介绍 MyBatis 延迟加载(Lazy Loading)的实现方法:

public class User {
    private Long id;
    private String name;
    private List<Role> roleList;
    // getters 和 setters 略
}

public interface UserMapper {
   User getUserWithRoles(Long id); 
}

在上述代码中,每个User对象都包含一个角色列表字段list。为了避免在查询时也获取角色信息,我们可以采用如下方式实现延迟加载:

  1. 首先,在mapper.xml文件中,需要配置关联查询SQL,以加载User对象对应的Role信息。如下所示:
<select id="getUserWithRoles" resultMap="BaseResultMap">
    SELECT
        u.id,
        u.name,
        r.id as role_id,
        r.name as role_name
    FROM user u
    LEFT JOIN user_role ur ON u.id = ur.user_id
    LEFT JOIN role r ON ur.role_id = r.id
    WHERE u.id = #{id}
</select>

在该查询语句中,我们使用了JOIN方法将user表、user_role表和role表聚合起来并一次性获取所有数据。

  1. 接下来,在实现query时不直接加载Role信息,而是使用代理类去加载list中一个个的Role对象。如下所示:
public class User {
    // ...
    private List<Role> roleList;
    private transient SqlSession sqlSession;

    public List<Role> getRoleList() {
        if (sqlSession != null) {
            roleList = sqlSession.selectList("getUserRoles", id);
        }
        return roleList;
    }

    public void setSqlSession(SqlSession sqlSession) {
        this.sqlSession = sqlSession;
    }
}

从上面代码中可以看出来,每当有用户调用getRoleList()方法时,就会检查是否已检索到目标角色列表。如果没有,则使用事先定义的SQL语句执行延迟加载操作。

  1. 在UserMapper.xml文件里同时写好获取Role信息的SQL语句,在mybatis-config.xml配置文件中为其添加xml文件解析器:
  <mapper resource="com/mybatis/xml/UserMapper.xml"/>

这样,当查询单个用户时候,User对象被创建出来,并且其getRoleList方法那时由代理处理。 当getRoleList方法第一次被调用时,代理发出记录查询请求并填充包装后的List对象,由此完成了延迟加载的设计。

延迟加载可以避免不必要的数据读取和处理操作,从而提高程序的性能和响应速度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis的lazy-loading是什么? 的相关文章

随机推荐

  • el-select + el-tree

    1 效果图 2 组件
  • 微信公众号小说系统源码 漫画系统源码 可对接微信公众号 APP打包 对接个人微信

    源码描述 修复版掌上阅读小说源码 公众号漫画源码可以打包漫画app 产品介绍 掌上阅读小说源码支持公众号 代理分站支付功能完善强大的小说源码 公众号乙帅读者 可以对接微信公众号 APP打包 支持对接个人微信收款 产品优势 1新增签到 平台分
  • 【语义分割】1、语义分割超详细介绍

    文章目录 一 分割方法介绍 1 1 Fully Convolutional Networks 2015 1 1 1 FCN 1 1 2 ParseNet 1 2 Encoder Decoder Based Models 1 2 1 通用分割
  • < 在Vue中 el-popover + el-tiptap 实现 富文本框输入,表格点击展示 (富文本HTML标签渲染) >

    文章目录 前言 一 原理 gt el tiptap 安装 及 使用案例 二 实现案例 gt 富文本输入端 gt 富文本输出端 展示端 三 效果演示 小温有话说 往期内容 前言 在Vue开发中 有时候需要用到富文本框输入指定的 富文本 输出端
  • linux搭建虚拟化平台报告,Centos部署KVM虚拟化平台(可跟做)

    Centos部署KVM虚拟化平台 可跟做 发布时间 2020 08 19 05 47 46 来源 51CTO 阅读 4210 作者 俊伟祺i 一 KVM概述 KVM是Kernel Virtual Machine的简写 目前Linux发行版必
  • 电子版简历有哪些(合集)

    word Excel PPT简历 传统的电子版简历 即用文档软件编辑的简历 这一类简历的呈现模式只有单一的文字 图片或表格 传统 意味着被广泛求职者所使用 优点包括有 传统 端庄 直观 但传统也意味着没有创新 缺点包括有 乏味 不新颖 没有
  • BeyondCompare 破解(试用期重置)

    将安装日期改为未来的日期 beyond compare 安装后会在 C Users 计算机名 AppData Roaming BCompare 目录下生成一个 ini文件 记录 安装的时间 和 最近一次打开软件的时间 只要超过30天就会提示
  • X64处理器架构

    X64处理器架构 翻译的windbg帮助文档 X64处理器架构 X64 架构是一个向后兼容的扩展的 x86 提供了和 x86 相同的 32 位模式和一个新的 64 位模式 术语 x64 包括 AMD 64 和 Intel64 他们的指令集基
  • Spring在代码中获取bean的几种方式

    Spring在代码中获取bean的几种方式 方法一 在初始化时保存ApplicationContext对象 方法二 通过Spring提供的utils类获取ApplicationContext对象 方法三 继承自抽象类ApplicationO
  • 黑客一般是如何入侵电脑的?

    1 无论什么站 无论什么语言 我要渗透 第一件事就是扫目录 最好一下扫出个上传点 直接上传 shell 诸位不要笑 有时候你花很久搞一个站 最后发现有个现成的上传点 而且很容易猜到 不过这种情况发生在 asp 居多 2 asp aspx M
  • CV计算机视觉核心07-目标检测yolo v2、v3(yolo初始版本的v0和v1版本代码)

    CV计算机视觉核心07 目标检测 设计检测类算法的output层 可用已知条件有 1 检测问题的输出是什么 怎么用数字来表示 输入是一个矩阵 输出是 x y w h 其中x和y表示目标的左上角坐标 w和h表示目标的长和宽 因此输出是用四个这
  • 【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库

    前言 本篇主要是基于gensim 库中的 Word2Vec 模型 使用维基百科中文数据训练word2vec 词向量模型 大体步骤如下 数据预处理 模型的训练 模型的测试 准备条件 Windows10 64位 Python3 6 并安装 ge
  • ‘git‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    1 cmd报错内容 C Users 27104 Desktop gt git clone https github com tianyucoder 200826 ajax git 不是内部或外部命令 也不是可运行的程序 或批处理文件 2 原
  • range()函数

    range 函数 创建一个整数列表 一般用于for循环当中 1 语法 range start stop step start 计数从start开始 默认为0 range 9 和range 0 9 是一样的 stop 计数到stop为止 但不
  • 通用智能面临巨大掣肘,国产AIGC还在寻找光明

    无论技术有多先进 符合商业规律才能笑到最后 数科星球 原创 作者丨苑晶 编辑丨十里香 AI GC背后充满了故事 在一家家企业手握巨额融资之时 人们耳边再次响起了警钟 诚然 在新的浪潮之下 符合商业规律的企业才能笑到最后 在国外竞品大踏步前行
  • 关于项目管理的知识点

    转自 http blog joycode com mvm 感觉写的挺好 推荐大家看一下 1 你们的项目组使用源代码管理工具了么 应该用 VSS CVS PVCS ClearCase CCC Harvest FireFly都可以 我的选择是V
  • 【目的:windows下VS2017/2022配置使用opengl - 初探-创建一个空窗口】

    目的 windows下VS2017 2022配置使用opengl 初探 创建一个空窗口 环境 系统 Win10 环境 VS2017 64bit 步骤 windows下visualstudio下使用opengl 搭建配置环境并测试窗口 1 o
  • vue3.0---使用computed来获取vuex里数据

    不再是vue2 0里什么mapGetter mapState那些复杂的获取方式 vue3 0里直接使用computed就可以调用vuex里的数据了 喜大普奔 同时注意 一点 不可以直接使用useStore 方法里的state对象 因为在输出
  • css将文字置于图片上的方法

    我们在开发的时候 有大量的场景需要将文字至于图片之上 如图 以上是将 空山新雨后 天气晚来秋 加在图片之上 对于大多数情况 我们都可以将图片作为背景图引入 但有些时候不能将图片作为背景图引入 这个时候就要用到其他的方法 以下我们提供三种方法
  • MyBatis的lazy-loading是什么?

    MyBatis的lazy loading是什么 MyBatis的lazy loading 延迟加载 是一种数据查询策略 它允许仅在需要时才从数据库中获取相关联的数据 这是通过创建 Java 代理对象来实现的 该代理对象在真正需要相关对象时将