Mybatis 的运行原理?

Mybatis运行原理(我保证全宇宙最详细) 最近几天通过看源码来研究了一下mybatis的运行步骤,本篇文章以最基础的mybatis利用sqlSession操作数据库来讲解。我相信只要各位跟着我的节奏看完这篇文章就会对mybatis的运行步骤有个大体的认识(希望大家像我一样编写一个简单例子,然后跟着我的步骤看源码,不明白的地方debug)。这篇绝对是全网最详细的介绍mybatis运行原理的文章,当然如果你没有耐心看完的话,我也没任何办法,毕竟研究源码是一种枯燥的行为。如果你真的想去了解mybatis背后是怎么运行的,我相信这篇文章肯定会帮助到你。 阅读详情

MyBatis 的运行原理可以概括为以下几个核心步骤:

1. 加载配置:

  • MyBatis 首先会读取核心配置文件(通常是 mybatis-config.xml),或者通过 Java 代码创建配置对象 Configuration。
  • 核心配置文件中包含了 MyBatis 的全局配置信息,如数据源、事务管理器、类型别名、类型处理器、插件、映射器等。

2. 构建 SqlSessionFactory:

  • MyBatis 使用 SqlSessionFactoryBuilder 根据配置信息(Configuration 对象)构建 SqlSessionFactory。
  • SqlSessionFactory 是一个工厂类,负责创建 SqlSession 对象。SqlSessionFactory 通常在应用程序的生命周期内只需要创建一个实例(单例模式)。

3. 打开 SqlSession:

  • 通过 SqlSessionFactory 的 openSession() 方法打开一个新的 SqlSession。
  • SqlSession 代表与数据库的一次会话,它包含了执行 SQL 语句、获取 Mapper 接口实例、管理事务等方法。
  • SqlSession 不是线程安全的,每个线程应该拥有自己的 SqlSession 实例。

4. 获取 Mapper 接口的代理对象 (推荐方式):

  • 通过 SqlSession 的 getMapper() 方法获取 Mapper 接口的代理对象。
  • MyBatis 使用动态代理技术(JDK 动态代理或 CGLIB)创建 Mapper 接口的代理对象。

5. 执行 Mapper 接口方法:

  • 当调用 Mapper 接口的方法时,实际上调用的是 MyBatis 生成的代理对象的方法。
  • 代理对象会根据以下信息查找对应的 MappedStatement 对象:
    • Namespace: Mapper 接口的全限定名,用于确定 SQL 映射文件。
    • Statement ID: Mapper 接口的方法名,用于确定 SQL 映射文件中的具体 SQL 语句。

6. 查找 MappedStatement:

  • MappedStatement 对象代表一个 SQL 语句(<select>, <insert>, <update>, <delete>),它包含了 SQL 语句的 ID、参数类型、结果类型、SQL 语句内容等信息。
  • MappedStatement 对象在 MyBatis 初始化时(构建 SqlSessionFactory 时)就已经被解析并保存在 Configuration 对象中。

7. 创建执行器 (Executor):

  • MyBatis 根据配置信息(例如,defaultExecutorType 设置)创建 Executor 对象。
  • Executor 负责执行 SQL 语句,并处理缓存(一级缓存和二级缓存)。
  • MyBatis 支持三种类型的 Executor:
    • SIMPLE: 每次执行 SQL 语句都会创建一个新的 PreparedStatement。
    • REUSE: 重复使用 PreparedStatement,只要 SQL 语句和参数类型相同,就会使用同一个 PreparedStatement。
    • BATCH: 批量执行 SQL 语句,将多个 SQL 语句攒起来一次性发送到数据库执行。

8. 创建语句处理器 (StatementHandler):

  • MyBatis 根据 MappedStatement 和 Executor 创建 StatementHandler 对象。
  • StatementHandler 负责处理 JDBC 的 Statement(或 PreparedStatement),包括设置参数、执行 SQL 语句、处理结果集等。
  • MyBatis 支持三种类型的 StatementHandler:
    • SimpleStatementHandler: 处理普通的 Statement。
    • PreparedStatementHandler: 处理 PreparedStatement。
    • CallableStatementHandler: 处理存储过程调用。

9. 创建参数处理器 (ParameterHandler):

  • MyBatis 根据 MappedStatement 创建 ParameterHandler 对象。
  • ParameterHandler 负责将 Java 方法的参数转换为 JDBC 类型,并设置到 PreparedStatement 的占位符中。
  • ParameterHandler 会使用 TypeHandler 进行类型转换。

10. 执行 SQL 语句:

  • StatementHandler 使用 PreparedStatement 执行 SQL 语句。

11. 创建结果集处理器 (ResultSetHandler):

  • MyBatis 根据 MappedStatement 创建 ResultSetHandler 对象。
  • ResultSetHandler 负责将 JDBC 的 ResultSet 转换为 Java 对象。
  • ResultSetHandler 会使用 TypeHandler 进行类型转换。

12. 结果映射:

  • ResultSetHandler 将 ResultSet 中的数据映射为 Java 对象(或 Map、List 等)。
  • MyBatis 支持多种结果映射方式,包括自动映射、resultType、<resultMap>、关联映射、鉴别器等。

13. 返回结果:

  • ResultSetHandler 将映射后的 Java 对象返回给 Executor。
  • Executor 将结果返回给 SqlSession。
  • SqlSession 将结果返回给 Mapper 接口的代理对象。
  • 代理对象将结果返回给调用者。

14. 提交或回滚事务 (如果需要):

  • 如果进行了数据库修改操作(insert、update、delete),需要手动提交事务(commit())或回滚事务(rollback())。
  • 如果只进行了查询操作(select),则不需要。

15. 关闭 SqlSession:

  • 使用 SqlSession 的 close() 方法关闭会话,释放资源。
  • 务必在 finally 块中关闭 SqlSession,以确保资源被正确释放。

流程图:

[Client Code] --> [Mapper Interface] --> [Mapper Proxy (Dynamic Proxy)] --> [SqlSession] --> [Executor] --> [StatementHandler] --> [ParameterHandler] + [ResultSetHandler] --> [JDBC (PreparedStatement)] --> [Database]
                                                                                                                                                                            ^
                                                                                                                                                                            |
                                                                                                                                                                            [TypeHandler] (参数转换和结果转换)
                                                                                                                                   ^
                                                                                                                                   |
                                                                                                                   [MappedStatement] (包含 SQL 语句、参数类型、结果类型等信息)
                                            ^
                                            |
                              [Configuration] (全局配置信息)

总结:

MyBatis 的运行原理可以概括为:加载配置、构建 SqlSessionFactory、打开 SqlSession、获取 Mapper 接口代理对象、执行 Mapper 接口方法、查找 MappedStatement、创建执行器、创建语句处理器、创建参数处理器、执行 SQL 语句、创建结果集处理器、结果映射、返回结果、提交/回滚事务、关闭 SqlSession。 MyBatis 通过动态代理、反射、类型转换、缓存等技术,实现了 SQL 语句与 Java 代码的解耦,简化了数据库访问操作。

【温室气体】GOSAT 数据产品 阅读详情

相关推荐

UVM环境复位--stop_sequences()

在UVM验证环境中, stop_sequences是一个用于强制终止所有正在运行的 Sequence 的方法,通常用于动态控制激励生成流程。1.通过uvm_config_db传递事件和严格的同步机制,此方案符适用于复杂复位场景和动态测试控制。组件耦合:Driver 和 Sequence 不再直接依赖env,通过标准接口通信。竞争条件:确保 Driver 完成清理后再终止 Sequence。代码健壮性:使用非阻塞操作和事件监听,避免死锁。

qq_42779035的博客 3013

MyBatis原理分析(通俗易懂)

MyBatis原理分析MyBatis工作流程简述原生MyBatis原理分析初始化工作解析配置文件配置类方式执行SQLSqlSession API方式接口方式 真正掌握一个框架源码分析是少不了的~ 在讲解整合Spring的原理之前理解原生的MyBatis执行原理是非常有必要的 MyBatis工作流程简述 传统工作模式: public static void main(String[] args) ...

Coder Wang 14万+

别再只跑memtester了!嵌入式Linux内存压力测试,这5个参数和场景你试过吗?

本文深入探讨了嵌入式Linux内存压力测试的高级技巧,重点解析了memtester工具的5个关键参数和实战场景。通过物理地址测试、迭代控制、内存分配策略等调优方法,帮助开发者有效检测内存稳定性问题,适用于长期运行设备、特定故障重现等复杂场景,提升嵌入式系统可靠性。

weixin_30838873的博客 424

Mybatis工作流程及其原理与解析

Mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文将通过d...

青元子的博客 5万+

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 771

使用DDR4控制器实现多通道数据读写

这种高带宽对于大量的数据的应用非常重要。对于Controller/PHY Mode 的选择,我们使用Controller + PHY模式,Xilinx UltraScale/UltraScale+等高端FPGA通常包含硬核PHY,选择Controller + PHY模式可直接利用硬核,降低功耗和延迟,并且此模式的开发更易上手。在Basic页面下,首先勾选上AXI4 Interface选项,我们选用的内存接口速度为2133MHz的ddr4芯片,由于双沿触发,频率为1066MHz,那么周期应为938ps。

weixin_38828382的博客 1363

Mybatis工作原理

引言 在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹(参考:《MyBatis————基础知识》)。 本片博客针对Mybatis内部工作原理进行阐述。 一、Mybatis工作原理图 mybatis 原理图如下所示: 二、工作原理解析 mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也...

Morty的技术乐园 13万+

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3951

MyBatis基本工作原理介绍

1、MyBatis基本工作原理介绍 计算机的基本工作就是存储和计算,而MyBatis是存储领域的利器。MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。 2、MyBatis的核心流程介绍 mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过

weixin_44431073的博客 2万+

ECU-TEST 快速入门

ECU-TEST 是由位于德国德累斯顿的TraceTronic公司开发的一款用于嵌入式系统测试验证软件工具。自从2003年首次发布ECU-TEST ,该软件成为了汽车ECU开发的标准工具 ,同时也逐步成为了重型机械和工业自动化开发的标准工具 。该软件是起源自于一个控制单元的系统化测试的项目研究,从而为从德累斯顿工业大学脱离出来的TraceTronic公司奠定了基础。ECU-TEST旨在完成测试案例的规范化、评估、求解和归档。得益于该软件包含大量的自动化测试方法使得测试案例的所有必要功能如创建、求解和评估

wangying202的博客 1万+

ROS机器人里程计模型

3.5 移动机器人系统模型 相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Are you ready? 没准备好也开始了。 3.5.1 常用坐标系系统模型 在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XR YR OR 、传感器坐标系XS YS OS

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

bjsxt学习Mybatis,简述MyBatis的运行原理

MyBatis运行过程中涉及到的类: 1ResourcesMyBatis 中 IO 流的工具类 1.1 加载配置文件 2SqlSessionFactoryBuilder() 构建器 2.1 作用:创建 SqlSessionFactory 接口的实现类 3XMLConfigBuilder MyBatis 全局配置文件内容构建器类 ...

WeiZhihui优快云的博客 449

智能车图像处理16-进阶篇8--右环岛状态机与补线

这篇文章主要讲述智能车竞赛中如何判断右环岛并且进行状态补线。

taiyuezyh的博客 1万+

MyBatis的运行原理

MyBatis运行原理核心流程:1)加载配置,构建SqlSessionFactory;2)通过动态代理创建Mapper接口实现类;3)SQL执行时匹配MapperStatement,由Executor完成JDBC操作;4)结果集根据映射规则转换为POJO对象。MyBatis通过配置驱动和代理模式,实现SQL与Java代码,简化数据库操作同时保持灵活性。

W18263823008的博客 755

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Mybatis的运行原理

理解MyBatis的工作原理,需要结合JDBC的知识。在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息:​​​​​​​。,负责把 Java 程序的 "需求" 翻译成数据库能听懂的 "SQL 指令",再把数据库的 "回复" 翻译成 Java 程序能看懂的 "对象"。该对象中包含了执行 SQL 语句的所有方法,是一个既可以发送sql执行并返回结果的,也可以获取mapper的接口。

weixin_74655655的博客 949

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mybatis注解、Mybatis运行原理

注解 作用:mybatis为了简化mapper.xml文件,但是动态Sql依然使用mapper.xml文件。 mapper.xml和注解是可以共同存在的。 使用注解时,mybatis.xml中mappers使用<package =/>或者是<mapper class=’’’/> ...

weixin_42914563的博客 1172

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Mybatis的SqlSession运行原理

前言   SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查(当然现在更加推荐是使用Mapper接口形式),那么它是如何执行实现的,这就是本篇博文所介绍的东西,其中会涉及到简单的源码讲解。   了解SqlSession的运作原理是学习Mybatis插件的必经之路,因为Mybatis的插件会在SqlSessio

javalingyu的博客 1435

MyBatis运行原理

原理

qq_36525300的博客 375

Mybatis之运行原理

Mybatis之运行原理

qq_41490913的博客 79

MyBatis的注解和运行原理

Mybatis的注解:注解和xml配置文件可以混合使用MyBatis 的运行原理在MyBatis运行开始时需要先通过Resources加载全局配置文件.下面需要实例化SqlSessionFactoryBuilder构建器.帮助SqlSessionFactory接口实现类DefaultSqlSessionFactory.在实例化DefaultSqlSessionFactory之前需要先创建XmlCo...

木子璇 4539

mybatis框架运行原理

梦奇 502

Mybatis运行原理

一.运行过程中涉及到的类 1. Resources Mybatis中IO流的工具类 1.1 加载配置文件 2. SqlSessionFactoryBuilder()构建器 2.1 作用:创建SqlSessionFactory接口中的实现类 3. XMLConfigBuilder M...

luxin120的博客 382
上一篇: Nacos 的整体架构是什么样的?Client-Server 架构是如何体现的?
下一篇: Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?
冰糖心书房
博客等级 码龄15年 6013粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值