【MyBatis】 框架原理
目录
10.3【MyBatis】 框架原理
10.3.1 【MyBatis】 整体架构
10.3.2 【MyBatis】 运行原理
10.4 【MyBatis】 核心组件的生命周期
10.4.1 SqlSessionFactoryBuilder
10.4.2 SqlSessionFactory
10.4.3 SqlSession
10.4.4 Mapper Instances
与 Hibernate 框架相比,MyBatis 学习成本相对较低。在 MyBatis 中,SQL语句是单独存放在 XML 文件中的,这样使得 SQL 语的修改和优化比较方便,使用MyBatis 框架也变得较为灵活,因而,MyBatis 框架可适用于需求变化较多的项目。使用 MyBatis 框架可以让程序员集中精力于 SOL 语句的开发上。当前互联网电商项目多使用 MyBatis 作为持久层框架,这样不仅增强了灵活性,还可以提高数据库访问的速度。
10.3.1 【MyBatis】 整体架构
MyBatis 整体架构可分为以下3层:接口层、核心处理层和基础支撑层。
(1)接口层:其核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API,也就是上层应用与 MyBatis 交的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。
(2)核心处理层:在核心处理层中实现了 MyBatis 的核心处理流程其中包括MyBatis 的初始化以及完成一次数据库操作涉及的全部流程。核心处理层实现的主要功能有配置解析、SOL 解析、参数映射、SOL 执行、结果集映射等。
(3)基础支撑层:包含整个 MyBatis 的基础模块,为核心处理层的功能提供了良好的支撑。其主要模块有反射模块、类型转换模块、日志模块、事务管理模块、缓存模块、解析器模块、资源加载模块、数据源模块等。
10.3.2 【MyBatis】 运行原理
每一个 MyBatis 应用都以一个 SqlSessionFactory 实例为中心,SqlSessionFactory 的生命周期应存在于整个 MyBatis 应用,与此 MyBatis 应用共存亡。SqlSessionFactory 的作用是创建 SqlSession 接口对象。SqlSessionFactory 实例可以通过 SqlSessionFactoryBuilder 类的 build 方法来获得。具体来说,在 SqlSessionFactoryBuilder 类的 build 方法中通过解析 XML 配置文件或者只使用代码(本质上都是先构建 Configuration 对象)来构建 SqlSessionFactory 实例这里使用了建造者模式(Builder Patem)。在前面的示例 mybatis_first_demo 工程中,是通过 XML 文件(配置文件和映射文件来构建 SqlSessionFactory 对象的,而以下的代码是不借助 XML 文件而只使用代码来创建 SqlSessionFactory 的实例。
//这里是关于DataSource对象的构建,此处代码略
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development",transactionFactory,datasource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(StudentMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
MyBatis 使用 SqlSession 对象来封装对数据库的一次会话访问通过 SqlSession 对象实现事务的控制和数据查询。SqlSession 包含了执行 SQL 所需要的所有方法可以通过 SqlSession 实例直接运行映射的 SOL 语句,完成对数据的增、删、改、查和事务提交等(其中,增、删改操作要执行 commit 操作),事务提交后,关闭 SqlSession。MyBatis 的整个执行流程如图10-4 所示。

图10-4 MyBatis 的执行流程
以下是添加 student 表中一条记录的示例代码,用以说明 MyBatis 的执行流程。这里为了简单起见,没有在 insertStudentTest() 方法中处理异常(捕捉异常)而是在定义 insertStudentTest() 方法时抛出异常,表明异常处理是由调用 insertStudentTest() 方法的方法来处理的。
public void insertUserTest throws Exception {// 1. 读取配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 2. 根据配置文件创建 sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3. 通过 SqlSessionFactory 获得 SqlSession 接口对象// 获得会话,事务处理开始SqlSession sqlSession=sqlSessionFactory.opSession();// 4. 通过 SqlSession 接口对象获得 StudentMapper 实例StudentMapper mapper = session.getMapper(StudentMapper.class);// 这里设置的 Student 对象作为执行 SQL 语句的参数// StudentMapper 接口中声明的方法: publicint addStudent(Student student);// addStudent(Student student) 方法映射相应的 SQL 语句Student student = new Student();student.setSno("20171622");student.setName("李白");student.setAge(88);student.setSex("男");// 5. StudentMapper 实例执行映射的 SQL 语句,并返回映射结果mapper.ddStudent(student);// 切记:增、删、改操作时,要执行 commit 操作sqlSession.commit();// 6. 关闭 SqlSession();sqlSession.close();}
需要强调的是,SqlSession 的 getMapper 方法是联系应用程序和 MyBatis 的纽带,应用程序访问 getMapper 时,MyBatis 会根据传入的接口类型和对应的 XML 配置文件生成一个代理对象,这个代理对象就称为 Mapper 对象。应用程序获得 Mapper 对象后,就通过它来访问数据库。
10.4 【MyBatis】 核心组件的生命周期
10.4.1 SqlSessionFactoryBuilder
一旦通过 SqlSessionFactoryBuilder 创建了 SqlSessionFactory,SqlSessionFactoryBuilder 就不需要存在了。因此,SqlSessionFactoryBuilder 实例的最佳生命周期是只存在于创建 SqlSessionFactory 方法中(即本地方法变量)。
10.4.2 SqlSessionFactory
SqlSessionFactory 实例一旦被创建,应该在开发者的应用程序执行期间都存在。倘若SqlSessionFactory 实例在应用程序运行期间被重复创建多次这样的代码会被出“腐化软件的气味”。关于 SqlSessionFactory 实例的创建,可以考虑使用单例模式静态单例模式或者依赖注入。
10.4.3 SqlSession
SqlSession 是一个会话,相当于 JDBC 的一个 Connection 对象,它的生命周期应该是在请求数据库处理事务的过程中。每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能共享使用,它也是线程不安全的。因此,其最佳的存在范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态字段甚至是实例字段中,也不能将 SqlSession 实例的引用放在任何类型的管理范围中如 Servlet 框架的 HttpSession 对象中如果现在正使用某种 Web 框架,则要考虑将 SqlSession 放在一个和 HTTP 请求对象相似的范围内。换句话说,收到 HTTP 请求后,开发者可以打开一个 SqlSession,但返回响应后就要关闭它。关闭 Session 很重要,应该确保使用 finally 块来关闭。
10.4.4 Mapper Instances
映射器是用来绑定映射语句的接口。映射器接口对象可以从 SalSession 中获得。从技术上来说,当被请求时,任意映射器对象的生存最大范围与 SqlSession 对象是相同的。不管怎样,映射器对象的生存最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。例如:
SqlSeesion session=sqlSessionFactory.openSession();
try {BologMapper mapper=session.getMapper(BlogMapper.class);// do work
} finally {session.close()
}
相关文章:
【MyBatis】 框架原理
目录 10.3【MyBatis】 框架原理 10.3.1 【MyBatis】 整体架构 10.3.2 【MyBatis】 运行原理 10.4 【MyBatis】 核心组件的生命周期 10.4.1 SqlSessionFactoryBuilder 10.4.2 SqlSessionFactory 10.4.3 SqlSession 10.4.4 Mapper Instances 与 Hibernate 框架相比&#…...
三、线性工作流
再生产的各个环节,正确使用gamma编码及gamma解码,使得最终得到的颜色数据与最初输入的物理数据一致。如果使用gamma空间的贴图,在传给着色器前需要从gamma空间转到线性空间。 如果不在线性空间下进行渲染,会产生的问题:…...
2023华数杯数学建模A题思路 - 隔热材料的结构优化控制研究
# 1 赛题 A 题 隔热材料的结构优化控制研究 新型隔热材料 A 具有优良的隔热特性,在航天、军工、石化、建筑、交通等 高科技领域中有着广泛的应用。 目前,由单根隔热材料 A 纤维编织成的织物,其热导率可以直接测出;但是 单根隔热…...
Zabbix分布式监控Web监控
目录 1 概述2 配置 Web 场景2.1 配置步骤2.2 显示 3 Web 场景步骤3.1 创建新的 Web 场景。3.2 定义场景的步骤3.3 保存配置完成的Web 监控场景。 4 Zabbix-Get的使用 1 概述 您可以使用 Zabbix 对多个网站进行可用性方面监控: 要使用 Web 监控,您需要定…...
PHP从入门到精通—PHP开发入门-PHP概述、PHP开发环境搭建、PHP开发环境搭建、第一个PHP程序、PHP开发流程
每开始学习一门语言,都要了解这门语言和进行开发环境的搭建。同样,学生开始PHP学习之前,首先要了解这门语言的历史、语言优势等内容以及了解开发环境的搭建。 PHP概述 认识PHP PHP最初是由Rasmus Lerdorf于1994年为了维护个人网页而编写的一…...
【LeetCode-中等】722. 删除注释
题目链接 722. 删除注释 标签 字符串 步骤 Step1. 先将source合并为一个字符串进行处理,中间补上’\n’,方便后续确定注释开始、结束位置。 string combined; for (auto str : source) {combined str "\n"; }Step2. 定义数组 toDel&am…...
rust里如何判断字符串是否相等呢?
在 Rust 中,有几种方法可以判断字符串是否相等。下面是其中几种常见的方法: 使用 运算符:可以直接使用 运算符比较两个字符串是否相等。例如: fn main() {let str1 "hello";let str2 "world";if str1 …...
python基本知识学习
一、输出语句 在控制台输出Hello,World! print("Hello,World!") 二、注释 单行注释:以#开头 # print("你好") 多行注释: 选中要注释的代码Ctrl/三单引号三双引号 # print("你好") # a1 # a2 print("Hello,World!&…...
vue3和typescript_组件
1 components下新建myComponent.vue 2 页面中引入组件,传入值,并且绑定事件函数。 3...
Qt+联想电脑管家
1.自定义按钮类 效果: (1)仅当未选中,未悬浮时 (2)其他三种情况,均如图 #ifndef BTN_H #define BTN_H#include <QPushButton> class btn : public QPushButton {Q_OBJECT public:btn(QWidget * parent nullptr);void set_normal_icon(…...
论文阅读-BotPercent: Estimating Twitter Bot Populations from Groups to Crowds
目录 摘要 引言 方法 数据集 BotPercent架构 实验结果 活跃用户中的Bot数量 Bot Population among Comment Sections Bot Participation in Content Moderation Votes Bot Population in Different Countries’ Politics 论文链接:https://arxiv.org/pdf/23…...
用于永磁同步电机驱动器的自适应SDRE非线性无传感器速度控制(MatlabSimulink实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建 qt
Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含:录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署,免费售…...
删除注释(力扣)
删除注释 题目 给一个 C 程序,删除程序中的注释。这个程序source是一个数组,其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。 在 C 中有两种注释风格,行内注释和块注释。 字符串// 表示行注释,表示//和其右侧…...
阿里云AK创建
要在阿里云上创建 Access Key(AK),您需要按照以下步骤进行操作: 登录到阿里云控制台([https://www.aliyun.com/?utm_contentse_1014243503))。 点击右上方的主账号,点击“AccessKey管理”。 …...
OC与Swift的相互调用
OC调用Swift方法 1、在 Build Settings 搜索 Packaging ,设置 Defines Module 为 YES 2、新建 LottieBridge.swift 文件,自动生成桥 ProductName-Bridging-Header.h 3、在 LottieBridge.swift 中,定义Swift类继承于OC类,声明 obj…...
某银行软件测试笔试题
(时间90分钟,满分100分) 考试要求:计算机相关专业试题 一、填空题(每空1分,共10分) 1. ______验证___是保证软件正确实现特定功能的一系列活动和过程。 2. 按开发阶段分,软件测试可…...
SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring MVC入门 一、Spring MVC概述二、入门案例2.1导入Sp…...
一文说清楚支付架构
作者:陈斌 支付的技术架构是为了保障能够顺利处理支付请求而设计的结构体系。从系统的角度看,它包括了计算机系统的软件、硬件、网络和数据等。从参与的主体角度来看,它涉及交易的付款方、收款方、支付机构、银行、卡组织和金融监管机构等。要…...
【Golang 接口自动化00】为什么要用Golang做自动化?
目录 为什么使用Golang做自动化 最终想实现的效果 怎么做? 写在后面 资料获取方法 为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后,因为没有太多时间和项目来实践,怕止步于此、步Java缺少练习遗忘殆尽的后尘,决定…...
名包名表回收门店有哪些
在奢侈品市场日益繁荣的当下,名包名表回收需求也日益增长。不少人都想了解有哪些名包名表回收门店,下面为大家详细介绍。市场常见回收门店类型市场上的名包名表回收门店主要有连锁门店和个体小店。连锁门店通常具有统一的品牌形象和服务标准,…...
MSP430与MMC/SD卡SPI通信实现与优化
1. MSP430与MMC/SD卡SPI通信概述在嵌入式系统开发中,外扩存储设备是常见需求。MSP430系列微控制器通过SPI接口与MMC/SD卡通信,为数据采集、日志记录等应用提供了可靠的存储解决方案。SPI(Serial Peripheral Interface)作为一种同步…...
别再盲目升级GPU!92%的代码生成延迟其实源于AST解析器阻塞——一线大厂内部性能压测文档首次公开
第一章:智能代码生成性能优化技巧 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成模型(如基于LLM的Copilot类工具)在实际工程落地中常面临响应延迟高、上下文吞吐低、生成结果不稳定等问题。优化其端到端性能需兼顾推理效率、缓…...
ESP32驱动0.96寸OLED屏,从C51代码移植到ESP-IDF的保姆级避坑指南
ESP32驱动0.96寸OLED屏:从C51到ESP-IDF的完整移植指南 当我们需要在ESP32项目中使用0.96寸OLED显示屏时,往往会遇到一个常见问题:手头只有基于C51单片机的驱动代码(比如淘宝卖家提供的例程),如何将其移植到…...
PADS新手避坑指南:三种获取PCB封装的实战方法,别再傻傻画半天了
PADS新手避坑指南:三种获取PCB封装的实战方法,别再傻傻画半天了 刚接触PADS的工程师常会遇到这样的困境:面对一个需要封装的元件,要么花几小时从头绘制,要么在茫茫库文件中迷失方向。实际上,高效获取PCB封装…...
大模型、Agent、Skill与OpenClaw如何重塑智能体验?
本文深入解析了AI领域的关键概念:大模型作为AI的“大脑”,具备强大的语言理解和生成能力;Agent则是“项目经理/执行者”,能自主规划任务并调用工具;Skill是封装好的专业技能包,为Agent提供具体执行能力&…...
别再只盯着激光雷达了!聊聊低成本单目摄像头测距在机器人/小车项目里的那些事儿
低成本单目摄像头测距:机器人项目中的实战技巧与避坑指南 在机器人、智能小车和无人机项目中,距离感知一直是核心挑战之一。当大家一窝蜂地追求激光雷达方案时,却忽略了手边最经济实惠的传感器——普通摄像头。单目视觉测距技术,这…...
避坑指南:STM32F407 ADC采集波形送到VOFA+显示,这些细节不注意波形会失真
STM32F407 ADC数据采集与VOFA波形显示优化实战 最近在调试STM32F407的ADC采集时,发现VOFA上显示的波形总是出现各种小问题——正弦波有毛刺、三角波出现阶梯状畸变、方波边缘抖动。这让我意识到,从ADC采样到上位机显示这条数据链路上,每个环节…...
面试官:堆外内存爆了,Dump 文件没用,你怎么定位?3招定位线上“幽灵内存泄漏”
如果是堆外内存(Direct Memory)溢出怎么办?我看监控面板,Heap用得很少,但机器的内存RSS一直在飙升,最后进程直接被Linux的OOM Killer杀掉了。用MAT打开Dump文件,里面啥也没有,这咋整…...
终极指南:用Windhawk打造你的专属Windows体验
终极指南:用Windhawk打造你的专属Windows体验 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk 你是否厌倦了Windows千篇一律的界面࿱…...
