Mybatis技术内幕(一)——总体架构概览

Mybatis技术内幕(一)——总体架构概览

Mybatis的总体架构分为三层,分别是基础支持层核心处理层接口层java

如图所示:sql

1、基础支持层

基础支持层包含整个Mybatis的基础模块,这些模块为核心处理层的功能提供了良好的支撑。下面简单描述各个模块的功能。数据库

  • 反射模块缓存

    Mybatis中专门提供了反射模块,该模块对Java原生的反射进行了良好的封装,提供了更加简洁易用的API,方便上层使用,而且对反射操做进行了一系列优化,例如缓存了类的元数据,提升了反射操做的性能。安全

  • 类型转换模块mybatis

    为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。类型转换模块的另外一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。在为SQL语句绑定实参时,会将数据由 Java 类型转换 JDBC 类型;而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。架构

  • 日志模块app

    MyBatis 做为一个设计优良的框架,除了提供详细的日志输出信息,还要可以集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。框架

  • 资源加载模块性能

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

  • 解析器模块

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

  • 数据源模块

    MyBatis 自身提供了相应的数据源实现,固然 MyBatis 也提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中。

  • 事务管理

    MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。但在大多数场景当中,Mybatis 会与 Spring 框架集成,并由 Spring 框架来管理事务。

  • 缓存模块

    My Batis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓模块实现的。这里须要注意的是, MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。若是这两级缓存中的数据量较大, 则可能影响系统中其余功能的运行,因此当须要缓存大量数据时 ,优先考虑使用 Redis、 Memcache 等缓存产品。

  • Binding模块

    Binging模块能够在编译器帮助咱们检查在映射文件中定义的SQL节点是否有出现错误

注意:开发人员无须编写自定义 Mapper 接口的实现, MyBatis 会自动为其建立动态代理对象。在有些场景中,自定义 Mapper 接口能够彻底代替映射配置文件,但有的映射规则和 SQL 语句的定义仍是写在映射配置文件中比较方便,例如动态 SQL语句的定义。

2、核心处理层

在核心处理层中实现了Mybatis的核心处理流程,其中包括Mybatis的初始化以及完成依次数据库操做所涉及的所有流程。

  • 配置解析

    在 MyBatis 初始化过程当中,会加载 mybatis-config.xml 配置文件、映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会造成相应的对象并保存到 Configuration 对象中。以后,利用该 configuration 对象建立 SqlSessionFactory 对象。待 MyBatis 初始化以后,开发人员能够经过初始化获得 SqlSessionFactory 建立 SqlSession 对象并完成数据库操做。

  • SQL解析与scripting模块

    MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点,例如,<where>节点、<if>节点、<foreach>节点等。经过这些节点的组合使用, 开发人员能够写出几乎知足全部需求的动态SQL语句。 MyBatis 中的 scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并造成数据库可执行的 SQL 语句 。以后会处理 SQL 语句中的占位符,绑定用户传入的实参。

  • SQL执行

    SQL 语句的执行涉及多个组件 ,其中比较重要的是 Executor、StatementHandler、ParameterHandler 和ResultSetHandler。Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操做 ,它会将数据库相关操做委托给 StatementHandler 完成。StatementHandler 首先经过 ParameterHandler 完成 SQL 语句的实参绑定,而后经过java.sql.Statement 象执行 SQL 语句并获得结果集,最后经过 ResultSetHandler 完成结果集的映射,获得结果对象并返回 。下图展现了 MyBatis 执行 SQL 语句的大体过程。

  • 插件

    Mybatis 自身的功能虽然强大,可是并不能完美切合全部的应用场景,所以 MyBatis提供了插件接口,咱们能够经过添加用户自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也能够改变 Mybatis 默认行为,例如,咱们能够拦截 SQL 语句并对其进行重写。因为用户自定义插件会影响 MyBatis 核心行为,在使用自定义插件以前,开发人员须要了解 MyBatis内部的原理,这样才能编写出安全、高效的插件。

3、接口层

接口层的核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API ,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操做。

总结

这篇文章简单介绍了Mybatis的总体架构,并简单介绍了 MyBatis 基础支持层、核心处理层以及接口层中的主要 模块的功能。

相关文章
相关标签/搜索