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中…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
