MyBatis(一)执行流程概述

一、简介

首先,我们知道,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. 输出结果映射。

整理完毕,完结撒花~ 🌻

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不愿放下技术的小赵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值