MyBatis(一)执行流程概述

news2024/11/16 11:31:06

目录

    • 一、简介
    • 二、MyBatis执行流程
      • 1.读取核心配置文件 mybatis-config.xml
      • 2.构建会话工厂 SqlSessionFactory
      • 3.创建会话 SqlSession
      • 4.Executor 执行器
      • 5.MappedStatement 对象
      • 6.输入参数处理(map,list,String,Integer,pojo)
      • 7.操作数据库
      • 8.输出结果处理(map,list,String,Integer,pojo)
    • 三、总结

  • MyBatis官网: https://mybatis.net.cn/
  • MyBatis-Spring官网: https://mybatis.org/spring/zh/index.html
  • GitHub: https://github.com/mybatis/mybatis-3
  • Starter GitHub: https://github.com/mybatis/spring-boot-starter
  • Stater 官方文档: https://github.com/mybatis/spring-boot-starter/blob/master/mybatis-spring-boot-autoconfigure/src/site/zh/markdown/index.md

一、简介

首先,我们知道,MyBatis 是目前最流行的持久层框架。掌握 MyBatis 的执行流程是非常有必要的,理解了执行流程之后:

  • 可以更好地去掌握各个组件的关系;
  • 可以更好地去理解 SQL 的执行过程(参数映射、SQL解析、执行和结果处理)。

下面,我们一起来分析一下这个执行流程:

二、MyBatis执行流程

1.读取核心配置文件 mybatis-config.xml

第一件事就是要去读取 MyBatis 框架的核心配置文件:mybatis-config.xml

在这里插入图片描述

在这个配置文件中,有两块内容比较重要:

  • 第一个就是当前环境的配置,比如说需要指定当前操作的是哪一个数据库,并且指定用户名和密码。因为只有配置了这些,才能真正的操作数据库。
  • 第二个就是加载映射文件,比如说 UserMapper.xml,当然不仅仅只有这一个,会有多个映射文件,所以我们有两种配置映射文件的方式:
    1. 指定当前的映射文件;
    2. 指定映射文件所在包名,就相当于设置了一个扫描包,在 mapper 下面的所有映射文件都会进行加载。

在这里插入图片描述

配置文本如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 数据库连接信息 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!-- 加载SQL映射文件 -->
        <mapper resource="sample/mybatis/xml/mapper/CityMapper.xml"/>
        <!-- Mapper代理方式 -->
        <package name="sample.mybatis.xml.mapper"/>
    </mappers>
</configuration>

以上就是 MyBatis 核心配置文件的主要作用:加载核心配置 + 加载映射文件。

2.构建会话工厂 SqlSessionFactory

有了以上的这些配置,我们就要去操作数据库了。MyBatis 操作数据库主要是通过一个 SqlSession 对象来操作数据库,所以再往下这一步就是去创建 SqlSession,有专门的工厂对象 SqlSessionFactory 来进行创建。

从 SqlSessionFactory 的名称我们也可以看得出来,这是一个构建会话的工厂,全局只有一个,也就是说一个项目中只有一个,它可以批量去生产 SqlSession。SqlSession 我们上面说了,主要是用来操作数据库的。

3.创建会话 SqlSession

下一步就很简单了,就是通过工厂去创建 SqlSession。最终创建好的 SqlSession 中就包含了所有执行 SQL 语句的方法,它是跟数据库打交道的对象。每一次操作就会创建一次会话,存在多个会话。

那么有了这个会话之后,我们是不是就可以去操作数据库了呢?没错,但是真正去操作数据库的还有一个对象,叫做 Executor 执行器。

4.Executor 执行器

Executor 执行器主要是用来封装我们之前学习过的 JDBC 的一些操作。它是真正去操作数据库的接口,同时也去维护了一些缓存,比如一级缓存和二级缓存都是通过 Executor 执行器去维护的。

那么接下来是不是就是操作数据库了呢?其实也不是,在操作数据库之前还要去读取一些信息。

5.MappedStatement 对象

MappedStatement 对象是做什么用的呢?使用过 MyBatis 的应该知道,如果我们去操作数据库的话代码怎么写呢?是不是我们要先去定义一个 Mapper 接口,同时去编写一个 Mapper 接口的映射文件。比如下面这段就是 Mapper 映射文件中的某一段代码:

<select id="selectById" resultType="user">
	select * from t_user where id = #{id};
</select>

这是一段查询代码,其中包括了:

  • <select> 标签,证明当前是查询类型的方法;
  • id 对应 Mapper 接口中的方法名;
  • resultType 指定当前方法的返回值是一个 user;
  • 再往下,还有一条 SQL 语句,包括当前 SQL 中的条件 #{id} 都在这里定义好了。

那么当前标签中的这些信息,都是由 MappedStatement 对象来去读取存储的。下面是在源码中 debug 的一张截图:

在这里插入图片描述

其中 ms 就是一个 MappedStatement 对象,其中标红的地方是一些比较关键的信息:

  • resource:表示当前具体是哪个 Mapper,这里把路径也给表明出来了。
  • id:表示哪一个 Mapper 接口的什么方法。
  • sql:包含了占位符的 SQL 语句。
  • resultMap:最终 SQL 语句执行之后返回结果的封装就是通过 resultMap 来接收的。

到这里我们就知道了,当前的 MappedStatement 对象就是去封装某一个标签的,代表了某一次数据库的操作。有了这些之后,下面我们在操作数据库之前,还需要进行参数的处理。

6.输入参数处理(map,list,String,Integer,pojo)

比如说,你输入的参数是 map、list、String、Integer、pojo对象,最终都要把这些 Java 的对象转换成数据库所支持的类型,这是一个类型的转换,转换之后才能去真正的操作数据库。

7.操作数据库

这里就是使用 JDBC 获取连接之后,通过执行 SQL 来操作数据库。

8.输出结果处理(map,list,String,Integer,pojo)

操作数据库之后,还需要再去处理 SQL 的执行结果,将数据库中的类型转换为 Java 的类型。比如:map、list、String、Integer、pojo对象。

到此 MyBatis 的执行流程就结束了,步骤还是挺多的,下面画个图来梳理一下:

在这里插入图片描述

三、总结

MyBatis 的执行流程如下:

  1. 读取 MyBatis 配置文件:mybatis-config.xml 加载运行环境和映射文件;
  2. 构造会话工厂 SqlSessionFactory;
  3. 会话工厂创建 SqlSession 对象(包含了所有执行 SQL 语句的方法);
  4. 操作数据库的接口,Executor 执行器,同时负责查询缓存的维护;
  5. Executor 接口的执行方法中有一个 MappedStatement 类型的参数,封装了映射信息;
  6. 输入参数映射;
  7. 输出结果映射。

整理完毕,完结撒花~ 🌻

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

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

相关文章

[C语言]分支语句和循环语句

[C语言]分支语句和循环语句 文章目录 [C语言]分支语句和循环语句C语言语句分类分支语句if语法结构else的匹配规则switch语句switch语句中的breakswitch语句中default 循环语句while循环while循环中的break和continuefor循环for循环中的break和continuefor循环的变种do while循环…

ARM汇编【1】:数据类型

与高级语言类似&#xff0c;ARM支持对不同数据类型的操作。我们可以加载或存储的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展名是&#xff1a;-h或-sh表示半字&#xff0c;-b或-sb表示字节&#xff0c;不表示字的扩展名。有符号数据类型或无符号数据类型之…

二重积分小技巧---交换积分

又一个奇技淫巧。 【例1】 ∫ 0 1 d y ∫ y 1 x 3 1 d x ? \int _0 ^1 dy \int _{\sqrt y} ^ 1 \sqrt{x^3 1} dx ? ∫01​dy∫y ​1​x31 ​dx? 解析&#xff1a; 不说话&#xff0c;看下图&#xff1a; ∫ 0 1 d y ∫ y 1 x 3 1 d x ∫ 0 1 d x ∫ 0 x 2 x 3 1 d…

照亮虚拟网络流量“盲区”:超融合网络流量可视化功能解读

云计算时代下&#xff0c;网络虚拟化使网络管理更加集中、灵活和便捷&#xff0c;但同时也让云内的网络变得更加复杂。传统网络流量诊断方法和工具&#xff0c;难以对云内虚拟网络的“东-西向流量”进行可视化呈现和分析&#xff0c;形成了网络运维管理的盲区&#xff0c;提升了…

Shopify独立站也会被封店?告诉你这背后深藏的玄机!

很多人觉得做独立站就完全自由了&#xff0c;不被平台监管&#xff0c;也不会被封店。但事实真的是这样吗&#xff1f;其实独立站只是相对自由&#xff0c;受到的监管相对较少&#xff0c;封店的风险较小&#xff0c;但并不是完全高枕无忧。想知道什么情况下会被封店&#xff1…

无涯教程-PHP - 全局变量函数

全局变量 与局部变量相反,可以在程序的任何部分访问全局变量。通过将关键字 GLOBAL 放置在应被识别为全局变量的前面,可以很方便地实现这一目标。 <?php$somevar15;function addit() {GLOBAL $somevar;$somevar;print "Somevar is $somevar";}addit(); ?> …

MyBatis快速入门以及环境搭建和CRUD的实现

目录 前言 一、MyBatis简介 1.MyBatis是什么 2.MyBatis的特点 3.mybatis的作用 4.MyBatis的应用场景 5.MyBatis优缺点 二、相关概念 1.ORM概述 2.常见的ORM框架 3.什么是持久层框架 三、MyBatis的工作原理 1.框架交互 2.工作原理 ​编辑 四、MyBatis环境搭建 1…

SQL - 开窗(窗口)函数

什么是开窗函数&#xff1f; 开窗函数对一组值进行操作&#xff0c;它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列 开窗函数的语法形式为&#xff1a;函数 over(partition by <分组用列> order by …

Vue2到3 Day7 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…

LangChain + Streamlit + Llama:将对话式AI引入本地机器

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS&#xff1f; 大型语言模型 &#xff08;LLM&#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的…

PCIE 信息

PCIe&#xff08;外围组件互连快件&#xff09;是用于连接高速组件的接口标准。每台台式电脑主板有许多 PCIe 插槽&#xff0c;可用于添加通用显卡&#xff0c;各种外设卡&#xff0c;无线网卡或固态硬盘等等。PC 中可用的 PCIe 插槽类型将取决于你购买的主板. PCIe 插槽有不同…

无需公网IP——搭建web站点

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

9.4 多线程之线程池

线程池 进程已经能做到并发编程了 , 为什么还需要线程 ? 进程实在是太重量了 , 创建和销毁成本都比较高 , 需要申请释放资源 线程就是针对上述问题的优化 , 因为他是共用同一组系统资源的 , 一旦资源申请好了 , 后续就不需要再继续申请了 虽然线程已经很好了 , 不过在更高频…

浙大全日制英文MBA项目提面申请截至9月3日:几乎是上岸必经之路

今年浙大全日制MBA项目提前批面试做了改革&#xff0c;一年只设定一个批次申请&#xff0c;对于考生们来说其实是不太有利的&#xff0c;原因在于整个提面时间节奏会将部分考生逼到进退两难的境地&#xff0c;一方面无提面的状态下全日制MBA项目都知道需要比较高的分数才可能够…

计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

GC的前置工作,聊聊GC是如何快速枚举根节点的

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 什么是根节点枚举根节点枚举存在的问题如何解决根节点枚举的问题安全点安全区域 上篇文章中我们留下了个坑&#xff1a;「 根节点枚举」…

计网第三章(数据链路层)(四)

目录 一、MAC地址和IP地址以及ARP协议 1.MAC地址&#xff1a; 单播MAC地址&#xff1a; 广播MAC地址&#xff1a; 多播MAC地址&#xff1a; 2.IP地址&#xff1a; 3.IP地址和MAC地址&#xff1a; 1.什么情况下使用&#xff1f; 2.IP地址和MAC地址填写位置&#xff1f;…

保障用户观影体验 极米推出首款搭载超级混光技术投影仪极米RS Pro 3

随着投影市场的日渐蓬勃&#xff0c;倒推了投影技术的研发创新&#xff0c;投影仪产品在最近几年已经逐步进入到家庭空间&#xff0c;成为很多家庭不可或缺的家电产品&#xff0c;不论是客厅还是卧室&#xff0c;或者是户外露营等&#xff0c;投影仪的家用场景已经拓展到了人们…

ps2024后期调色滤镜插件使用教程图解

Exposure是一款常见的ps调色滤镜插件&#xff0c;相信许多朋友都曾经用过它。一个优秀的摄像师不仅需要懂得摄像技巧&#xff0c;还要掌握图像的后期调色窍门。那么&#xff0c;后期调色软件哪个好&#xff0c;后期调色教程图解&#xff0c;接下来一起来了解一下吧。 一、后期…