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中…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...