MyBatis 底层工作原理
引言
SqlSession 是 MyBatis 提供的面向用户的操作数据库 API。那么 MyBatis 底层是如何工作的呢?为了解开MyBatis的神秘面纱,我们需要了解一下MyBatis的其他几个比较核心的组件及这些组件的作用。
MyBatis 核心组件
MyBatis的执行流程及核心组件如图:

- Configuration:用于描述MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。
- MappedStatement:MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装。
- SqlSession:SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口。
- Executor:Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
- StatementHandler:StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
- ParameterHandler:当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。
- ResultSetHandler:ResultSetHandler封装了对JDBC中的ResultSet对象操作,当执行SQL类型为SELECT语句时,ResultSetHandler用于将查询结果转换成Java对象。
- TypeHandler:TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。
MyBatis 执行流程
了解了MyBatis的核心组件后,我们再来了解一下使用MyBatis操作数据库的过程。
- 在 MyBatis 框架的基本使用时,我们使用到了 SqlSession 组件,它是用户层面的 API。
- 实际上 SqlSession 是 Executor 组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式(或门面模式)的典型应用。
- 真正执行 SQL 操作的是 Executor 组件,Executor 可以理解为 SQL 执行器,它会使用 StatementHandler 组件对 JDBC 的 Statement 对象进行操作。
- 当 Statement 类型为 CallableStatement 和 PreparedStatement 时,会通过 ParameterHandler 组件为参数占位符赋值。
- ParameterHandler 组件中会根据 Java 类型找到对应的TypeHandler 对象,TypeHandler 中会通过 Statement 对象提供的 setXXX() 方法(例如setString()方法)为 Statement 对象中的参数占位符设置值。
- StatementHandler 组件使用 JDBC 中的 Statement 对象与数据库完成交互后,当 SQL 语句类型为 SELECT 时,MyBatis 通过 ResultSetHandler 组件从 Statement 对象中获取 ResultSet 对象,然后将 ResultSet 对象转换为 Java 对象。
参考文章链接:https://blog.csdn.net/qq_35946969/article/details/122987664
MyBatis 底层工作原理的更多相关文章
- PHP底层工作原理
最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...
- Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...
- Mybatis之工作原理
1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...
- Hibernate和Mybatis的工作原理以及区别
一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...
- 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...
- MyBatis底层实现原理: 动态代理的运用
转载:https://mp.weixin.qq.com/s/_6nyhaWX15mh3mkj8Lb0Zw Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口 ...
- mybatis的工作原理
MyBatis的框架架构 看到Mybatis的框架图,可以清晰的看到Mybatis的整体核心对象,我更喜欢用自己的图来表达Mybatis的整个的执行流程.如下图所示: 原理详解: MyBatis应用程 ...
- spring的自动装配,骚话@Autowired的底层工作原理
前言 开心一刻 十年前,我:我交女票了,比我大两岁.妈:不行!赶紧分! 八年前,我:我交女票了,比我小两岁,外地的.妈:你就不能让我省点心? 五年前,我:我交女票了,市长的女儿.妈:别人还能看上你?分 ...
- for循环 底层工作原理
for 循环是对容器进行迭代的过程. 什么是迭代? 迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止. for 循环的步骤是什么? 先判断对象是否为可迭代对象,不是的话直接报错,抛出 ...
- MyBatis基本工作原理
Application是程序员开发的Java代码,蓝色为MyBatis框架. API是MyBatis提供的增删改查等功能接口. 老式SQL写法我们在Dao中写SQL: SELECT * FROM us ...
随机推荐
- MySQL 04 深入浅出索引(上)
索引的常见模型 实现索引的方式有很多种,这里先介绍三种常见结构:哈希表.有序数组和搜索树. 哈希表:只适用于只有等值查询的场景. 有序数组:在等值查询和范围查询场景中的性能都非常优秀,但是在更新数据的 ...
- c# 判断程序是否Debug模式还是Release模式 调试模式,开发模式,发布模式
https://blog.csdn.net/qq_37664403/article/details/118747195 1.Debug模式,Release模式#if DEBUGConsole.Writ ...
- RestFul 标准Api
RestFul Api 规范(URL,HTTP,版本,状态码,返回值,请求条件等规范) get (select) :从服务器取出资源(一项或多项) post (Create) :在服务器新建一个资源 ...
- Hadoop:HDFS设计原理
一.HDFS组成结构 1.NameNode 相当于Master,主要存储文件的元数据(文件名.目录结构.文件属性等),以及每个文件的块列表和块所在的DataNode. 配置副本策略,管理数据库映射信息 ...
- leetcode 1406
简介 国服第一的刷题视频 参考链接 https://www.bilibili.com/video/BV1W54y197NM?from=search&seid=16875469481128889 ...
- ItemTouchHelper拖动结束取得目标索引位置
重写 clearView 要想取得目标索引位置,需要找到拖动结束,松开鼠标后的调用方法 //拖动完成之后调用,所操作的viewHolder即为目标位置的项目 @Override public void ...
- ETLCloud中如何执行SQL脚本
SQL脚本 在数据库管理与数据分析的广阔领域中,SQL(Structured Query Language,结构化查询语言)脚本扮演着举足轻重的角色.作为一门专为关系型数据库设计的编程语言,SQL不仅 ...
- ETL简介:数据集成与应用
导言: 在当今大数据时代,组织和企业需要处理和分析庞大的数据量.ETL(Extract, Transform, Load)是一种重要的数据集成和处理方法,它在数据管理和决策支持中起着关键作用.本文将介 ...
- SciTech-Python-编译Python的C/C++扩展的setup.py使用pybind映射C/C++到Python库
pybind:pybind11 - Seamless operability between C++11 and Python header-only library exposes C++ type ...
- SciTech-EE-Mobile-OTG: 切换Host与Device角色由手机USB接口取电为外部设备供电的方法
SciTech-EE-Mobile-OTG: 由手机USB接口取电为外部设备供电的方法 OTG接口与转换器 OTG是"On The Go"的英文缩写,字面上可以理解为"安 ...