【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()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HAL库】STM32CubeMX开发----STM32F407----LAN8720A----移植FreeModbus实现ModbusTCP

前言 本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。 以太网PHY层芯片为 LAN8720A,移植FreeModbus实现ModbusTCP网口通信。 具体内容参考文章:【HAL库】STM32CubeMX开发----STM32F407----ETHLAN8720ALWIP----ping通 本次移植…

零基础强化学习入门分享

(一)前言:强化学习入门顺序。 以前主要学习硬件PCB单片机等知识,后来接触的项目也大多与电气相关,从一窍不通到稍微找到点门道,中间走过不少弯路,误打误撞中,也留下了一些经验。 我的…

微服务——elasticsearch

初识ES——什么是elasticsearch elasticsearch的发展 初识ES——正向索引和倒排索引 初识ES——es与mysql的概念对比 类比到mysql中是表结构约束 概念对比 初始ES——安装es和kibana 1.部署单点es 1.1创建网络 要安装es容器和kibana容器并让他们之间相连,这里…

RabbitMQ-API

这里写目录标题 Hello word 模式添加依赖生产者消费者获取信道工具类 Work Queues模式消费者代码 C1开启多线程运行启动 消费者代码 C2生产者代码 消息应答自动应答消息应答的方法Multiple 的解释消息自动重新入队消息手动应答代码消费者API 队列持久化消息持久化不公平分发消息…

redis 高级篇 redis 源码的读取分析

一 redis源码分析 1.1 源码分析 1每一个kv键值对应有一个dictEntry。 2.底层数据结构

mysql数据库迁移

目录 背景迁移数据库 背景 公司有个项目,刚开始数据量不是大的时候,数据库和服务上的所有应用数据都放在一个旧小盘中,随着项目数据的增长,旧的磁盘被占满了,导致系统无法写入数据,我和同事排查了很长时间…

C++运算符重载详解(赋值、流插入流提取、前置后置++、取地址)

C运算符重载详解 基本介绍运算符重载案列1. 赋值运算符重载2. 前置和后置重载3. cout,cin(流插入,流提取重载)4. 取地址重载 基本介绍 C为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其 返回值…

生态共建丨YashanDB与构力科技完成兼容互认证

近日,深圳计算科学研究院崖山数据库系统YashanDB V22.2与北京构力科技有限公司BIMBase云平台完成兼容性互认证。经严格测试,双方产品完全兼容、运行稳定。 崖山数据库系统YashanDB是深算院自主研发设计的新型数据库系统,融入原创理论&#xf…

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件,适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高;球…

SpringBoot单元测试

目录 1.什么是单元测试? 2.单元测试有哪些好处? 3.Spring Boot单元测试使⽤ 单元测试的实现步骤 1. ⽣成单元测试类 2. 添加单元测试代码 2.1 .添加Spring Boot框架测试注解:SpringBootTest 2.2 添加单元测试业务逻辑 简单的断⾔说明 1.什么是单元测试? 单元测试(un…

RPC框架引入zookeeper服务注册与服务发现

Zookeeper概念及其作用 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是大数据生态中的重要组件。它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理…

使用 GitHub Copilot 进行 Prompt Engineering 的初学者指南(译)

文章目录 什么是 GitHub Copilot ?GitHub Copilot 可以自己编码吗?GitHub Copilot 的底层是如何工作的?什么是 prompt engineering?这是 prompt engineering 的另一个例子 使用 GitHub Copilot 进行 prompt engineering 的最佳实践提供高级上下文&…

Springboot -- 按照模板生成docx、pdf文件,docx转pdf格式

使用 poi-tl 根据模板生成 word 文件。 使用 xdocreport 将 docx 文件转换为 pdf 文件。 xdocreport 也支持根据模板导出 word ,但是 poi-tl 的功能更齐全,操作更简单,文档清晰。 poi-tl 、xdocreport 内部均依赖了 poi ,要注意两…

uniapp 全局数据(globalData)的设置,获取,更改

globalData,这是一种简单的全局变量机制。这套机制在uni-app里也可以使用,并且全端通用 因为uniapp基本上都是将页面,或者页面中相同的部分,进行组件化,所以会存在父,子,(子&#xf…

【数据挖掘竞赛】——科大讯飞:锂离子电池生产参数调控及生产温度预测挑战赛

🤵‍♂️ 个人主页:@Lingxw_w的个人主页 ✍🏻作者简介:计算机科学与技术研究生在读 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ ​ 【科大讯飞】报名链接:https://challenge.xfyun.cn?invitaC…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装: 在安装的时候,请勾选Add Ruby executables to your PATH这个选项,添加环境变量: 安装Ruby成…

【Ansible 的脚本 --- playbook 剧本】

目录 一、playbook 剧本介绍二、示例1、运行playbook2、定义、引用变量 三、使用playbook部署lnmp集群 一、playbook 剧本介绍 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在…

通过私有化部署的企业智能名片,作用究竟有多大?

“在21世纪最为重要的是什么?” “是人才,更是人脉。” 为了拓展人际关系,建立更密切的联系和合作联络。在商务交流中,互相交换正式、可信的名片是必不可少的一环。 但是,你有没有意识到呢? 每年全球交换…

2023年08月数据库流行度最新排名

点击查看最新数据库流行度最新排名(每月更新) 2023年08月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

使用DataX实现mysql与hive数据互相导入导出

一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题&#xf…