深入详解 Mybatis 的架构原理与 6 大核心流程

MyBatis 是 Java 生态中十分闻名的一款 ORM 结构,现在在一线互联网大厂中应用广泛,Mybatis 已经成为了一个必会结构。

假如你想要进入一线大厂,可以娴熟运用 MyBatis 开发已经是一项十分根本的技能,同时大厂也更希望自己的开发人员深入了解 MyBatis 结构的原理和中心完结。

从这个视点看,了解 MyBatis 原理,阅览 MyBatis 中心源码,这样更有利于进步职场竞争力。

在深入了解 Mybatis 的源码之前,咱们先了解一下 Mybatis 的整体架构和工作原理,这样有助于咱们在阅览源码进程中了解思路和流程 000

Mybatis 架构设计

咱们把 Mybatis 的功用架构分为三层:

  1. API 接口层
  2. 数据处理层
  3. 根底支撑层

深入详解 Mybatis 的架构原理与 6 大核心流程

接口层

接口层:主要便是和数据库交互,供给给外部运用的接口 API,开发人员经过这些本地 API 来操纵数据库,接口层一接收到调用恳求就会调用数据处理层来完结详细的数据处理。

深入详解 Mybatis 的架构原理与 6 大核心流程

以运用 Mapper 接口为例,将装备文件中的每一个 节点笼统为一个 Mapper 接口,这个接口中声明的办法和跟 Mapper.xml 中的 节点项对应。

id 值对应办法名称,parameterType 值对应办法的入参类型,而 resultMap 值则对应返回值类型。

深入详解 Mybatis 的架构原理与 6 大核心流程

装备好后,MyBatis 会依据接口声明的办法信息,经过动态署理机制生成一个 Mapper 实例,当调用接口办法时,依据这个办法的办法名和参数类型,确认 Statement Id,底层仍是经过 SqlSession.select/update (“statementId”, parameter) 等来完结对数据库的操作。

数据处理层

数据处理层:可以说是 MyBatis 的中心,担任详细的 SQL 查找、SQL 解析、SQL 履行和履行成果映射处理等,它主要的意图是依据调用的恳求完结一次数据库操作。

深入详解 Mybatis 的架构原理与 6 大核心流程

从大的方面上讲,它要完结两个功用:

  • 经过传入参数构建动态 SQL 句子
  • SQL 句子的履行以及封装查询成果集

1. 经过传入参数构建动态 SQL 句子

动态句子生成可以说是 MyBatis 结构很是高雅的一个设计,MyBatis 经过传入的参数值,运用 Ognl 来动态地结构 SQL 句子,使得 MyBatis 有很强的灵活性和扩展性。

参数映射指的是关于 java 数据类型和 jdbc 数据类型之间的转化,这里有包含两个进程:

  • 查询阶段
  • 查询成果集转化阶段

查询阶段要将 java 类型的数据,转化成 jdbc 类型的数据,经过 preparedStatement.setXXX () 来设值;

别的一个便是对 resultset 查询成果集的 jdbcType 数据转化成 java 数据类型。

2. SQL 句子的履行以及封装查询成果集

动态 SQL 句子生成今后,MyBatis 将履行 SQL 句子,并将可能返回的成果集转化成 List 列表。

MyBatis 在对成果集的处理中,支撑成果集关系一对多和多对一的转化,而且有两种支撑方法,一种为嵌套查询句子的查询,还有一种是嵌套成果集的查询。

根底支撑层

根底支撑层是整个 MyBatis 结构的地基,担任最根底的功用支撑,包含衔接办理、业务办理、装备加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最根底的组件,为上层的数据处理层供给最根底的支撑。

深入详解 Mybatis 的架构原理与 6 大核心流程

1. 缓存机制

数据库是实践生成中十分中心的存储,许多业务数据都会落地到数据库,所以数据库功用的优劣直接影响了上层业务体系的优劣。

咱们许多线上业务都是读多写少的场景,在数据库遇到瓶颈时,缓存是最有效、最常用的手段之一,正确运用缓存可以将一部分数据库恳求阻拦在缓存这一层,这就可以削减一部分数据库的压力,进步体系功用。

深入详解 Mybatis 的架构原理与 6 大核心流程

除了运用 Redis、Memcached 等外置的第三方缓存以外,耐久化结构一般也会自带内置的缓存,例如,MyBatis 就供给了一级缓存和二级缓存,详细完结坐落根底支撑层的缓存模块中。

2. 反射东西

该模块对 Java 原生的反射进行了良好的封装,供给了更加简练易用的 API ,便利上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,进步了反射操作的功用。

3. 类型转化

类型转化模块供给了两个主要功用,一个功用是别号机制,MyBatis 为了简化装备文件供给了别号机制。

另一个功用是完结 JDBC 类型与 Java 类型之间的转化,该功用在为 SQL 句子绑定实参以及映射查询成果集时都会涉及。

4. 日志

供给详细的日志输出信息,并且可以集成多种日志结构,其日志模块的一个主要功用便是集成第三方日志结构。

5. 资源加载

资源加载模块主要是对类加载器进行封装,确认类加载器的运用次序,并供给了加载类文件以及其他资源文件的功用。

6. 解析器

解析器模块主要供给两个功用,一个功用是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 装备文件以及映射装备文件供给支撑。

另一个功用是为处理动态 SQL 句子中的占位符供给支撑。

7. 业务办理

耐久层结构一般都会供给一套业务办理机制完结数据库的业务操控,MyBatis 对数据库中的业务进行了一层简略的笼统,供给了简略易用的业务接口和完结。

一般情况下,Java 项目都会集成 Spring,并由 Spring 结构办理业务。

8.Binding

在调用 SqlSession 相应办法履行数据库操作时,需要指定映射文件中界说的 SQL 节点,假如呈现拼写过错,咱们只能在运转时才干发现相应的反常。为了尽早发现这种过错,MyBatis 经过 Binding 模块将用户自界说的 Mapper 接口与映射装备文件相关起来,体系可以经过调用自界说 Mapper 接口中的办法履行相应的 SQL 句子完结数据库操作,从而避免上述问题。

需要留意的是,开发人员无须编写自界说 Mapper 接口的完结,MyBatis 会自动为其创建动态署理目标。

9. 数据源

关于 ORM 结构而言,数据源的组织是一个十分重要的一部分,这直接影响到结构的功用问题。

数据库衔接是一项有限的贵重资源,一个数据库衔接目标均对应一个物理数据库衔接,每次操作都翻开一个物理衔接,运用完都关闭衔接,这样造成体系的功用低下。

数据库衔接池的解决方案是在应用程序启动时树立满足的数据库衔接,并将这些衔接组成一个衔接池,由应用程序动态地对池中的衔接进行请求、运用和开释。

翻开 Mybatis 源码找到 datasource 包下就可以看到衔接池的完结,如下图所示:

深入详解 Mybatis 的架构原理与 6 大核心流程

Mybatis 中心履行流程

mybatis 的总体履行流程,总结如下:

深入详解 Mybatis 的架构原理与 6 大核心流程

1.MyBatis 装备文件

config.xml:装备了全局装备文件,装备了 MyBatis 的运转环境等信息。

mapper,xml:sql 的映射文件,装备了操作数据库的 sql 句子,此文件需在 config.xml 中加载。

2.SqlSessionFactory

经过 MyBatis 环境等装备信息结构 SqlSessionFactory(会话工厂)。

3.SqlSession

经过会话工厂创建 SqlSession(会话),对数据库进行增修改查操作。

4.Exector 履行器

MyBatis 底层自界说了 Exector 履行器接口来详细操作数据库,Exector 接口有两个完结,一个根本履行器(默许),一个是缓存履行器,SqlSession 底层是经过 Exector 接口操作数据库。

5.MappedStatement

MyBatis 的一个底层封装目标,它包装了 MyBatis 装备信息与 sql 映射信息等。mapper.xml 中的 insert/select/update/delete 标签对应一个 MappedStatement 目标。标签的 id 便是 MappedStatement 的 id。

MappedStatement 对 sql 履行输入参数进行界说,包含 HashMap、根本类型、pojo、Executor 经过 MappedStatement 在履行 sql 前将输入的 Java 目标映射至 sql 中,输入参数映射便是 JDBC 编程对 preparedStatement 设置参数。

MappedStatement 对 sql 履行输出成果进行界说,包含 HashMap、根本类型、pojo,Executor 经过 MappedStatement 在履行 sql 后将输出成果映射至 Java 目标中,输出成果映射便是 JDBC 编程对成果的解析处理进程。

​到此我就把 Mybatis 的架构从全局上做了一个拆解,后续我将要点分析其中心源码,这样先全局再局部,这样更有利于掌握其中心原理完结,希望这个结构系列能对你有所用。