七张图解锁Mybatis整体脉络,让你轻松拿捏面试官
👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然
👉这是一个或许对你有用的开源项目
国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。
功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:
Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn
本文笔者计划从全局角度来对Mybatis的整体架构及进行一次回顾和总结,希望能帮助你更加透彻的理解Mybatis。
1 前言
MyBatis
是一款ORM
(Object-Relational Mapping
)框架,其主要用于将Java
对象与关系数据库之间进行映射,凭借其轻量性、稳定性以及广泛的开源社区其受到了广大开发者的追捧。
那MyBatis
为我们做了哪些事情呢?其实,总结来看主要有如下几点:
SQL映射配置 : MyBatis
使用XML
或注解配置文件来定义SQL
查询、插入、更新和删除操作,以及与数据库表之间的映射关系。这使得开发者能够将SQL
语句与Java
代码分离,提高了代码的可维护性。动态SQL : MyBatis
支持动态SQL
,允许根据不同的条件生成不同的SQL
语句。这使得构建复杂的查询变得更加灵活和方便。参数映射 : MyBatis
能够将Java
对象的属性与SQL语句中的参数进行映射,无需手动编写繁琐的参数传递代码。结果集映射 : MyBatis
支持将SQL
查询结果映射到Java
对象,自动将数据库表中的列值赋给Java对象的属性,大大简化了数据的读取和处理。事务管理 : MyBatis
可以与Java
的事务管理框架(如Spring
)无缝集成,确保数据库操作的原子性和一致性。连接池集成 : MyBatis
可以与常见的Java
连接池库(如Apache DBCP、C3P0、HikariCP
)集成,以管理数据库连接的获取和释放。二级缓存 : MyBatis
支持二级缓存,可以在多个会话之间共享数据,提高性能。
知晓了MyBatis
的功能特性后,接下来让我们一起来看看MyBatis
内部是通过哪些组件来支撑起这些功能的。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
2 总览MyBatis
对于Mybatis
的架构大致可以分为三层:基础支持层 、核心处理层 和接口层。
或许,你会觉得上图过于复杂,难以理解。如果此刻你也有这样的疑惑,不要慌。不妨跟着笔者思路来进行梳理。
首先,使用MyBatis
概括来看大致包括如下几步:
定义接口,配置相关的 xml
文件信息加载接口的配置文件,解析相关配置文件 生成接口代理类,执行相关 sql
由于在使用MyBatis
过程中会编写相关的配置
文件,所以Mybatis
内部必然需要相应组件来支撑配置文件的解析,这些也就构成了底层的基础支撑层
。既然会解析配置文件,那是不是必然会涉及到资源加载、配置解析
等模块?
进一步,当配置文件解析完成后,下一步就是生成代理
,然后执行sql
,此时所涉及的也就是核心处理层
中的sql执行,sql解析
等。更进一步,执行sql
过程中为了避免Connection
频繁创建,是不是需要对连接进行池化
操作?所以MyBatis
内部会抽象出一个数据源
模块来统一管理连接。
除此之外,对于sql
执行过程中的事务
是不是也需要控制?所以MyBatis
还有事务管理模块
来对sql
执行过程中的事务
进行管理。
事实上,你只需要记住Mybatis
的使用过程为:定义接口,提供配置文件,而后生成代理,执行Sql
即可 。以此进行发散,自然而然能扩展出上图所示内容,根本没必要死记硬背。
熟悉了MyBatis
的整体架构后,我们接下来看Mybatis
内部执行sql
的大致流程:
接下来,我们将主要围绕这张图中内容进行总结分析。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
3 配置文件解析
配置文件解析过程大致如下所示:
事实上,MyBatis
内部对于配置文件解析的过程可以概括如下:
加载配置文件 :MyBatis首先加载主配置文件(通常是 mybatis-config.xml
),并创建一个Configuration
对象来表示整个MyBatis配置。解析主配置文件 :MyBatis使用XML解析器解析主配置文件,该文件包含了关于数据源、插件、类型别名、缓存等全局配置信息。这些配置会被存储在 Configuration
对象中。
而参与配置文件解析的都继承与BaseBuilder
,其体系结构如下所示:
其中
XMLStatementBuilder
:这个类用于解析映射文件中的<select>
、<insert>
、<update>
和<delete>
等标签,构建与 SQL 语句相关的对象(如MappedStatement
),包括 SQL 语句的解析、参数映射、结果映射等。XMLMapperBuilder
:XMLMapperBuilder
用于解析映射文件(通常是Mapper.xml
文件),负责构建与映射文件相关的对象,包括映射文件的解析、SQL 语句的构建、参数映射、结果映射、缓存配置等。XMLConfigBuilder
:XMLConfigBuilder
用于解析主配置文件(通常是mybatis-config.xml
文件),负责构建与全局配置相关的对象,包括数据源配置、类型别名配置、插件配置、缓存配置等。
总结来看,对于MyBatis
的加载过程来说,其在处理配置文件信息时,首先,会传递配置文件所在位置信息,然后再调用框架提供的SqlSessionFactory
的build
方法便会根据传入路径信息去加载相关的配置文件,并进行解析。而解析的内容会存放到的configuration
之中,进而方便后续组件的使用。
4 代理构建
当配置文件解析,下一步就是通过SqlSession
的getMapper
方法来构建一个接口对应的代理类,这一过程大致如下:
这一过程中涉及的组件主要包括MapperProxyFactory、MapperRegistry、MapperProxy
,更加详细的分析可参考Mybatis流程分析(六): Mybatis中方法和sql语句的桥梁——MapperProxy, 总之这一过程的本质就是通过Jdk
动态代理的方式返回一个实现接口
的实例对象
传送门:https://juejin.cn/post/7273434821807947811
5 sql
执行
当配置文件解析完成,接口相应的代理类构建完毕后,下一步要做的就是sql
的执行,这一过程逻辑大致如下所示:
这一部分的底层逻辑就是原生JDBC
操纵数据库的那一套逻辑,即
创建SQL语句 :即创建 Statement
、PreparedStatement
或CallableStatement
对象,分别用于执行不同类型的SQL
语句。执行SQL查询 :使用创建的 Statement
或PreparedStatement
对象来执行SQL查询。处理查询结果 :通过 ResultSet
对象来处理查询的结果数据。
6 总结
最后,我们再来一下Mybatis
内部对于sql
执行的大致步骤:
创建 SqlSessionFactory :使用 Mybatis
首先需要创建一个SqlSessionFactory
对象,这通常通过读取MyBatis
的主配置文件(mybatis-config.xml
)并使用SqlSessionFactoryBuilder
来实现。SqlSessionFactory
负责创建数据库连接和SqlSession
对象。创建 SqlSession :通过 SqlSessionFactory
创建一个SqlSession
对象。SqlSession
代表了与数据库的一次会话,它可以执行SQL
操作并管理数据库连接。通常,每个线程都会创建自己的SqlSession
。执行 SQL 语句 :在 SqlSession
中,通过调用方法执行SQL
语句。MyBatis
支持多种方式来执行 SQL,包括selectOne()
、selectList()
、insert()
、update()
、delete()
等方法。SQL 语句解析 : MyBatis
会解析SQL
语句,包括动态SQL
,参数映射和结果映射。这包括了将Java
对象转化为SQL
语句中的参数,以及将查询结果映射回Java
对象。执行 SQL
:MyBatis
将SQL
语句发送到数据库,并执行相应的操作,如查询、插入、更新或删除。数据库返回结果或受影响的行数,这取决于SQL
语句的类型。处理结果 : MyBatis
最终会将SQL
的执行结果映射为Java
对象,然后返回给调用者。映射过程通常基于映射文件中的配置。结果集的处理包括将数据库查询结果映射为Java
对象的属性值。
进一步,上述步骤可总结概括总结为如下的流程。
ps:如果觉得文章不错的话,不妨点赞收藏方便日后复习,或者加个关注不错过每一次更新😘
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:
星球的内容包括:项目实战、面试招聘、源码解析、学习路线。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微信扫码关注该文公众号作者