MyBatis 源码剖析-项目总览

MyBatis 源码剖析-项目总览

1.概述

本文主要大致先容一下MyBatis的项目结构。引用参考资料《MyBatis手艺内幕》

此外,https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰着一些问题,可以参考一下。

2.模块划分

MyBatis在项目模块划分照样很清晰的。各个模块条理以及详细作用,如下:

模块 条理 界说
session 接口层 提供给外部使用的接口API
scripting 焦点处置层 剖析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。
mapping 焦点处置层 映射
builder 焦点处置层 设置剖析
executor 焦点处置层 执行器模块,串联整个执行流程。
plugin 焦点处置层 插件模块:提供插件接口,通过自界说插件方式对MyBatis举行拓展
cursor 焦点处置层 游标模块
reflection 基础支持层 反射模块:mybatis专门对反射模块举行封装。提供加倍简朴易用的API
type 基础支持层 类型转换模块:Mybatis为简化设置提供了别名机制。提供java类型与JDBC类型转换
logging 基础支持层 日志模块:主要是集成第三方日志
io 基础支持层 资源加载模块:对类加载器举行了封装。确定类加载器顺序,并提供加载文件,以及其他资源的功效
datasource 基础支持层 数据源模块:mybatis自身提供响应的数据源实现,也提供与第三方数据集成的接口。
transaction 基础支持层 事务治理模块:Mybatis 对数据库的事务举行了抽象
parsing 基础支持层 剖析器模块:提供两个功效:1. 对XPath举行封装 2为处置动态sql语句中的占位符提供支持
cache 基础支持层 缓存模块:提供一级缓存、二级缓存。优化查询
binding 基础支持层 Binding模块:将自界说的接口与映射设置文件关联起来。通过挪用mapper接口完成数据库执行。
exceptions 基础支持层 异常处置
annotations 基础支持层 注解模块
jdbc 其他 JDBC模块
lang 其他 Lang模块

整体结构

整体分为三层:

  • 接口层:界说了MyBatis露出给应用程序挪用的API。
  • 焦点处置层:实现了MyBatis的焦点处置流程,包罗MyBatis初始化以及完成一次数据库操作的涉及的所有流程。
  • 基础支持层:为焦点处置层提供了优越的基础支持。例如:反射、类型转换、日志、缓存、事务等模块。

MyBatis 源码剖析-项目总览

3.1 基础支持层

3.1.1 反射模块

对应reflection

Java中的反射虽然功效壮大,但对大多数开发职员来说,写出高质量的反射代码照样有一定难度的。MyBatis 中专门提供了  
反射模块,该模块对Java原生的反射举行了优越的封装,提供了加倍简练易用的API, 利便上层使挪用,而且对反射操作举行  
了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。

3.1.2 类型转换模块

对应type

正如前面示例所示,MyBatis 为简化设置文件提供了别名机制,该机制是类型转换模块的主要功效之一。 类型转换模块的  
另-一个功效是实现JDBC类型与Java类型之间的转换,该功效在为SQL语句绑定实参以及映射查询效果集时都市涉及。在为  
SQL语句绑定实参时,会将数据由Java类型转换成JDBC类型;而在映射效果集时,会将数据由JDBC类型转换成Java类型。类   
型转换模块的详细原理在第2章详述。

3.1.3 日志模块

对应logging

无论在开发测试环境中,照样在线上生产环境中,日志在整个系统中的职位都是非常主要的。优越的日志功效可以辅助开发人  
员和测试职员快速定位Bug代码,也可以辅助运维职员快速定位性能瓶颈等问题。现在的Java天下中存在许多优异的日志框  
架,例如Log4j、Log4j2、 slf4j 等。MyBatis 作为-一个设计优良的框架,除了提供详细的日志输出信息,还要能够集  
成多种日志框架,其日志模块的一个主要功效就是集成第三方日志框架。

3.1.4 资源加载模块

对应io

资源加载模块主要是对类加载器举行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功效。

3.1.5 剖析器模块

对应parsing

剖析器模块的主要提供了两个功效:一个功效是对XPath举行封装,为MyBatis初始化时剖析mybatis- config.xml设置文  
件以及映射设置文件提供支持;另一个功效是为处置动态SQL语句中的占位符提供支持。

3.1.6 数据源模块

对应datasource

数据源是现实开发中常用的组件之一。 现在开源的数据源都提供了对照丰富的功效,例如,毗邻池功效、检测毗邻状态等,  
选择性能优异的数据源组件对于提升ORM框架甚至整个应用的性能都是非常主要的。MyBatis 自身提供了响应的数据源实  
现,固然MyBatis也提供了与第三方数据源集成的接口,这些功效都位于数据源模块之中。

3.1.7 事务治理

对应transaction

MyBatis对数据库中的事务举行了抽象,其自身提供了响应的事务接口和简朴实现。在许多场景中,MyBatis 会与Spring  
框架集成,并由Spring框架治理事务

3.1.8 缓存模块

对应cache

在优化系统性能时,优化数据库性能是非常主要的一个环节,而添加缓存则是优化数据库时最有用的手段之一。准确、合理地  
使用缓存可以将一部分数据库请求阻挡在缓存这一层。MyBatis 中提供了一 级缓存和二级缓存,而这两级缓存都是依赖于基  
础支持层中的缓存模块实现的。这里需要读者注重的是,MyBatis中自带的这两级缓存与MyBatis 以及整个应用是运行在同  
一个JVM中的,共享统一块堆内存。若是这两级缓存中的数据量较大,则可能影响系统中其他功效的运行,以是当需要缓存大  
量数据时,优先思量使用Redis、Memcache 等缓存产物。

3.1.9 Binding模块

对应binding

如何入门机器学习

通过前面的示例我们知道,在挪用SqlSession响应方式执行数据库操作时,需要指定映射文件中界说的SQL节点,若是泛起  
拼写错误,我们只能在运行时才气发现响应的异常。为了尽早发现这种错误,MyBatis 通过Binding模块将用户自界说的  
Mapper接口与映射设置文件关联起来,系统可以通过挪用自界说Mapper接口中的方式执行响应的SQL语句完成数据库操作,  
从而制止上述问题。值得读者注重的是,开发职员无须编写自界说Mapper接口的实现,MyBatis 会自动为其建立动态署理对  
象。在有些场景中,自界说Mapper接口可以完全取代映射设置文件,但有的映射规则和SQL语句的界说照样写在映射设置文件  
中对照利便,例如动态SQL语句的界说。

3.1.10 注解模块

对应annotation

随着 Java 注解的逐步盛行,MyBatis 提供了注解的方式,使得我们利便的在 Mapper 接口上编写简朴的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 花样的 Mapper 文件中。虽然说,现实场景下,人人照样喜欢在 XML 花样的 Mapper 文件中编写响应的 SQL 操作。

3.1.11 异常模块

对应 exceptions

界说了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常,此外还包ExceptionFactory异常工厂。

3.2 焦点处置层

3.2.1 设置剖析

对应executor

在MyBatis初始化历程中,会加载mybatis config.xml设置文件、映射设置文件以及Mapper接口中的注解信息,剖析后  
的设置信息会形成响应的工具并保存到Configuration工具中。例如,示例中界说的<resultMap>节点(即ResultSet的映  
射规则)会被剖析成ResultMap工具;示例中界说的<result>节点(即属性映射)会被剖析成ResultMapping工具。之后,利  
用该Configuration工具建立SqlSessionFactory工具。待MyBatis 初始化之后,开发职员可以通过初始化获得  
SqlSessionFactory 建立SqlSession工具并完成数据库操作。

3.2.2 SQL剖析与Scripting模块

对应executor scripting

拼集SQL语句是一件烦琐且易失足的历程,为了将开发职员从这项死板无趣的工作中解脱出来,MyBatis实现动态SQL语句的   
功效,提供了多种动态SQL语句对应的节点,例如,<where>节点、 <if>节点、 <foreach> 节点等。通过这些节点的组合  
使用,开发职员可以写出险些知足所有需求的动态SQL语句。MyBatis中的scripting模块会凭据用户传入的实参,剖析映射   
文件中界说的动态SQL节点,并形成数据库可执行的SQL语句。之后会处置SQL语句中的占位符,绑定用户传入的实参。

3.2.3 SQL执行

对应executor

SQL语句的执行涉及多个组件,其中对照主要的是Executor 、StatementHandler 、ParameterHandler和  
ResultSetHandler. Executor 主要卖力维护- - 级缓存和二级缓存,并提供事务治理的相关操作,它会将数据库相关  
操作委托给StatementHandler完成。StatementHandler首先通过ParameterHandler 完成SQL语句的实参绑定,然后  
通过java. sql.Statement工具执行SQL语句并获得效果集,最后通过ResultSetHandler完成效果集的映射,获得效果  
工具并返回。

MyBatis 源码剖析-项目总览

3.2.4 插件

对应plugin

Mybatis 自身的功效虽然壮大,然则并不能完善切合所有的应用场景,因此MyBatis提供了插件接口,我们可以通过添加用  
户自界说插件的方式对MyBatis举行扩展。用户自界说插件也可以改变Mybatis的默认行为,例如,我们可以阻挡SQL语句并  
对其举行重写。由于用户自界说插件会影响MyBatis的焦点行为,在使用自界说插件之前,开发职员需要领会MyBatis内部的  
原理,这样才气编写出平安、高效的插件。

3.3 接口层

对应session

接口层相对简朴,其焦点是SqlSession 接口,该接口中界说了MyBatis 露出给应用程序挪用的API,也就是上层应用与  
MyBatis交互的桥梁。接口层在接收到挪用请求时,会挪用焦点处置层的响应模块来完成详细的数据库操作。

3.4 其他层

3.4.1 JDBC模块

对应 jdbc

JDBC单元测试支持类。【只能说是个测试挂件,白送都不要的那种,随便看看得了 】

3.4.2 Lang模块

内里只包罗两个注解【从挪用上似乎没有任何类用到这个。不知道干啥用的!!原谅我的无知。】

3.5 小结

整体来说,MyBatis的代码结构照样对照简朴易懂的。而且分包也对照清晰,见名知意。下面就是MyBatis的整体架构图

MyBatis 源码剖析-项目总览

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/542.html