乐趣区

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

MyBatis 是 Java 生态中十分驰名的一款 ORM 框架,目前在一线互联网大厂中利用宽泛,Mybatis 曾经成为了一个必会框架。

如果你想要进入一线大厂,可能纯熟应用 MyBatis 开发曾经是一项十分根本的技能,同时大厂也更心愿本人的开发人员深刻理解 MyBatis 框架的原理和外围实现。

从这个角度看,了解 MyBatis 原理,浏览 MyBatis 外围源码,这样更有利于进步职场竞争力。

在深刻理解 Mybatis 的源码之前,咱们先理解一下 Mybatis 的整体架构和工作原理,这样有助于咱们在浏览源码过程中理解思路和流程 @mikechen。

Mybatis 架构设计

咱们把 Mybatis 的性能架构分为三层:

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

接口层

接口层:次要就是和数据库交互,提供给内部应用的接口 API,开发人员通过这些本地 API 来操纵数据库,接口层一接管到调用申请就会调用数据处理层来实现具体的数据处理。

以应用 Mapper 接口为例,将配置文件中的每一个 节点形象为一个 Mapper 接口,这个接口中申明的办法和跟 Mapper.xml 中的 节点项对应。

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

配置好后,MyBatis 会依据接口申明的办法信息,通过 动静代理机制生成一个 Mapper 实例,当调用接口办法时,依据这个办法的办法名和参数类型,确定 Statement Id,底层还是通过 SqlSession.select/update(“statementId”, parameter) 等来实现对数据库的操作。

数据处理层

数据处理层:能够说是 MyBatis 的外围,负责具体的 SQL 查找、SQL 解析、SQL 执行和执行后果映射解决等,它次要的目标是依据调用的申请实现一次数据库操作。

从大的方面上讲,它要实现两个性能:

  • 通过传入参数构建动静 SQL 语句
  • SQL 语句的执行以及封装查问后果集

1. 通过传入参数构建动静 SQL 语句

动静语句生成可能说是 MyBatis 框架很是优雅的一个设计,MyBatis 通过传入的参数值,应用 Ognl 来动静地结构 SQL 语句,使得 MyBatis 有很强的灵活性和扩展性。

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

  • 查问阶段
  • 查问后果集转换阶段

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

另外一个就是对 resultset 查问后果集的 jdbcType 数据转换成 java 数据类型。

2. SQL 语句的执行以及封装查问后果集

动静 SQL 语句生成当前,MyBatis 将执行 SQL 语句,并将可能返回的后果集转换成 List<E> 列表。

MyBatis 在对后果集的解决中,反对后果集关系一对多和多对一的转换,而且有两种反对形式,一种为嵌套查问语句的查问,还有一种是嵌套后果集的查问。

根底撑持层

根底撑持层是整个 MyBatis 框架的地基,负责最根底的性能撑持,包含连贯治理、事务管理、配置加载和缓存解决,这些都是共用的货色,将他们抽取进去作为最根底的组件,为下层的数据处理层提供最根底的撑持。

1. 缓存机制

数据库是实际生成中十分外围的存储,很多业务数据都会落地到数据库,所以数据库性能的优劣间接影响了下层业务零碎的优劣。

咱们很多线上业务都是读多写少的场景,在数据库遇到瓶颈时,缓存是最无效、最罕用的伎俩之一,正确应用缓存能够将一部分数据库申请拦挡在缓存这一层,这就可能缩小一部分数据库的压力,进步零碎性能。

除了应用 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 外围执行流程

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

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 的架构从全局上做了一个拆解,后续我将重点剖析其外围源码,这样先全局再部分,这样更有利于把握其外围原理实现,心愿这个框架系列能对你有所用。

以上

作者简介

陈睿 |mikechen,10 年 + 大厂架构教训,《BAT 架构技术 500 期》系列文章作者,分享十余年 BAT 架构教训以及面试心得!

浏览 mikechen 的互联网架构更多技术文章合集

Java 并发 |JVM|MySQL|Spring|Redis| 分布式 | 高并发 | 架构师

关注「mikechen 的互联网架构」公众号,回复 【架构】 支付我原创的《300 期 + BAT 架构技术系列与 1000 + 大厂面试题答案》

退出移动版