MyBatis三个经典问题
1. Mybatis的执行流程
MyBatis 是一个流行的 Java 持久化框架,提供了对象关系映射 (ORM) 和 SQL 映射的功能,使开发者能够更加方便地与数据库交互。MyBatis 的执行流程大致如下:
-
配置阶段:
- 加载配置文件: MyBatis 通过读取配置文件(如
mybatis-config.xml
)来初始化。这些配置文件包含数据源(DataSource)信息、事务管理器(TransactionManager)配置、映射文件路径等信息。 - 解析映射文件: MyBatis 加载并解析映射文件(通常是
.xml
文件或通过注解配置的),这些文件定义了 SQL 语句和结果映射规则。
- 加载配置文件: MyBatis 通过读取配置文件(如
-
初始化阶段:
- 构建 SqlSessionFactory: 通过配置信息,MyBatis 构建
SqlSessionFactory
实例,这是一个重要的工厂类,用于创建SqlSession
对象。 - 创建 SqlSession: 开发者通过
SqlSessionFactory
获取SqlSession
实例。SqlSession
是与数据库交互的主要接口,提供了执行 SQL、获取映射器接口等功能。
- 构建 SqlSessionFactory: 通过配置信息,MyBatis 构建
-
执行阶段:
- 获取映射器(Mapper): 通过
SqlSession
获取需要的 Mapper 接口。MyBatis 会动态实现这些接口的实例,开发者可以直接通过这些接口与数据库交互。 - 执行 SQL: 调用 Mapper 接口中定义的方法,MyBatis 会找到对应的 SQL 语句并执行。这些 SQL 语句可以是简单的 CRUD 操作,也可以是复杂的查询。
- 参数处理: 在执行 SQL 之前,MyBatis 会处理方法调用时传递的参数,根据映射文件中的配置将参数映射到 SQL 语句中。
- 执行 SQL 并返回结果: MyBatis 执行 SQL 语句,然后根据映射文件中定义的规则处理结果集,将结果集映射成 Java 对象或对象集合。
- 获取映射器(Mapper): 通过
-
事务管理:
- 事务控制: 在执行 SQL 之前,可以通过
SqlSession
或配置的事务管理器来控制事务的开启、提交或回滚。
- 事务控制: 在执行 SQL 之前,可以通过
-
关闭 SqlSession:
- 资源清理: 使用完
SqlSession
后,需要关闭它以释放资源。这通常在finally
块中完成,确保即使出现异常也能正常关闭资源。
- 资源清理: 使用完
通过这个流程,MyBatis 为 Java 应用程序提供了一个灵活而强大的数据库交互机制,大大简化了数据库操作的复杂性。
2. Mybatis延迟加载的原理
MyBatis 的延迟加载(也称为懒加载)是指在实际需要使用数据时才执行相应的 SQL 语句查询数据库,以提高应用程序的性能和资源利用率。延迟加载主要用于关联关系复杂的对象查询,例如,在查询一个对象时,并不立即加载其关联的其他对象,而是在实际访问这些关联对象时才进行加载。
MyBatis 实现延迟加载的原理主要基于代理模式(Proxy Pattern),具体步骤如下:
-
配置启用延迟加载:首先,在 MyBatis 的配置文件中启用延迟加载特性,并配置相关参数,如延迟加载的触发方法。
-
创建代理对象:当查询操作返回的主对象中包含需要延迟加载的关联对象时,MyBatis 不会立即加载这些关联对象。相反,MyBatis 会为这些关联对象创建一个代理(Proxy)对象。这个代理对象在内部包含了加载实际对象所需的所有信息,如相关的 SQL 语句和参数等。
-
访问关联对象时触发加载:当应用程序第一次尝试访问这些关联对象的任何属性或方法时,代理对象会拦截这个访问请求。然后,代理对象根据保存的 SQL 语句和参数,执行数据库查询,加载实际的关联对象数据。
-
替换代理对象:一旦数据被加载,代理对象会用实际加载的对象替换自己,确保后续对该关联对象的访问是直接对实际对象的访问,而不再需要通过数据库加载。
-
缓存支持:为了提高性能,MyBatis 也会将加载的对象数据缓存起来。如果后续再次访问相同的数据,可以直接从缓存中获取,避免重复的数据库查询。
延迟加载的优点在于能够减少初始化对象时的数据库查询次数,特别是对于那些不一定需要立即使用所有数据的场景,能有效提升应用性能和响应速度。然而,也需要注意,不当的使用延迟加载(如频繁地触发单个属性的加载)可能会导致大量的单独查询,反而降低性能。因此,合理配置和使用延迟加载是提高应用性能的关键。
3. MyBatis的缓存
MyBatis 提供了两级缓存机制:一级缓存(Session级缓存)和二级缓存(Mapper级缓存),用于提高数据库操作的效率和减少数据库访问次数。这两级缓存的工作原理如下:
一级缓存(Session级缓存)
-
作用范围:一级缓存是基于
SqlSession
的,其生命周期与SqlSession
保持一致。在同一个SqlSession
中执行的相同查询语句,第一次查询会从数据库中获取数据,并将查询结果放入缓存中;之后相同的查询可以直接从缓存中获取结果,而不需要再次访问数据库。 -
生命周期:一级缓存的生命周期随着
SqlSession
的开启而开始,随着SqlSession
的关闭而结束。当调用SqlSession
的close
或commit
方法时,一级缓存会被清空。 -
局限性:由于一级缓存是基于
SqlSession
的,所以它仅对当前会话内的数据操作有效。在不同的SqlSession
中相同的数据操作无法共享一级缓存。
二级缓存(Mapper级缓存)
-
作用范围:二级缓存是基于命名空间(Mapper级)的,可以被多个
SqlSession
共享。启用二级缓存后,多个SqlSession
可以共享缓存中的数据,减少数据库的访问次数,提高应用的性能。 -
配置与使用:二级缓存默认是不开启的,需要在 MyBatis 的配置文件中显式开启,并且在需要使用缓存的 Mapper.xml 文件中配置使用二级缓存。此外,对于需要缓存的对象,需要实现序列化接口。
-
生命周期:二级缓存的生命周期由 MyBatis 的缓存策略管理,通常随着应用程序的启动而创建,随着应用程序的停止而销毁。在执行
commit
或close
操作时,修改过的数据会刷新到二级缓存中。 -
缓存策略:MyBatis 允许自定义二级缓存的策略,开发者可以根据应用的需求选择合适的缓存实现,例如 Ehcache、Redis 等。
缓存的考虑因素
-
数据一致性:缓存数据与数据库中实际数据的一致性是使用缓存时需要考虑的重要因素。在多用户并发操作的环境下,需要合理配置和使用缓存,以避免数据过时的问题。
-
性能与资源:虽然缓存可以提高应用性能,减少数据库访问次数,但也会占用更多的内存资源。因此,在使用缓存时需要权衡性能提升和资源消耗。
通过合理使用一级缓存和二级缓存,可以显著提高 MyBatis 应用的性能和效率。然而,正确配置和管理缓存也是非常关键的,以确保数据的准确性和应用的高效运行。
相关文章:
MyBatis三个经典问题
1. Mybatis的执行流程 MyBatis 是一个流行的 Java 持久化框架,提供了对象关系映射 (ORM) 和 SQL 映射的功能,使开发者能够更加方便地与数据库交互。MyBatis 的执行流程大致如下: 配置阶段: 加载配置文件: MyBatis 通过读取配置文件ÿ…...

JavaEE+springboot教学仪器设备管理系统o9b00-springmvc
本文旨在设计一款基于Java技术的教学仪器设备销售网站,以提高网站性能、功能完善、用户体验等方面的优势,解决现有教学仪器设备销售网站的问题,并为广大教育工作者和学生提供便捷的教学仪器设备销售渠道。本文首先介绍了Java技术的相关基础知…...

Java项目:37 springboot003图书个性化推荐系统的设计与实现
作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 springboot003图书个性化推荐系统的设计与实现 管理员:首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退…...
mysql 8 修改账号密码
一 进入Mysql bin目录 cmd 运行(跳过密码),运行完不要关闭 mysqld --console --skip-grant-tables --shared-memory 二 新打开一个cmd mysql bin 目录下登录,密码输入时,直接回车 mysql -uroot -p 三 修改密码 m…...
拜占庭将军问题与区块链
文章目录 拜占庭将军问题问题背景问题的现实意义将军-副官模型三将军问题四将军问题3m将军问题 口头消息算法基本假设方法介绍正确性证明 签名消息算法 区块链区块链是什么区块链对于拜占庭将军问题的解决方法工作量证明奖励机制最长链原则小结 区块链的意义 总结 拜占庭将军问…...

字节跳动热门的前端开源项目
字节跳动开源官网 Arco Dsign Arco Design 是一套设计系统,主要服务于字节跳动旗下中后台产品的体验设计和技术实现。它的目标在于帮助设计师与开发者解放双手、提升工作效率,并高质量地打造符合业务规范的中后台应用。它拥有系统的设计规范和资源&…...

uniapp+vue基于Android的图书馆借阅系统qb4y3-nodejs-php-pyton
uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/django/php/Ssm/flask/express均支持 前端开发:vue 语言:pythonjavanode.jsphp均支持 运行软件:idea/eclip…...

RabbitMQ如何实现延迟消息?
RabbitMQ中是可以实现延迟消息的,一般有两种方式,分别是通过死信队列以及通过延迟消息插件来实现。 扩展: 死信队列 当rabbitMQ中的一条正常的消息,因为过了存活时间(TTL过期),队列长度超限&a…...

Svg Flow Editor 原生svg流程图编辑器(一)
效果展示 项目概述 svg flow editor 是一款流程图编辑器,提供了一系列流程图交互、编辑所必需的功能,支持前端研发自定义开发各种逻辑编排场景,如流程图、ER 图、BPMN 流程等。 目前也有比较好的流程图设计框架,但是还是难满足项目…...

头像剪切上传
头像剪切上传 文章说明核心Api示例源码效果展示源码下载 文章说明 本文主要为了学习头像裁剪功能,以及熟悉canvas绘图和转文件的相关操作,参考教程(Web渡一前端–图片裁剪上传原理) 核心Api 主要就一个在canvas绘图的操作 context…...
24计算机考研调剂 | 北京信息科技大学
北京信息科技大学接收调剂研究生 考研调剂招生信息 学校:北京信息科技大学 专业:工学->控制科学与工程->控制理论与控制工程 年级:2024 招生人数:- 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 各位同学,…...

06 - 镜像管理
1 了解镜像 Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 但注意, 镜像不包含任何动态数据&#…...

最简单 导航栏 html css
dhl.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><link type"text/css" rel"stylesheet" href"css/dhl.css"></head><div class"dhl&quo…...
PostgreSQL的学习心得和知识总结(一百三十一)|深入理解PostgreSQL数据库如何使用psql中的变量
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库链接,点击前往 4、日本著名PostgreSQL数据库专家 铃木启修 网站…...

支付宝小程序模板开发,实现代小程序备案申请
大家好,我是小悟 支付宝小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一…...
怎么培养孩子的学习习惯?
问:在亲子阅读中,应该用哪些方法引导孩子自己主动阅读呢? 有很多家长会问如何培养孩子主动阅读的兴趣? 我想给你四个词来分享,分别是环境、选择的权利、适龄,还有增强回路。第一个环境,就是把…...

deeplearning with pytorch (三)
一.基本概念 1.Convolutional Neural Network Intro mnist数据集 2.Image Filter / Image Kernel Image Kernels explained visually 访问这个网站可以直观看到image kernels对图片的影响 3.Convolutional Layer and RGB 为什么要用巻积神经网络代替人工神经网络 上图是…...
LLaMA模型的发布与创新潮流
时间线从2023年2月24日开始,Meta推出了LLaMA模型,虽然开源了代码,却没有开源模型权重。LLaMA模型可以说是相对较小的,拥有7B、13B、33B和65B参数的几种版本,训练时间相对较长,因此相对于其大小而言能力强大…...

Python之Web开发初学者教程—ubuntu中安装配置redis
Python之Web开发初学者教程—ubuntu中安装配置redis 准备环境:VMWare,ubuntu18.04.6 LTS 一、安装 从 Ubuntu 存储库安装 Redis,打开Ubuntu的终端,输入下面的命令: sudo apt-get install redis-server (…...

如何在Vue中进行单元测试?
前端开发中,单元测试是一个非常重要的环节,它可以帮助我们在开发过程中发现潜在的问题,并确保我们的代码在不断迭代的过程中依然能够保持稳定。在Vue中进行单元测试同样非常重要,本文将介绍如何在Vue项目中进行单元测试。 在Vue中…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...