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中…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
