七张图解锁Mybatis整体脉络,让你轻松拿捏面试官

news2024/12/23 13:28:09

前言

MyBatis是一款ORM(Object-Relational Mapping)框架,其主要用于将Java对象与关系数据库之间进行映射,凭借其轻量性、稳定性以及广泛的开源社区其受到了广大开发者的追捧。

那MyBatis为我们做了哪些事情呢?其实,总结来看主要有如下几点:

  1. SQL映射配置:MyBatis使用XML或注解配置文件来定义SQL查询、插入、更新和删除操作,以及与数据库表之间的映射关系。这使得开发者能够将SQL语句与Java代码分离,提高了代码的可维护性。
  2. 动态SQL:MyBatis支持动态SQL,允许根据不同的条件生成不同的SQL语句。这使得构建复杂的查询变得更加灵活和方便。
  3. 参数映射:MyBatis能够将Java对象的属性与SQL语句中的参数进行映射,无需手动编写繁琐的参数传递代码。
  4. 结果集映射:MyBatis支持将SQL查询结果映射到Java对象,自动将数据库表中的列值赋给Java对象的属性,大大简化了数据的读取和处理。
  5. 事务管理:MyBatis可以与Java的事务管理框架(如Spring)无缝集成,确保数据库操作的原子性和一致性。
  6. 连接池集成:MyBatis可以与常见的Java连接池库(如Apache DBCP、C3P0、HikariCP)集成,以管理数据库连接的获取和释放。
  7. 二级缓存:MyBatis支持二级缓存,可以在多个会话之间共享数据,提高性能。

知晓了MyBatis的功能特性后,接下来让我们一起来看看MyBatis内部是通过哪些组件来支撑起这些功能的。

总览MyBatis

对于Mybatis的架构大致可以分为三层:基础支持层核心处理层接口层。

或许,你会觉得上图过于复杂,难以理解。如果此刻你也有这样的疑惑,不要慌。不妨跟着笔者思路来进行梳理。

首先,使用MyBatis概括来看大致包括如下几步:

  1. 定义接口,配置相关的xml文件信息
  2. 加载接口的配置文件,解析相关配置文件
  3. 生成接口代理类,执行相关sql

由于在使用MyBatis过程中会编写相关的配置文件,所以Mybatis内部必然需要相应组件来支撑配置文件的解析,这些也就构成了底层的基础支撑层。既然会解析配置文件,那是不是必然会涉及到资源加载、配置解析等模块?

进一步,当配置文件解析完成后,下一步就是生成代理,然后执行sql,此时所涉及的也就是核心处理层中的sql执行,sql解析等。更进一步,执行sql过程中为了避免Connection频繁创建,是不是需要对连接进行池化操作?所以MyBatis内部会抽象出一个数据源模块来统一管理连接。

除此之外,对于sql执行过程中的事务是不是也需要控制?所以MyBatis还有事务管理模块来对sql执行过程中的事务进行管理。

事实上,你只需要记住Mybatis的使用过程为:定义接口,提供配置文件,而后生成代理,执行Sql 即可。以此进行发散,自然而然能扩展出上图所示内容,根本没必要死记硬背。

熟悉了MyBatis的整体架构后,我们接下来看Mybatis内部执行sql的大致流程:

接下来,我们将主要围绕这张图中内容进行总结分析。

配置文件解析

配置文件解析过程大致如下所示:

事实上,MyBatis内部对于配置文件解析的过程可以概括如下:

  1. 加载配置文件:MyBatis首先加载主配置文件(通常是mybatis-config.xml),并创建一个Configuration对象来表示整个MyBatis配置。
  2. 解析主配置文件:MyBatis使用XML解析器解析主配置文件,该文件包含了关于数据源、插件、类型别名、缓存等全局配置信息。这些配置会被存储在Configuration对象中。

而参与配置文件解析的都继承与BaseBuilder,其体系结构如下所示:

其中

  1. XMLStatementBuilder:这个类用于解析映射文件中的 <select>、<insert>、<update> 和 <delete> 等标签,构建与 SQL 语句相关的对象(如 MappedStatement),包括 SQL 语句的解析、参数映射、结果映射等。
  2. XMLMapperBuilder:XMLMapperBuilder 用于解析映射文件(通常是 Mapper.xml 文件),负责构建与映射文件相关的对象,包括映射文件的解析、SQL 语句的构建、参数映射、结果映射、缓存配置等。
  3. XMLConfigBuilder:XMLConfigBuilder 用于解析主配置文件(通常是 mybatis-config.xml 文件),负责构建与全局配置相关的对象,包括数据源配置、类型别名配置、插件配置、缓存配置等。

总结来看,对于MyBatis的加载过程来说,其在处理配置文件信息时,首先,会传递配置文件所在位置信息,然后再调用框架提供的SqlSessionFactory的build方法便会根据传入路径信息去加载相关的配置文件,并进行解析。而解析的内容会存放到的configuration之中,进而方便后续组件的使用。

代理构建

当配置文件解析,下一步就是通过SqlSession的getMapper方法来构建一个接口对应的代理类,这一过程大致如下:

这一过程中涉及的组件主要包括MapperProxyFactory、MapperRegistry、MapperProxy,更加详细的分析可参考Mybatis流程分析(六): Mybatis中方法和sql语句的桥梁——MapperProxy, 总之这一过程的本质就是通过Jdk动态代理的方式返回一个实现接口的实例对象

sql执行

当配置文件解析完成,接口相应的代理类构建完毕后,下一步要做的就是sql的执行,这一过程逻辑大致如下所示:

这一部分的底层逻辑就是原生JDBC操纵数据库的那一套逻辑,即

  1. 创建SQL语句:即创建Statement、PreparedStatement或CallableStatement对象,分别用于执行不同类型的SQL语句。
  2. 执行SQL查询:使用创建的Statement或PreparedStatement对象来执行SQL查询。
  3. 处理查询结果:通过ResultSet对象来处理查询的结果数据。

总结

最后,我们再来一下Mybatis内部对于sql执行的大致步骤:

  1. 创建 SqlSessionFactory:使用Mybatis首先需要创建一个 SqlSessionFactory 对象,这通常通过读取MyBatis 的主配置文件(mybatis-config.xml)并使用 SqlSessionFactoryBuilder 来实现。SqlSessionFactory 负责创建数据库连接和 SqlSession 对象。
  2. 创建 SqlSession:通过 SqlSessionFactory 创建一个 SqlSession 对象。SqlSession 代表了与数据库的一次会话,它可以执行 SQL 操作并管理数据库连接。通常,每个线程都会创建自己的 SqlSession。
  3. 执行 SQL 语句:在 SqlSession 中,通过调用方法执行 SQL 语句。MyBatis 支持多种方式来执行 SQL,包括 selectOne()、selectList()、insert()、update()、delete() 等方法。
  4. SQL 语句解析:MyBatis 会解析 SQL 语句,包括动态 SQL,参数映射和结果映射。这包括了将 Java 对象转化为 SQL 语句中的参数,以及将查询结果映射回Java对象。
  5. 执行 SQL:MyBatis 将 SQL 语句发送到数据库,并执行相应的操作,如查询、插入、更新或删除。数据库返回结果或受影响的行数,这取决于SQL语句的类型。
  6. 处理结果:MyBatis 最终会将SQL的执行结果映射为 Java 对象,然后返回给调用者。映射过程通常基于映射文件中的配置。结果集的处理包括将数据库查询结果映射为 Java 对象的属性值。

进一步,上述步骤可总结概括总结为如下的流程。

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

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

相关文章

Thinking for Doing:让LLMs能推断他人心理状态来做出适当的行动。

LLMs通常能回答有关心理状态的问题&#xff0c;但往往不能将这些推断用于实际行动。例如&#xff0c;如果一个故事中的角色正在寻找他的背包&#xff0c;而模型知道背包在厨房里&#xff0c;那么模型应该能推断出最好的行动是建议角色去厨房查看。T4D 的目的就是要求模型不仅要…

JavaScript-mooc(纯分享)

第一步下载软件 mooc_v1.3.2_windows_amd64.zip - 蓝奏云 解压后打开有这么多文件 用记事本的打开方式打开config的文件 第一个尖头改成你学校对应慕课英华网址 第二个箭头是你的账号 第三个箭头是你的密码 改好后点击文件保存 最后一步点击运行 {"global": {&qu…

零代码编程:用ChatGPT一键自动制作英文绘本音频

读英文绘本&#xff0c;对于儿童的英语启蒙非常重要。在这个过程中&#xff0c;必然要父母给孩子读大量的英文绘本&#xff0c;这会非常累。有些英文绘本自带音频&#xff0c;直接播放即可&#xff0c;这就轻松多了。如果没有自带音频呢&#xff1f;这时候可以从YouTube下载绘本…

应用在智能家电中的触摸感应芯片

智能家电就是将微处理器、传感器技术、网络通信技术引入家电设备后形成的家电产品&#xff0c;具有自动感知住宅空间状态和家电自身状态、家电服务状态&#xff0c;能够自动控制及接收住宅用户在住宅内或远程的控制指令&#xff1b;同时&#xff0c;智能家电作为智能家居的组成…

Linux常见指令3

Linux常见指令3 一.Linux指令1.时间相关的指令1.date指定格式显示时间2.时间戳3.补充内容-日志3.Cal 2.find补充1.which2.whereis 3.uname-a-r 4.重要的几个热键5.关机命令 二.grep-i选项-n选项-v选项grep其他用途1.搜索指定进程信息2.查找日志等级 补充命令补充命令:sort补充命…

void * 类型指针

目录 一、什么是void *类型指针 二、void *类型指针作用 三、void *类型指针的用法 一、什么是void *类型指针 void *类型指针是无具体类型指针。不能直接进行解引用操作&#xff0c;也不能进行加减整数的操作。 二、void *类型指针作用 void *类型指针可以用于接收任意类型…

【2023集创赛】平头哥杯一等奖作品:基于无剑100开源SoC平台构建双核TEE安全系统

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;平头哥杯一等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼品…

超全整理,Jmeter接口性能测试-Beanshell调用jar包加密(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、添加beanshell…

Jmeter控制RPS

一、前言 ​ RPS (Request Per Second)一般用来衡量服务端的吞吐量&#xff0c;相比于并发模式&#xff0c;更适合用来摸底服务端的性能。我们可以通过使用 JMeter 的常数吞吐量定时器来限制每个线程的RPS。对于RPS&#xff0c;我们可以把他理解为我们的TPS&#xff0c;我们就不…

《软件方法(下)》第8章2023版连载(05)关于实体类

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 8.2 建模步骤C-1 识别类和属性 8.2.2 三种分析类 8.2.2.2 关于边界类 边界类的责任是接受输入、提供输出以及做简单的过滤。 图8-20中提到边界类的映射方法——每个有接口的外系统…

Linux TCP协议通信 (流程 三次握手 四次挥手 滑动窗口)

TCP通信流程 Socket函数 TCP通信实现&#xff08;服务器端&#xff09; #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main() {//1.创建socketint lfd socket(AF_INET, SOCK_…

微软首款AI芯片代号“雅典娜”;马斯克四年内将让“星舰”上火星丨 RTE 开发者日报 Vol.61

开发者朋友们大家好&#xff1a; 这里是**「RTE 开发者日报」&#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的新闻**」、「有态度的观点」、「有意思的数据」、「有思考的文章」…

关于对XSS原理分析与绕过总结

一、原理 该文章仅用于信息防御技术教学&#xff0c;请勿用于其他用途。 1、XSS原理 XSS&#xff08;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通常会在网页中插入恶意的 JavaScript 代码。由于服务器对输入数据的过滤和验证不严格&#xff0c;这…

刘京城:我的《软件方法》学习经历(有彩蛋)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 写在前面&#xff08;潘加宇&#xff09; 下面是刘京城写的关于他学习《软件方法》的经历。我在前面啰嗦几句。 我做软件建模方面的研究和普及工作已经24年了&#xff0c;和各行各业…

机器学习-数值特征

离散值处理 import pandas as pd import numpy as npvg_df pd.read_csv(datasets/vgsales.csv, encoding "ISO-8859-1") vg_df[[Name, Platform, Year, Genre, Publisher]].iloc[1:7]NamePlatformYearGenrePublisher1Super Mario Bros.NES1985.0PlatformNintendo2…

30 数据分析常见概念(略写可跳)

文章目录 数据科学领域概述数据如何驱动运营给企业带来价值岗位关键词说明业务的商业模式 数据指标数据指标定义及常用数据指标如何选取指标分析角度计数流量导向的工具内容导向的工具用户导向的工具业务导向的工具 数据分析方法对比分析多维分析漏斗分析留存分析总结 用户画像…

王兰去(黑客)自学

前言&#xff1a; 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“…

京东数据分析软件:2023年8月京东彩妆行业品牌销售排行榜

鲸参谋监测的京东平台8月份彩妆市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;京东平台上彩妆行业的销量将近390万&#xff0c;其中&#xff0c;环比来看增长约11%&#xff0c;同比则降低约34%&#xff1b;销售额为6.3亿&#xf…

springcloud之项目实战环境准备

写在前面 为了更好的学习springcloud&#xff0c;我们来一起开发一个实战项目&#xff0c;加深理解。 1&#xff1a;项目介绍 在开始项目实战之前先来做一个整体的项目介绍&#xff0c;从而能够让对项目的整体架构和模板有一个比较清晰的认知。 大家都知道双11&#xff0c;…

百元开放式耳机哪款好一点耐用、百元耳放推荐

在耳机品类中&#xff0c;佩戴无需入耳、可保持耳道舒适的开放式耳机正成为新的潮流&#xff0c;不仅不少消费者趋之若鹜&#xff0c;相对于传统入耳式耳机&#xff0c;开放式耳机具备开放双耳的特性&#xff0c;能敞开耳道&#xff0c;让耳朵随时呼吸&#xff0c;保持干燥透气…