面试笔记——MyBatis(执行流程、延迟加载和缓存)

MyBatis 是一个持久层框架,用于简化 Java 应用程序与数据库之间的交互过程。具体而言,它提供了一种将数据库操作映射到 Java 方法的方式,通过 XML 文件或注解配置 SQL 语句与 Java 方法的映射关系。使用 MyBatis,开发人员可以通过简单的配置文件或注解来管理 SQL 语句,而不需要直接编写 JDBC 代码。

MyBatis的执行流程

流程图如下:
在这里插入图片描述

  1. 读取MyBatis配置文件,如mybatis-config.xml(该文件包含了 MyBatis 的全局配置信息,如数据库连接信息、缓存配置、映射文件的路径等)加载运行环境;映射文件,如XxxMapper,xml(该文件包含了 SQL 语句与 Java 方法的映射关系,以及结果映射等配置)。
  2. 构造会话工厂SqlSessionFactory, 它是 MyBatis 的核心接口之一,它负责创建 SqlSession 对象,SqlSession 是 MyBatis 中执行 SQL 的主要接口。
  3. 会话工厂创建SqlSession对象(包含了执行SQL语句的所有方法),它SqlSession 提供了执行 SQL 语句、获取映射器(Mapper)等功能。
  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护,通过 SqlSession 执行 SQL 语句,可以是预定义的 SQL 语句,也可以是动态生成的 SQL 语句。
  5. Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息,因此,MyBatis 会根据 SQL 语句的配置,进行参数绑定、结果映射等操作。
  6. 关闭 SqlSession,在完成数据库操作后,应用程序需要关闭 SqlSession,释放数据库连接等资源。通常情况下,可以通过 try-with-resources 或手动调用 close() 方法来关闭 SqlSession。

MyBatis的延迟加载

延迟加载(Lazy Loading) 是一种软件设计模式,用于推迟对象或数据的加载直到真正需要使用它们的时候。在软件开发中,延迟加载通常用于优化性能和资源利用,避免不必要的开销和提高用户体验。

在数据库访问中,延迟加载通常指的是将某些数据的加载推迟到需要访问这些数据的时候才进行,而不是在查询时立即加载所有数据。这样做可以减少数据库查询次数,降低系统负载,提高性能。延迟加载通常应用于复杂对象关系的情况,其中某些关联数据不一定需要在每次查询中都被加载,而是根据需要进行加载。

例如:
在这里插入图片描述
Mybatis支持延迟记载,但默认是关闭的,可以在MyBartis的配置文件中,通过lazyLoadingEnabled=true|false进行设置。

MyBatis 支持两种类型的延迟加载:

  1. 关联对象延迟加载

    • 当一个对象关联了其他对象(一对一、一对多等关系),并且配置为延迟加载时,MyBatis 会在访问该关联对象时才真正执行相关的查询操作,将关联对象加载到内存中。
  2. 集合延迟加载

    • 当一个对象关联了一个集合对象(一对多关系),并且配置为延迟加载时,MyBatis 会在访问该集合对象时才真正执行相关的查询操作,将集合加载到内存中。

延迟加载的实现原理通常是使用代理对象,在对象的属性被访问时触发数据库查询。它的配置通常在 MyBatis 映射文件(XxxMapper.xml)中进行,可以通过以下方式实现延迟加载:

<association property="associationProperty" select="selectStatement" fetchType="lazy" />
<collection property="collectionProperty" select="selectStatement" fetchType="lazy" />

其中,associationcollection 标签用于指定延迟加载的对象或集合,select 属性指定了延迟加载时执行的查询语句,fetchType="lazy" 则指定了延迟加载的方式为懒加载。
需要注意的是,延迟加载必须依赖于外部事务或连接,因此在延迟加载期间,相关的数据库连接必须保持打开状态。在使用延迟加载时,开发人员需要谨慎处理事务的管理,以避免可能的资源泄露或数据不一致。

延迟加载的原理:

  1. 使用CGLIB创建目标对象的代理对象
  2. 当调用目标方法user.getOrderList()时,进入拦截器invoke方法,发现user.getOrderList()是null值,执行sql查询order列表
  3. 获取到数据后,然后调用user.setOrderList(List orderList) ,接着完成user.getOrderList()方法的调用

在这里插入图片描述

MyBatis的缓存

MyBatis 提供了一级缓存和二级缓存两种缓存机制,用于提高数据库访问性能。这些缓存可以在适当的情况下存储已经查询过的数据,以避免重复查询数据库,提高系统性能。

一级缓存是 MyBatis 默认开启的,它是基于 SqlSession 对象的缓存,也就是说,只有在同一个 SqlSession 内执行的查询可以共享一级缓存。一级缓存存储在 SqlSession 的生命周期内,当调用 commit()close()clearCache() 等方法时会清空一级缓存。

一级缓存的特点包括:

  • 作用范围:只在当前 SqlSession 内有效,不同的 SqlSession 之间不共享缓存。
  • 生命周期:与 SqlSession 的生命周期一致,当 SqlSession 关闭时缓存也会失效。
  • 自动管理:MyBatis 会自动管理一级缓存,无需手动配置。

二级缓存是一个跨 SqlSession 的缓存,它可以被多个 SqlSession 共享,即它的作用域是namespace和mapper的作用域,不依赖于session。当多个 SqlSession 查询相同的数据时,如果开启了二级缓存,则第一个查询结果会被缓存起来,后续的查询可以直接从缓存中获取数据,而不需要再次查询数据库。

二级缓存的特点包括:

  • 作用范围:跨 SqlSession,可以被多个 SqlSession 共享。
  • 生命周期:缓存在整个应用程序的生命周期内有效,需要手动配置并在需要时开启。
  • 需要序列化支持:由于二级缓存需要跨 SqlSession 进程共享数据,因此缓存的数据需要支持序列化。

配置二级缓存:

  1. 在 MyBatis 的配置文件中开启二级缓存:

    <settings>
        <setting name="cacheEnabled" value="true"/>
    <\settings>
    
  2. 映射文件中配置需要使用二级缓存的语句:

    <mapper namespace="com.example.mapper.UserMapper">
        <cache/>
        <!-- 或者在具体的 select 语句上添加 <cache/> 标签 -->
    </mapper>
    

MyBatis 的缓存机制能够有效地提高数据库访问性能,一级缓存适用于单个 SqlSession 内的缓存需求,而二级缓存适用于多个 SqlSession 之间共享数据的缓存需求。

注意:

  1. 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear
  2. 二级缓存需要缓存的数据实现Serializable接口
  3. 只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

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

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

相关文章

Visual Studio QT6 工程引入组件模块,例如:QtXml

QT 工程引入 QtXml QT 版本 6.6.1 Visual Studio 版本 Microsoft Visual Studio Community 2022 (64 位) - Current 版本 17.7.5 打开 Visual Studio 项目工程选择 工具栏 - 扩展 - QT VS Tools -Qt Project Settings 勾选 xml 后点击确定 点击应用即可 注意&#xff1a;配置环…

数字三角形

分析&#xff1a; 由上图可以知道&#xff0c;最大和的路径是7->3->8->7->5 (30)。 题意是一个有N层的三角形&#xff0c;来寻找从顶部到底部&#xff0c;每个数字加起来的最大和。向下移动的过程中&#xff0c;只能向左或右。 我们是找最大的和的&#xff0c;那么…

Mac电脑虚拟显示器:BetterDisplay Pro for Mac v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a;BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

Java数据结构-ArrayList

目录 1. 初识集合框架2. ArrayList的介绍3. ArrayList的使用3.1 构造方法3.2 add3.3 addAll3.4 remove3.5 get3.6 set3.7 contains3.8 IndexOf3.9 lastIndexOf3.10 subList 4. ArrayList的遍历4.1 简单粗暴法4.2 循环遍历法4.3 迭代器 1. 初识集合框架 Java集合框架是Java编程…

【前端面试3+1】01闭包、跨域

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

抖音视频关键词无水印下载软件|手机网页视频批量提取工具

全新视频关键词无水印下载软件&#xff0c;助您快速获取所需视频&#xff01; 随着时代的发展&#xff0c;视频内容已成为人们获取信息和娱乐的重要途径。为了方便用户获取所需视频&#xff0c;推出了一款功能强大的视频关键词无水印下载软件。该软件主要功能包括关键词批量提取…

【经验分享||快速解决】VScode+Python配置Selenium环境配置问题。ERROR: Cannot uninstall ‘certifi‘.

目录 正常安装遇到的问题 当在控制台输入pip install selenium时候&#xff0c;遇到的问题如下&#xff1a; 主要爆红的问题为 解决办法和正确安装方法 降低selenium的版本即可 在vscode控制台输入上面的代码即可。 总结 正常安装遇到的问题 当在控制台输入pip instal…

基于nodejs+vue发艺美发店管理系统python-flask-django-php

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

文件编辑命令—vim

1.vim vim 是vi的升级版本.vi 文件名(vi方向键用不了) vim 的官方网站 (welcome home : vim online) 自己也说 vim 是一个程序开发工具而不是文字处理软件。 2.安装vim sudo apt install vim 如果出错了:apt update:刷新软件源; 出现"无法获得锁 之类的"sudo rm 文件…

8.软件工程

整个章节偏向于记忆、背诵&#xff1b; 主要议题&#xff1a; 软件体系&#xff1a;3层&#xff1b; UML重点&#xff0c;重点记3要素中的关系、图&#xff1b; 1.软件体系结构 分层 优点&#xff1a;利于软件的重复利用&#xff1b; 缺点&#xff1a;以什么方式分层&#…

小迪安全47WEB 攻防-通用漏洞Java 反序列化EXP 生成数据提取组件安全

#知识点&#xff1a; 1、Java 反序列化演示-原生 API 接口 2、Java 反序列化漏洞利用-Ysoserial 使用 3、Java 反序列化漏洞发现利用点-函数&数据 4、Java 反序列化考点-真实&CTF 赛题-审计分析 #内容点&#xff1a; 1、明白-Java 反序列化原理 2、判断-J…

Echarts 利用多X轴实现未来15天天气预报

Echarts 利用多X轴实现未来15天天气预报 UI 设计图 Echarts 实现效果 代码实现 代码分解 echarts 图表上下均显示数据 通过设置 grid.top 和 grid.bottom 设置白天和夜间天气展示区域 grid: {top: 36%,bottom: 36%,left: 5%,right: 5%}, 天气图标的设置 由于 axisLabel 的…

SpringBoot学习之ElasticSearch下载安装和启动(Mac版)(三十一)

本篇是接上一篇Windows版本,需要Windows版本的请看上一篇,这里我们继续把Elasticsearch简称为ES,以下都是这样。 一、下载 登录Elasticsearch官网,地址是:Download Elasticsearch | Elastic 进入以后,网页会自动识别系统给你提示Mac版本的下载链接按钮 二、安装 下载…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一&#xff0c;list 1&#xff0c; list 的节点与迭代器 2&#xff0c;list 的数据结构、一些简单的功能、构造函数 3&#xff0c;list 的对元素操作 4&#xff0c;C 11 的一些功能 5&#xff0c;完整代码&#xff1a; 二&#xff0c;queue 一&#xff0c;list std…

织梦地方php分类信息源码带数据库【附下载】

织梦地方&#xff08;DedeCMS&#xff09;是一款基于PHPMySQL技术的开源内容管理系统&#xff08;CMS&#xff09;。它以其强大的功能、灵活的扩展性和友好的用户界面&#xff0c;成为了众多网站建设者的首选。 在功能方面&#xff0c;织梦地方CMS提供了丰富的模板标签和灵活的…

问卷调查数据分析指南!掌握方法,精准把握用户需求!

“我们可以用自定义报表、交叉报表、自定义过滤器等放方式进行问卷调查数据分析。“ 问卷调查的过程中&#xff0c;问卷设计、问卷分发、问卷收集可能都不是让我们最头疼的。经过几天的奋战&#xff0c;终于拿到了数据&#xff0c;但是问题也随之而来。收集上来的问卷信息&…

word文件如何转PDF格式?word转PDF的方法

在当今数字化时代&#xff0c;文档格式的转换已成为日常生活和工作中不可或缺的一部分。其中&#xff0c;将Word文档转换为PDF格式更是受到了广大用户的青睐。本文将详细介绍Word转PDF的方法&#xff0c;帮助读者轻松实现文档格式的转换&#xff0c;并探讨转换过程中的注意事项…

03-CSS盒模型(padding、margin、opactiy、cursor、display、css3前缀)

一、CSS盒模型 CSS 盒模型规定了处理元素内容、内边距、边框 和 外边距 的方式。最内部分是元素内容&#xff0c;直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距。 1.元素的尺寸: height 设置元素的高度。属性值&#xff1a;auto&am…

用BI来做金蝶的数据分析,真能随时自助分析?

BI数据分析快的事&#xff0c;大家都知道&#xff0c;那用BI来分析金蝶ERP上的数据也很快&#xff0c;也能随时想怎么分析就怎么分析&#xff0c;想分析哪些数据就分析哪些数据吗&#xff1f; 用BI分析金蝶数据&#xff0c;不仅可随时自助分析&#xff0c;还可极大提高分析效率…

Nginx 内存池

目录 零、基本框架 一、基础结构 二、对外接口 三、函数实现 1、ngx_create_pool 2、ngx_destroy_pool 3、ngx_reset_pool 4、ngx_palloc 5、ngx_pnalloc 6、ngx_pmemalign 7、ngx_pfree 8、ngx_pcalloc 9、ngx_pool_cleanup_add 10、ngx_pool_run_cleanup_file…