深入详解Mybatis的架构原理与6大核心流程

article/2025/9/1 12:57:02

在这里插入图片描述
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。

如果你想要进入一线大厂,能够熟练使用 MyBatis 开发已经是一项非常基本的技能,同时大厂也更希望自己的开发人员深入了解 MyBatis 框架的原理和核心实现。

从这个角度看,理解 MyBatis 原理,阅读 MyBatis核心源码,这样更有利于提高职场竞争力。

在深入了解Mybatis的源码之前,我们先了解一下Mybatis的整体架构和工作原理,这样有助于我们在阅读源码过程中了解思路和流程。

Mybatis架构设计

我们把Mybatis的功能架构分为三层:

  1. API接口层
  2. 数据处理层
  3. 基础支撑层

在这里插入图片描述

**接口层 **

接口层:主要就是和数据库交互,提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库,接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
在这里插入图片描述
以使用Mapper接口为例,将配置文件中的每一个 节点抽象为一个 Mapper 接口,这个接口中声明的方法和跟Mapper.xml中的 节点项对应。

id值对应方法名称,parameterType 值对应方法的入参类型,而resultMap 值则对应返回值类型。
在这里插入图片描述
配置好后,MyBatis 会根据接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,当调用接口方法时,根据这个方法的方法名和参数类型,确定Statement Id,底层还是通过 SqlSession.select/update( “statementId”, parameter) 等来实现对数据库的操作。

数据处理层

数据处理层:可以说是MyBatis 的核心,负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等,它主要的目的是根据调用的请求完成一次数据库操作。
在这里插入图片描述
从大的方面上讲,它要完成两个功能:

  • 通过传入参数构建动态SQL语句
  • SQL语句的执行以及封装查询结果集

1.通过传入参数构建动态SQL语句

动态语句生成能够说是MyBatis框架很是优雅的一个设计,MyBatis 经过传入的参数值,使用 Ognl 来动态地构造SQL语句,使得MyBatis 有很强的灵活性和扩展性。

参数映射指的是对于java 数据类型和jdbc数据类型之间的转换,这里有包括两个过程:

  • 查询阶段
  • 查询结果集转换阶段

查询阶段要将java类型的数据,转换成jdbc类型的数据,经过 preparedStatement.setXXX() 来设值;

另外一个就是对resultset查询结果集的jdbcType 数据转换成java 数据类型。

2. SQL语句的执行以及封装查询结果集

动态SQL语句生成以后,MyBatis 将执行SQL语句,并将可能返回的结果集转换成List 列表。

MyBatis 在对结果集的处理中,支持结果集关系一对多和多对一的转换,而且有两种支持方式,一种为嵌套查询语句的查询,还有一种是嵌套结果集的查询。

基础支撑层

基础支撑层是整个MyBatis框架的地基,负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件,为上层的数据处理层提供最基础的支撑。
在这里插入图片描述

1.缓存机制

数据库是实践生成中非常核心的存储,很多业务数据都会落地到数据库,所以数据库性能的优劣直接影响了上层业务系统的优劣。

我们很多线上业务都是读多写少的场景,在数据库遇到瓶颈时,缓存是最有效、最常用的手段之一,正确使用缓存可以将一部分数据库请求拦截在缓存这一层,这就能够减少一部分数据库的压力,提高系统性能。

在这里插入图片描述

除了使用 Redis、Memcached 等外置的第三方缓存以外,持久化框架一般也会自带内置的缓存,例如,MyBatis 就提供了一级缓存和二级缓存,具体实现位于基础支撑层的缓存模块中。

2.反射工具

该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。

3.类型转换

类型转换模块提供了两个主要功能,一个功能是别名机制,MyBatis 为了简化配置文件提供了别名机制。

另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。

4.日志

提供详细的日志输出信息,并且能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。

5.资源加载

资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能。

6.解析器

解析器模块主要提供两个功能,一个功能是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持。

另一个功能是为处理动态 SQL 语句中的占位符提供支持。

7.事务管理

持久层框架一般都会提供一套事务管理机制实现数据库的事务控制,MyBatis 对数据库中的事务进行了一层简单的抽象,提供了简单易用的事务接口和实现。

一般情况下,Java 项目都会集成 Spring,并由 Spring 框架管理事务。

8.Binding

在调用 SqlSession 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点,如果出现拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,MyBatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的SQL 语句完成数据库操作,从而避免上述问题。

需要注意的是,开发人员无须编写自定义 Mapper 接口的实现,MyBatis 会自动为其创建动态代理对象。

9.数据源

对于 ORM 框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题。

数据库连接是一项有限的昂贵资源,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。

数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。

打开Mybatis源码找到datasource包下就可以看到连接池的实现,如下图所示:

在这里插入图片描述

Mybatis核心执行流程

mybatis的总体执行流程,总结如下:

在这里插入图片描述

1.MyBatis配置文件

config.xml:配置了全局配置文件,配置了MyBatis的运行环境等信息。

mapper,xml:sql的映射文件,配置了操作数据库的sql语句,此文件需在config.xml中加载。

2.SqlSessionFactory

通过MyBatis环境等配置信息构造SqlSessionFactory(会话工厂)。

3.SqlSession

通过会话工厂创建SqlSession(会话),对数据库进行增删改查操作。

4.Exector执行器

MyBatis底层自定义了Exector执行器接口来具体操作数据库,Exector接口有两个实现,一个基本执行器(默认),一个是缓存执行器,SqlSession底层是通过Exector接口操作数据库。

5.MappedStatement

MyBatis的一个底层封装对象,它包装了MyBatis配置信息与sql映射信息等。mapper.xml中的insert/select/update/delete标签对应一个MappedStatement对象。标签的id就是MappedStatement的id。

MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo、Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是JDBC编程对preparedStatement设置参数。

MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至Java对象中,输出结果映射就是JDBC编程对结果的解析处理过程。

​到此我就把Mybatis的架构从全局上做了一个拆解,后续我将重点分析其核心源码,这样先全局再局部,这样更有利于掌握其核心原理实现,希望这个框架系列能对你有所用。


关于作者:mikechen 十余年BAT架构经验,资深技术专家,曾任职阿里、淘宝、百度。

关注个人公众号:mikechen的互联网架构,十余年BAT架构经验倾囊相授!

在公众号菜单栏对话框回复**【架构】**,即可领取我原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集
在这里插入图片描述


http://chatgpt.dhexx.cn/article/44SN6KY6.shtml

相关文章

总结Mybatis的原理

一、什么是Mybatis Mybatis是一个半ORM(对象关系映射)框架,底层封装了JDBC,是程序员在开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。MyBatis 可以使用简单的 XM…

MyBatis基本工作原理介绍

1、MyBatis基本工作原理介绍 计算机的基本工作就是存储和计算,而MyBatis是存储领域的利器。MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。 2、MyBatis的核心流程介绍 m…

Mybatis 工作原理详解

目录 Mybatis持久层框架 结果集进行ORM映射 步骤解析 1、获取结果集及结果映射入口 2、开始ORM映射接口 3、数据库结果集解析,完成ORM映射 4、保存并获取ORM映射后的结果集 参数传递方式 顺序传参法 Param注解传参法 Map传参法 Java Bean传参法 mybat…

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实…

【图片压缩】三个方法压缩图片体积

图片体积过大,会占用电脑过多的容量,也有可能无法发送给其他人。我们可以压缩图片体积来解决问题。分享三个方法压缩图片体积: 方法一:改变图片格式 首先是改变图片的格式,如果你不介意压缩之后的图片画质损失&#…

Windows不同压缩软件、压缩算法、压缩率详细对比测试与选择

上次写了图片压缩,这倒让我想起几年前看过的一个很有意思的东西 那就是这张鸭子图: 不过微信会压缩图片,你可以打开这个链接:http://2.im.guokr.com/F70Kn-4wz7aF5Yejf9W3g6kO4exDBqVEb0TumQmxy5MiAQAAEAEAAEpQ.jpg 来获取原图 …

为什么压缩图片和压缩

为什么要压缩图片? 表示图像需要大量的数据,但图像数据是高度相关的,或者说存在冗余(Redundancy)信息,去掉这些冗余信息后可以有效压缩图像,同时又不会损害图像的有效信息。 视网膜上有两种感光细胞,能够…

2款免费的图片压缩工具

今天写这篇文章的目的,主要是为大家介绍2款免费的图片压缩工具,在工作和学习中这也是一项必备的技能。比如当你遇到比较大的图片需要发送的时候,或者对图片的大小有强制要求的时候,这些小工具就派上了用场。 网上也有一些付费的压…

如何批量压缩图片体积大小kb?

工作中,我们在使用图片素材时,图片kb体积过大怎么办? 通常我们会直接在电脑上将图片调整成我们想要的尺寸大小,可以利用的工具有photoshop或者截图的方法,这对于有些小伙伴来说不是很难的事情,今天我就不做…

图片批量压缩方法及步骤

图片批量压缩方法及步骤!平常我们会将手机拍摄的照片传输到电脑里保存,时间久了后电脑中会有大量的图片,这些图片大都是1M-2M的体积大小,这些图片会占用大量的电脑磁盘空间,可能会导致电脑变得很卡等现象。但是又不忍心…

银河麒麟批量压缩图片的方法

适用系统:银河麒麟V10(SP1),CPU:Kirin990,架构:aarch64。 软件商店下载“简单图像压缩转换软件”。桌面左下角点开菜单搜索“Simple Image Reducer”,右键添加到桌面快捷方式。打开Simple Image Reducer。…

python压缩图片和视频

引言 在真实项目中,往往要进行图片的传输和视频的传输,但因为用户上传的图片和视频所占用的大小问题而导致占用服务器的空间多,并且用户访问这些图片的时候因为图片或视频太大而长时间加载,所以要对用户上传的视频和图片进行压缩…

7款最好用的图片无损,视频无损压缩软件

第一:QVE视频压缩软件 下载地址:http://www.qvevideo.com/compress 非常实用的视频,图片两用压缩软件,能够将各种视频压缩成mp4,flv等格式, 缩减视频体积,释放磁盘空间,节省网络带宽,压缩后能够保持视频高清晰度,压缩率高达90%以上。 1,首先打开软件,切换到【图片压缩】…

苹果手机解压缩软件_照片压缩软件哪款好用?推荐5款好用的图片压缩软件

在我们办公的时候,总会遇到各种各样的问题,就比如PDF与文档之间的转换,图片的压缩,文档加密的方法等等,这些都是上班族经常需要处理的问题,特别是图片压缩,很多人都想知道照片压缩软件哪款好&am…

分享一个好用的图片压缩软件

为了性能优化需要,一般需要优化网站上的图片,减少大小。但问题来了,很多压缩软件是有损压缩,压缩后图片质量惨不忍睹。 下面我分享一下刚刚了解到的图片压缩软件,名字叫智图。 官网地址是: http://zhitu.is…

无损对图片进行压缩软件Caesium使用方法及下载

无损对图片进行压缩,除了用PS外,还有一款小白也可以用的软件Caesium。 使用方法如下: 1、打开文件夹,双击Caesium.exe 2、弹出的界面如下 3、点击左上角红色方框打开文件5837014_0_0.jpg,压缩选项的品质任意修改&…

开源免费的图片压缩软件,从50M到50K,极力安利

我相信大家在生活中肯定每日都离不开图片的处理了,比如:考试报名、图片传送、网页图片上传的过程中,都或多或少遇到过“您上传的图片太大”的问题 每次遇到这种情况是真的有点心塞,所以今天特别给大家带来一款人人必备的实用、超好…

如何压缩图片200k以下?

“图片过大无法上传”,“因您上传的图片大小超过限制”这样的提示大家都有遇到过吧?这就是告诉我们现在的图片需要压缩一下才能继续使用了,否则我们就无法使用当前照片了。 那有很多平台,特别是上传一些证件照的时候,要…

怎么压缩图片200k以下?

怎么压缩图片200k以下?有很多小伙伴好奇,为什么别人能将图片压缩到200k以下,而自己却做不到呢!原因很简单,那是因为他们都用好用的压缩软件来压缩。今天小编也为大家分享一个轻松将图片压缩到200k以下的方法给你。 我们…

「精品」无损批量压缩图片工具 - Caesium Image Compressor

每天分享一点小知识,积少成多。今天分享的是一款图片无损压缩工具!最近在做网站的备案,上次的图片要求不能大于9M,无奈只能压缩图片了,今天对比了几款图片压缩工具,最终得出Caesium Image Compressor款工具…