MyBatis三个经典问题

1. Mybatis的执行流程

MyBatis 是一个流行的 Java 持久化框架,提供了对象关系映射 (ORM) 和 SQL 映射的功能,使开发者能够更加方便地与数据库交互。MyBatis 的执行流程大致如下:

  1. 配置阶段:

    • 加载配置文件: MyBatis 通过读取配置文件(如 mybatis-config.xml)来初始化。这些配置文件包含数据源(DataSource)信息、事务管理器(TransactionManager)配置、映射文件路径等信息。
    • 解析映射文件: MyBatis 加载并解析映射文件(通常是 .xml 文件或通过注解配置的),这些文件定义了 SQL 语句和结果映射规则。
  2. 初始化阶段:

    • 构建 SqlSessionFactory: 通过配置信息,MyBatis 构建 SqlSessionFactory 实例,这是一个重要的工厂类,用于创建 SqlSession 对象。
    • 创建 SqlSession: 开发者通过 SqlSessionFactory 获取 SqlSession 实例。SqlSession 是与数据库交互的主要接口,提供了执行 SQL、获取映射器接口等功能。
  3. 执行阶段:

    • 获取映射器(Mapper): 通过 SqlSession 获取需要的 Mapper 接口。MyBatis 会动态实现这些接口的实例,开发者可以直接通过这些接口与数据库交互。
    • 执行 SQL: 调用 Mapper 接口中定义的方法,MyBatis 会找到对应的 SQL 语句并执行。这些 SQL 语句可以是简单的 CRUD 操作,也可以是复杂的查询。
    • 参数处理: 在执行 SQL 之前,MyBatis 会处理方法调用时传递的参数,根据映射文件中的配置将参数映射到 SQL 语句中。
    • 执行 SQL 并返回结果: MyBatis 执行 SQL 语句,然后根据映射文件中定义的规则处理结果集,将结果集映射成 Java 对象或对象集合。
  4. 事务管理:

    • 事务控制: 在执行 SQL 之前,可以通过 SqlSession 或配置的事务管理器来控制事务的开启、提交或回滚。
  5. 关闭 SqlSession:

    • 资源清理: 使用完 SqlSession 后,需要关闭它以释放资源。这通常在 finally 块中完成,确保即使出现异常也能正常关闭资源。

通过这个流程,MyBatis 为 Java 应用程序提供了一个灵活而强大的数据库交互机制,大大简化了数据库操作的复杂性。

2. Mybatis延迟加载的原理

MyBatis 的延迟加载(也称为懒加载)是指在实际需要使用数据时才执行相应的 SQL 语句查询数据库,以提高应用程序的性能和资源利用率。延迟加载主要用于关联关系复杂的对象查询,例如,在查询一个对象时,并不立即加载其关联的其他对象,而是在实际访问这些关联对象时才进行加载。

MyBatis 实现延迟加载的原理主要基于代理模式(Proxy Pattern),具体步骤如下:

  1. 配置启用延迟加载:首先,在 MyBatis 的配置文件中启用延迟加载特性,并配置相关参数,如延迟加载的触发方法。

  2. 创建代理对象:当查询操作返回的主对象中包含需要延迟加载的关联对象时,MyBatis 不会立即加载这些关联对象。相反,MyBatis 会为这些关联对象创建一个代理(Proxy)对象。这个代理对象在内部包含了加载实际对象所需的所有信息,如相关的 SQL 语句和参数等。

  3. 访问关联对象时触发加载:当应用程序第一次尝试访问这些关联对象的任何属性或方法时,代理对象会拦截这个访问请求。然后,代理对象根据保存的 SQL 语句和参数,执行数据库查询,加载实际的关联对象数据。

  4. 替换代理对象:一旦数据被加载,代理对象会用实际加载的对象替换自己,确保后续对该关联对象的访问是直接对实际对象的访问,而不再需要通过数据库加载。

  5. 缓存支持:为了提高性能,MyBatis 也会将加载的对象数据缓存起来。如果后续再次访问相同的数据,可以直接从缓存中获取,避免重复的数据库查询。

延迟加载的优点在于能够减少初始化对象时的数据库查询次数,特别是对于那些不一定需要立即使用所有数据的场景,能有效提升应用性能和响应速度。然而,也需要注意,不当的使用延迟加载(如频繁地触发单个属性的加载)可能会导致大量的单独查询,反而降低性能。因此,合理配置和使用延迟加载是提高应用性能的关键。

3. MyBatis的缓存

MyBatis 提供了两级缓存机制:一级缓存(Session级缓存)和二级缓存(Mapper级缓存),用于提高数据库操作的效率和减少数据库访问次数。这两级缓存的工作原理如下:

一级缓存(Session级缓存)

  • 作用范围:一级缓存是基于 SqlSession 的,其生命周期与 SqlSession 保持一致。在同一个 SqlSession 中执行的相同查询语句,第一次查询会从数据库中获取数据,并将查询结果放入缓存中;之后相同的查询可以直接从缓存中获取结果,而不需要再次访问数据库。

  • 生命周期:一级缓存的生命周期随着 SqlSession 的开启而开始,随着 SqlSession 的关闭而结束。当调用 SqlSessionclosecommit 方法时,一级缓存会被清空。

  • 局限性:由于一级缓存是基于 SqlSession 的,所以它仅对当前会话内的数据操作有效。在不同的 SqlSession 中相同的数据操作无法共享一级缓存。

二级缓存(Mapper级缓存)

  • 作用范围:二级缓存是基于命名空间(Mapper级)的,可以被多个 SqlSession 共享。启用二级缓存后,多个 SqlSession 可以共享缓存中的数据,减少数据库的访问次数,提高应用的性能。

  • 配置与使用:二级缓存默认是不开启的,需要在 MyBatis 的配置文件中显式开启,并且在需要使用缓存的 Mapper.xml 文件中配置使用二级缓存。此外,对于需要缓存的对象,需要实现序列化接口。

  • 生命周期:二级缓存的生命周期由 MyBatis 的缓存策略管理,通常随着应用程序的启动而创建,随着应用程序的停止而销毁。在执行 commitclose 操作时,修改过的数据会刷新到二级缓存中。

  • 缓存策略:MyBatis 允许自定义二级缓存的策略,开发者可以根据应用的需求选择合适的缓存实现,例如 Ehcache、Redis 等。

缓存的考虑因素

  • 数据一致性:缓存数据与数据库中实际数据的一致性是使用缓存时需要考虑的重要因素。在多用户并发操作的环境下,需要合理配置和使用缓存,以避免数据过时的问题。

  • 性能与资源:虽然缓存可以提高应用性能,减少数据库访问次数,但也会占用更多的内存资源。因此,在使用缓存时需要权衡性能提升和资源消耗。

通过合理使用一级缓存和二级缓存,可以显著提高 MyBatis 应用的性能和效率。然而,正确配置和管理缓存也是非常关键的,以确保数据的准确性和应用的高效运行。

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

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

相关文章

蓝桥杯2013年-幸运数(C语言-链表模拟)

题目描述 幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成 。 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数。 我们从2这个数开始。把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... 把…

支付宝小程序模板开发,实现代小程序备案申请

大家好,我是小悟 支付宝小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一…

Docker入门——安装部署(openEuler)、镜像加速

安装 1)依赖的基础环境 64 位CPU Linux kernel(内核) 3.10 Linux kernel cgroups and namespaces 我用的是openEuler,所以直接yum安装(推荐,因为二进制安装,docker命令中补全操作要另外安装软件) [rootlocalhost ~]# yum -y…

【AIGC调研系列】DevOps过程中依靠AIGC提升效率的具体实例

在DevOps过程中利用AIGC提升效率的具体实例包括: 智能排查流水线错误:云效工程师们与阿里云通义大模型合作,通过基于AIGC的工具辅助流水线错误排查,提高了DevOps流水线运行的效率和准确性[5]。自动化编程提高研发效率&#xff1a…

「经验」在博途中 是否可以在 LAD与STL 语言之间进行切换

用惯了STEP7,准确来说是SIMATIC Manager进行编程开发的同学,在转战TIA portal后,通常会经历一段“晦涩”的过度期,包括指令库的微小变动、工作界面的大改等等。 又比如:“在博途中,怎么快速切换LAD与STL语…

NVMe管理命令为何不用SGL?-2

在IO数据传输中,是否选择SGL可以根据自身场景的需要。SGL提供的是一种高效且灵活的方式来描述非连续的内存区域,这对于现代高性能存储系统至关重要,尤其是在处理大数据块或者随机小I/O操作时具有明显优势: 高效的数据传输&#xf…

课题学习(二十)----阅读《近钻头井斜动态测量重力加速度信号提取方法研究》论文

摘要:利用加速度计进行近钻头井斜动态测量时, 钻具的高速旋转、 井下强振动、强冲击环境给重力加速度测量带来极大干扰,如何从干扰噪声中有效提取重力加速度信号对于提高井斜角和工具面角的测量精度至关重要。 根据重力加速度径向和切向分量为…

【代码随想录】day1 数组

因为学计算机语言是属于半路出家,在接触数据结构之前,我只了解数据的类型,从没有了解过不同数据类型的存储方式。数组、链表等等因为不同的存储方式,展现出不同的优缺点,以适应不同的用途。 代码随想录是属于把饭喂到嘴…

Altium Designer 22 性能优化

目录 AD22 使用起来很卡,完全受不了,卡到我的快捷鼠标宏都无法使用,来试着优化一下它。 每点完一步,都需要点击应用,否则不下心关掉了会很难受 打开右上角齿轮进入设置,取消勾选这几个勾: 接…

java spring 03 启动细节

spring启动类ClassPathXmlApplicationContext,读取xml文件并且创建bean public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(confi…

oracle 表中的rowid会变动吗

oracle中访问select能够以最快的方式访问表中的一行的方法就是使用rowid,但是我们并不能使用rowid作为表主键。 在Oracle数据库中,ROWID是一个伪列,用于唯一标识表中的每一行记录。它起着几个关键的作用: 唯一标识:ROWID可以唯一…

python 亲测有效:无法连接互联网,离线部署python运行环境与安装包

**这里写目录标题** 安装包准备-在网络条件下下载所需要的第三方库安装包一、提取第三方库目录到requirements.txt二、批量下载requirements.txt的whl文件 安装包复制到无网络条件下,安装第三方库安装包**可能存在的问题 报错信息,欢迎私信,指…

android开发框架mvp,Android面试心得必备技能储备详解

面试复习路线图 我之前复习,大多都在20点以后,因为晚上比较能集中注意力,制定一个学习计划,切勿零散的复习,最好是系统的复习,才能胜却在握 主要内容如下: BAT的面试题目相关性能优化相关相关…

Qt之插件

插件结构 #mermaid-svg-HMxjwDgwwRejLSQ5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HMxjwDgwwRejLSQ5 .error-icon{fill:#552222;}#mermaid-svg-HMxjwDgwwRejLSQ5 .error-text{fill:#552222;stroke:#552222;}#…

算法设计.

文章目录 1. 贪心算法:只看当前1.1 零钱兑换问题:力扣322 2. 活动选择问题3. 动态规划3.1 不同路径:3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列6. 最长递增子序列7. 打家劫舍8. 全排…

事务、视图、索引、数据备份和恢复

1.事务 事务(TRANSACTION)是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库操作命令要么都执行,要么都不执行。 事务是一个不…

信息熵 (Entropy)

在深度学习和机器学习中,熵是一个衡量不确定性或信息量的关键概念。它在各个方面发挥着作用,从数据的压缩和分布的特性分析,到模型的正则化和决策过程的优化。以下是熵在深度学习中的一些关键知识点: 信息熵 (Entropy) 信息熵是…

04. Nginx入门-Nginx WEB模块

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…

如何使用宝塔面板部署MySQL数据库,并结合内网穿透实现固定公网地址远程连接

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.1 开放局域网端口3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几…

Android drawable selector

Android drawable selector 描述使用备份背景颜色 描述 Android 可绘制选择器(drawable selector)是一种可根据不同状态显示不同可绘制对象的 XML 资源。它通常用于实现按钮、列表项等控件的状态变化效果。 可绘制选择器的基本结构 一个可绘制选择器由…