当前位置: 首页 > news >正文

【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 创建了 SqlSessionFactorySqlSessionFactoryBuilder 就不需要存在了。因此,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空间转到线性空间。 如果不在线性空间下进行渲染,会产生的问题&#xff1a…...

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.自定义按钮类 效果&#xff1a; (1)仅当未选中&#xff0c;未悬浮时 (2)其他三种情况&#xff0c;均如图 #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 论文链接&#xff1a;https://arxiv.org/pdf/23…...

用于永磁同步电机驱动器的自适应SDRE非线性无传感器速度控制(MatlabSimulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台免费搭建 qt

&#xfeff;Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含&#xff1a;录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署&#xff0c;免费售…...

删除注释(力扣)

删除注释 题目 给一个 C 程序&#xff0c;删除程序中的注释。这个程序source是一个数组&#xff0c;其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。 在 C 中有两种注释风格&#xff0c;行内注释和块注释。 字符串// 表示行注释&#xff0c;表示//和其右侧…...

阿里云AK创建

要在阿里云上创建 Access Key&#xff08;AK&#xff09;&#xff0c;您需要按照以下步骤进行操作&#xff1a; 登录到阿里云控制台&#xff08;[https://www.aliyun.com/?utm_contentse_1014243503)&#xff09;。 点击右上方的主账号&#xff0c;点击“AccessKey管理”。 …...

OC与Swift的相互调用

OC调用Swift方法 1、在 Build Settings 搜索 Packaging &#xff0c;设置 Defines Module 为 YES 2、新建 LottieBridge.swift 文件&#xff0c;自动生成桥 ProductName-Bridging-Header.h 3、在 LottieBridge.swift 中&#xff0c;定义Swift类继承于OC类&#xff0c;声明 obj…...

某银行软件测试笔试题

&#xff08;时间90分钟&#xff0c;满分100分&#xff09; 考试要求&#xff1a;计算机相关专业试题 一、填空题&#xff08;每空1分&#xff0c;共10分&#xff09; 1. ______验证___是保证软件正确实现特定功能的一系列活动和过程。 2. 按开发阶段分&#xff0c;软件测试可…...

SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring MVC入门 一、Spring MVC概述二、入门案例2.1导入Sp…...

一文说清楚支付架构

作者&#xff1a;陈斌 支付的技术架构是为了保障能够顺利处理支付请求而设计的结构体系。从系统的角度看&#xff0c;它包括了计算机系统的软件、硬件、网络和数据等。从参与的主体角度来看&#xff0c;它涉及交易的付款方、收款方、支付机构、银行、卡组织和金融监管机构等。要…...

【Golang 接口自动化00】为什么要用Golang做自动化?

目录 为什么使用Golang做自动化 最终想实现的效果 怎么做&#xff1f; 写在后面 资料获取方法 为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后&#xff0c;因为没有太多时间和项目来实践&#xff0c;怕止步于此、步Java缺少练习遗忘殆尽的后尘&#xff0c;决定…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...