MyBatis的执行流程分析
核心流程介绍
我们都知道 MyBatis 是对 JDBC 的封装,不管怎样,JDBC 的那一套还是不会变的,只是做了抽象、封装、归类等;所以我们顺着 JDBC 的思路来说下MyBatis的执行流程,JDBC执行六部走
- 注册驱动
- 获取Connection连接
- 执行预编译
- 执行SQL
- 封装结果集
- 释放资源
然后通过这张图来分析下MyBatis的是怎样来封装这个过程的:

MyBatis执行八步走
上面中流程就是 MyBatis 内部核心流程,咱么来一步步解释下
- 读取
MyBatis的核心配置文件。mybatis-config.xml为MyBatis的全局配置文件,用于配置数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器 (mapper.xml)等信息,这个核心配置文件最终会被封装成一个Configuration对象。 - 加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,映射文件是在
mybatis-config.xml中加载;可以加载多个映射文件,每个文件对应数据库中的—张表。配置的方式有两种:
<!-- 使用包路径,扫描包下所有的接口,这种方式比较方便 -->
<package name="com.mybatis.demo"/>
<!-- resource∶使用相对路径的资源引用-->
<!-- url∶使用绝对类路径的资源引用-->
<!-- class∶使用映射器接口实现类的完全限定类名-->
<mapper resource="xxx.xml"/>
构造会话工厂获取
SqlSessionFactory。这个过程其实是用建造者设计模式使用SqlSessionFactoryBuilder对象构建的,SqlSessionFactory的的最佳作用域是应用作用域创建会话对象
SqlSession。由会话工厂创建SqlSession对象,对象中包含了执行SQL语句的所有方法,每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。Executor执行器。是MyBatis的核心,负责 SQL 语句的生成和查询缓存的维护,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护SimpleExecutor -SIMPLE就是普通的执行器。ReuseExecutor-执行器会重用预处理语句(PreparedStatements)BatchExecutor--它是批处理执行器
MappedStatement对象。MappedStatement是对解析的SQL的语句封装,一个MappedStatement代表了一个sql语句标签,如下∶
<select id="selectUserList" resultType="com.mybatis.User">
select * from t_user
</select>
- 输入参数映射。输入参数类型可以是基本数据类型,也可以是 Map 、List 、 POJO 类型复杂数据类型,这个过程类似于 JDBC 的预编译处理参数的过程。
- 封装结果集。可以封装成多种类型可以是基本数据类型,也可以是 Map、 List 、 P0JO 类型复杂数据类型。封装结果集的过程就和 JDBC 封装结果集是一样的。
这样一对比,就可以看出了其实 Mybatis 的执行流程和 JDBC 其实大同小异
如果用代码表示如下∶
// 1.加载配置文件
InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xmL");
// 2.创建SqLSessionFactory对象实际创建的是Default SqLSessionFactory对象
SqlSessionFactory builder=new SqlSessionFactoryBuilder().build(inputStream);
//3.创建SqLSession对象实际创建的是DefaultSqLSess ion对象
SqLSession sqLSession= builder.openSession();
// 4.创建代理对象
UserMapper mapper=sqLSession.getMapper(UserMapper. class);
// 5.执行查询语句
List<User> users = mapper.selectUserList();
小结
这节主要通过对 JDBC 执行步骤的分析来对比分析 MyBatis 的执行的流程,总体上来看它们的执行步骤基本是一样的,所以大家是不是觉得 MyBatis 这个框架其实也挺简单的,总结下就是
- 加载解析配置文件
- 处理参数
- 执行查询
- 封装结果集
MyBatis的执行流程分析的更多相关文章
- 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)
最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, ...
- 深入浅出Mybatis系列十-SQL执行流程分析(源码篇)
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前 ...
- Mybatis 系列10-结合源码解析mybatis 的执行流程
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- MyBatis详细执行流程
mybatis详细执行流程 一.通过Resource去加载全局配置文件 import org.apache.ibatis.io.Resources; import org.apache.ibatis. ...
- 报时机器人的rasa shell执行流程分析
本文以报时机器人为载体,介绍了报时机器人的对话能力范围.配置文件功能和训练和运行命令,重点介绍了rasa shell命令启动后的程序执行过程. 一.报时机器人项目结构 1.对话能力范围 (1)能够 ...
- ThinkPHP 框架执行流程分析
总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode ...
- Spring 文件上传MultipartFile 执行流程分析
在了解Spring 文件上传执行流程之前,我们必须知道两点: 1.Spring 文件上传是基于common-fileUpload 组件的,所以,文件上传必须引入此包 2.Spring 文件上传需要在X ...
- [转]两表join的multi update语句在MySQL中的执行流程分析
出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...
- Hive SQL执行流程分析
转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command ...
- spark-sql执行流程分析
spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生 ...
随机推荐
- .NET周刊【8月第3期 2023-08-20】
国内主题 抓的是周树人,与我鲁迅有什么关系? https://www.cnblogs.com/JulianHuang/p/17642511.html 问题:作者看到了一个关于Dictionary.Cl ...
- TIDB - 分布式数据库
TIDB(一) 重点 TIDB核心 数据存储-RocksDB Raft 协议 选举 数据同步 MVCC 表数据与kv映射关系 索引数据与kv 映射关系 元数据和sql 层计算 PD调度 HTAP 特性 ...
- 达梦数据库-DW-国产化--九五小庞
武汉达梦数据库股份有限公司成立于2000年,是国内领先的数据库产品开发服务商,国内数据库基础软件产业发展的关键推动者.公司为客户提供各类数据库软件及集群软件.云计算与大数据等一系列数据库产品及相关技术 ...
- MySQL实战实战系列 00 开篇词 这一次,让我们一起来搞懂MySQL
你好,我是林晓斌,网名"丁奇",欢迎加入我的专栏,和我一起开始 MySQL 学习之旅.我曾先后在百度和阿里任职,从事 MySQL 数据库方面的工作,一步步地从一个数据库小白成为 M ...
- Solution -「HNOI 2010」城市建设
Description Link. 修改边权的动态 MST. Solution 讲清楚点. 修改边权的 MST,考虑对时间分治.设我们当前操作的操作区间是 \([l,r]\),直接暴力找 MST 是不 ...
- python实现简单的爬虫功能
前言Python是一种广泛应用于爬虫的高级编程语言,它提供了许多强大的库和框架,可以轻松地创建自己的爬虫程序.在本文中,我们将介绍如何使用Python实现简单的爬虫功能,并提供相关的代码实例. 如何实 ...
- Matlab 设计仿真CIC滤波器
2023.09.26 使用CIC滤波器用于降采样.同样的,CIC滤波器也适用于升采样. 参考连接: [1] Matlab中CIC滤波器的应用_dsp.cicdecimator_张海军2013的博客-C ...
- android开发阶段性技能
一.初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android UI控件.Android Java层API相关使用. 迈向中级,最好再次更新下Java ...
- 银河麒麟V10 修改文件夹权限
并不建议修改系统文件夹的权限,防止终端失效 指令:获取所有权限 指令:写入可执行权限 chmod +x filename//filename 是文件路径 TRANSLATE with x Englis ...
- WC 2023 冬眠记
打得很烂,果然还是太菜了. Day -? 连第二课堂都听不懂,我选择冬眠. Day 1 发压缩包时看大小猜测今年又有交互题.果不其然. 那就只剩下两道可做题了(悲) 通读题面,尝试思考 T1,无果,周 ...