Mybatis延迟加载和缓存深入讲解

yizhihongxing

Mybatis 是一个 Java 持久层框架,它提供了灵活、高效的数据访问支持,其中数据查询功能更是 Mybatis 的一大特点。在我的博客中,我对 Mybatis 的两个重要特性进行了详细的解释,即延迟加载和缓存。

Mybatis 延迟加载

Mybatis 延迟加载是指,当查询数据时,不会立即将关联对象加载到内存中,而是采用按需获取的方式,当访问关联对象时才进行加载。这样可以减轻内存负担,提升查询效率,尤其是对于一些大型数据集查询和分页查询,效果更为显著。

延迟加载的实现

Mybatis 延迟加载的实现原理是使用代理对象来延迟加载关联对象。代理对象是在获取关联对象时创建的,它并不是真正的关联对象,而是继承了关联对象的接口,并覆盖了其中的逻辑。当代理对象的方法被调用时,才会去加载真正的关联对象。

延迟加载的配置

Mybatis 延迟加载的配置需要在 mapper.xml 文件中添加 lazyLoadingEnabledaggressiveLazyLoading 两个属性的配置:

<settings>
    <setting name="lazyLoadingEnabled" value="true" />
    <setting name="aggressiveLazyLoading" value="false" />
</settings>

其中,lazyLoadingEnabled 用于开启延迟加载;aggressiveLazyLoading 用于指定是否在嵌套查询中开启延迟加载。如果开启了 aggressiveLazyLoading,则 Mybatis 会尝试在嵌套查询中使用延迟加载,否则将会在嵌套查询中立即加载所有关联对象。

延迟加载的示例

下面是一个使用 Mybatis 延迟加载的示例:

// 获取用户信息和订单列表,但不立即加载订单详细信息
User user = userDao.findUserById(userId);
List<Order> orders = user.getOrders();

上述代码中,首先查询用户信息时只会加载用户的基本信息,而不会加载关联的订单信息。当需要获取订单列表时,才会去加载订单详细信息。这样可以避免一次性加载大量数据到内存中,提升查询效率。

Mybatis 缓存

Mybatis 缓存是指,在 Mybatis 中,对于相同的 SQL 语句和参数,获取的结果将被缓存,当再次查询时,可以直接从缓存中获取结果,从而避免了重复查询数据库的时间消耗。

缓存的实现

在 Mybatis 中,有一级缓存和二级缓存两种缓存方式。

一级缓存

Mybatis 的一级缓存是指在 SqlSession 中的缓存,它是一个 SqlSession 级别的缓存,只在同一 SqlSession 中有效,不同的 SqlSession 中的缓存不会互相影响。当查询相同的 SQL 语句和参数时,如果缓存中已经存在结果,就会直接返回缓存中的结果。在整个 SqlSession 生命周期中,同一个查询语句只会被执行一次,多次相同的查询会直接从缓存中获取结果,提高了查询效率。

二级缓存

Mybatis 的二级缓存是指在 SqlSessionFactory 中的缓存,它是一个全局性的缓存,对于同一 SqlSessionFactory 实例的所有 SqlSession 对象都是可见的。当一个 SqlSession 中执行了一个增、删、改操作时,会清空该 SqlSession 对应的所有数据缓存,以保证缓存数据的一致性。

缓存的配置

Mybatis 缓存的配置需要在 mapper.xml 文件中添加 <cache> 标签的配置:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

其中,eviction 属性用于指定缓存淘汰策略(FIFO/LRU),flushInterval 属性用于指定缓存刷新时间间隔,size 属性用于指定缓存大小,readOnly 属性用于指定是否开启只读缓存。

缓存的示例

下面是一个使用 Mybatis 缓存的示例:

// 获取用户信息,查询过程中将结果缓存
User user = userDao.findUserById(userId);
// 再次查询该用户信息,直接从缓存中获取结果
User userCached = userDao.findUserById(userId);

上述代码中,在第一次查询获取用户信息时,Mybatis 将结果缓存起来。当再次查询该用户信息时,直接从缓存中获取结果,避免了重复查询数据库的时间消耗。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis延迟加载和缓存深入讲解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 关于事件:java中的addactionlistener方法

    在Java中,addActionListener()方法是用于向按钮添加事件监听器的方法。当用户单击按钮时,事件监听器将捕获该事件并执行相应的操作。以下是addActionListener()的详细攻略,包括语法、参数、返回值、示例等。 语法 public void addActionListener(ActionListener listener) 参数 …

    other 2023年5月7日
    00
  • treemap有序的hashmap。用于排序

    Treemap是一种有序的HashMap,它可以根据键的自然顺序对元素进行排序。在本攻略中,我们将详细讲解如何使用Treemap实现排序,并提供两个示例说明。 什么是Treemap Treemap是一种基于红黑树实现的有序的HashMap。它可以根据键的自然顺序对元素进行排序,并提供了一些额外的方法来支持排序操作。 Treemap的主要特点包括: 元素按照键…

    other 2023年5月8日
    00
  • VPS性能测试(3):磁盘IO读写速度、SSD硬盘速度测试

    VPS性能测试(3):磁盘IO读写速度、SSD硬盘速度测试的完整攻略 本文将为您提供VPS性能测试(3):磁盘IO读写速度、SSD硬盘速度测试的完整攻略,包括介绍、步骤和两个示例说明。 介绍 磁盘IO读写速度和SSD硬盘速度是VPS性能测试中的重要指标之一,可以反映出VPS的磁盘性能和响应速度。本文将介绍如何测试VPS的磁盘IO读写速度和SSD硬盘速度,并提…

    other 2023年5月6日
    00
  • 通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式

    通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式 本文将讲解C语言和Java中二叉树的三种非递归遍历方式:先序遍历、中序遍历和后序遍历。这三种遍历方式分别可以使用栈来实现非递归遍历。下面将详细讲解这三种遍历方式的实现过程。 先序遍历 先序遍历的遍历顺序是中->左->右。实现的过程如下: struct TreeNode { int val;…

    other 2023年6月27日
    00
  • 如何正确使用Android线程详解

    如何正确使用Android线程详解 在Android开发中,线程是一个非常重要的概念。如果我们需要在应用程序中执行一些耗时的操作,我们必须考虑使用线程来避免UI线程阻塞。本文将提供一些关于Android线程的知识以及示例,展示如何使用线程来处理后台任务。 线程基础知识 Android提供了两种线程类型,即UI线程和后台线程。UI线程是指所有与用户界面相关的操…

    other 2023年6月27日
    00
  • 关于java:正则表达式匹配数字 逗号和分号?

    Java正则表达式匹配数字、逗号和分号 在Java中,正则表达式是一种强大的工具,可以用于匹配和操作字符串。如果您需要匹配数字、逗号和分号,使用正则表达式来实现。在本攻略中,我们将介绍如何使用Java正表达式来匹配数字、逗号和分号。 匹配数字、逗号和分号 要匹数字、逗号和分号,可以使用正则表达式中的字符类。字符类用方括号[]括起来,其中包含要匹配的字符。下面…

    other 2023年5月9日
    00
  • 未能解析此远程名称:’www.***.com’解决办法

    简介 当我们在使用网络服务时,有时会遇到“未能解析此远程名称”的错误。这通常是由于DNS解析问题引起的。在本攻略中,我们将介绍如何解决“未能解析此远程名称”的问题。 步骤 以下是解决“未能解析此远程名称”的问题的步骤。 步骤1:检查网络连接 首先,我们需要检查我们的网络连接是否正常。我们可以尝试访问其他网站,例如Google或百度,以确保我们的网络连接正常。…

    other 2023年5月6日
    00
  • WinRAR 压缩技巧 个性化设置 自定义说明等

    WinRAR 压缩技巧攻略 前言 WinRAR 是一个非常流行的压缩文件工具,具有压缩比高、速度快等优秀特性,同时还支持压缩文件加密、分卷压缩、自解压等功能。在使用 WinRAR 进行压缩时,以下是一些个性化设置和技巧,可以帮助你更好地利用这个工具。 压缩技巧 选择正确的压缩类型 WinRAR 支持多种压缩类型,如 RAR, ZIP, 7Z 等,不同的压缩格…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部