乐趣区

关于mybatis:MyBatis面试题分析导读架构以及核心内容

该系列文章收录在公众号【Ccww 技术博客】,原创技术文章早于博客推出

前言

MyBatis不论在是平时的应用还是在面试中都必须把握一个知识点,MyBatis 是反对自定义 SQL、存储过程和高级映射的类长久框架,跟数据库打交道的一个开源长久化框架

咱们来看看 MyBatis 架构:

MyBatis的整体架构分为三层:

  1. 根底反对层
  2. 外围解决层
  3. 接口层

咱们这边次要解说一下外围解决层组件

外围解决层

在外围解决层中,实现了 MyBatis的外围解决流程:MyBatis 初始化 以及实现一次 数据库操作 的波及的全副流程 , 次要模块分为:

  • 配置解析
  • SQL 解析与参数映射
  • SQL 执行与后果集映射
  • 插件

配置解析

配置解析对应模块: buildermapping,次要组件为:

  • XMLConfigBuilder: 解析mybatis-config.xml 配置文件
  • XMLMapperBuilder: 解析映射配置文件Mapper.xml
  • XMLStatementBuilder: 次要负责解析 Statement 配置,即 <select /><insert /><update /><delete /> 标签
  • MapperAnnotationBuilder: 负责解析 Mapper 接口上的注解

在 Mybatis 初始化过程中,会加载 mybatis-config.xml 配置文件、加载映射配置文件以及 Mapper 接口中的注解 @Mapper 信息,

XML 解析 properties 配置 ConfigBuilder::parse 解析的配置信息会造成相应的对象并保留到 Configration 对象中。之后,依据基于Configration 创立 SqlSessionFactory 对象, 待 Mybatis 初始化实现后,能够通过 SqlSessionFactory 创立 SqlSession 对象并开始数据库操作。

Configuration: MyBatis 所有的配置信息都维持在 Configuration 对象之中。

SQL 解析与参数映射

SQL 解析模块:scriptingXMLLanguageDriver,XMLScriptBuilder实现了动静 SQL 语句,其提供了多种动静 SQL 语句对应的节点。比方:

  • <where> 节点、
  • <set> 节点、
  • <foreach> 节点等。

通过这些节点的组合应用,简直能够编写出所有满足需要的 SQL。

先解析映射文件中定义的动静 SQL 节点,而后能够依据用户传入的参数,将已解析的 SQL 语句中的占位符,绑定用户传入的实参,造成数据库能执行的 SQL 语句

SQL 执行与后果集映射

SQL 执行与后果集映射对应的模块:executor(执行器)和 cursor(后果游标)模块等。提供操作接口到数据处理后返回的一系列操作,次要模块有:

  • SqlSession:MyBatis 外围 API,次要用来执行命令,获取映射,治理事务。接管开发人员提供 Statement Id 和参数,并返回操作后果。
  • Executor:执行器,是 MyBatis 调度的外围,负责 SQL 语句的生成以及查问缓存(一级 / 二级缓存)的保护,它会将数据库相干操作委托给 StatementHandler实现。
  • StatementHandler : 封装了JDBC Statement 操作,负责对 JDBC Statement 的操作,如设置参数、将 Statement 后果集转换成 List 汇合。
  • ParameterHandler : 负责对用户传递的参数转换成 JDBC Statement 所须要的参数。
  • ResultSetHandler : 负责将 JDBC 返回的 ResultSet 后果集对象转换成 List 类型的汇合。
  • TypeHandler : 用于 Java 类型和 JDBC 类型之间的转换。
  • MappedStatement : 动静 SQL 的封装
  • SqlSource : 示意从 XML 文件或正文读取的映射语句的内容,它创立将从用户接管的输出参数传递给数据库的 SQL。

插件层

插件层对应 模块:plugin 模块次要拦截器实现 Interceptor 的,用户能够通过自定义插件来扭转 Mybatis 的默认行为。

尽管 Mybatis 本身的性能十分弱小,但并不能完满合乎所有的利用场景,因而 MyBatis 提供了插件接口,咱们能够通过增加用户自定义插件的形式对 MyBatis 进行扩大,例如,咱们能够拦挡 SQL 语句并对其进行重写。

但 MyBatis 只容许应用插件来拦挡的这些办法调用:ExecutorParameterHandlerResultSetHandlerStatementHandler 接口

因为用户自定义插件会影响 MyBatis 的外围行为,因而在应用自定义插件之前,开发人员须要理解 MyBatis 外部的原理,这样能力编写出平安、高效的插件。

接口层

接口层对应 session 模块,其次要包含:

  • SqlSessionFactory 和 SqlSession是 MyBatis 外围接口,接口中有执行命令,获取映射,治理事务操作,其也是与下层利用交互的桥梁。接口层在接管到调用申请时,会调用外围解决层的相应模块来实现具体的数据库操作。
  • Configuration: MyBatis 所有的配置信息都维持在 Configuration 对象之中

根底反对层

根底反对层,蕴含整个 MyBatis 的根底模块,这些模块为外围解决层的性能提供了良好的撑持。

反射模块

反射模块对应:reflection 模块,Mybatis 中的反射模块,对 Java 反射进行了很好的封装,提供了繁难的 API,不便下层调用,并且对反射操作进行了一系列的优化,例如缓存了类的元数据,进步了反射操作的性能

类型模块

类型转换模块对应:type 模块,MyBatis 为简化配置文件提供了 别名机制,该机制是类型转换模块的次要性能之一。

类型转换模块的另一个性能是 实现 JDBC 类型与 Java 类型之间 的转换,该性能在为 SQL 语句绑定实参以及映射查问后果集时都会波及:

  • 在为 SQL 语句绑定实参时,会将数据由 Java 类型转换成 JDBC 类型。
  • 在映射后果集时,会将数据由 JDBC 类型转换成 Java 类型

日志模块

日志模块对应:logging 包,MyBatis 作为一个设计低劣的框架,除了提供具体的日志输入信息,还要可能集成多种日志框架,其日志模块的一个次要性能就是 集成第三方日志框架,不便开发人员和测试人员疾速定位 Bug 代码

资源加载模块

对应 io 包,资源加载模块,次要是对类加载器进行封装,确定类加载器的应用程序,并提供了加载类文件以及其余资源文件的性能。

解析器模块

解析器模块对应:parsing 包,解析器模块,次要提供了两个性能:

  • 一个性能,是对XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供反对。
  • 另一个性能,是为解决动静 SQL 语句中的占位符提供反对

数据源模块

数据源模块对应:datasource 包,MyBatis 本身提供了相应的数据源实现,当然 MyBatis 也提供了与第三方数据源集成的接口,这些性能都位于数据源模块之中。

数据源是理论开发中罕用的组件之一。当初开源的数据源都提供了比拟丰盛的性能,例如,连接池性能、检测连贯状态等,抉择性能优良的数据源组件对于晋升 ORM 框架乃至整个利用的性能都是十分重要的。

事务模块

事务模块对应:transaction 包,MyBatis 对数据库中的事务进行了形象,其本身提供了 相应的事务接口和简略实现

在很多场景中,MyBatis 会与 Spring 框架集成,并由 Spring 框架治理事务

缓存模块

缓存摸对应:cache 包,MyBatis 中提供了 一级缓存和二级缓存,其都是依赖于根底反对层中的缓存模块实现的。

而且在优化零碎性能时,优化数据库性能是一个比拟可行的,而减少缓存则是优化数据库时最无效的伎俩之一,正确、正当地应用缓存能够将一部分数据库申请拦挡在缓存这一层。

这里须要留神的是,因为 MyBatis 自带的缓存与 MyBatis 以及整个利用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大,则可能影响零碎中其余性能的运行,所以当须要缓存大量数据时,优先思考应用 Redis、Memcache 等缓存产品

Binding 模块

对应 binding 包,MyBatis 通过 Binding 模块,将用户自定义的 Mapper 接口与映射配置文件分割起来,零碎能够通过调用自定义 Mapper 接口中的办法执行相应的 SQL 语句实现数据库操作,并且会在运行期间进行校验映射文件是否呈现语法拼写错误,能够尽早防止这种谬误,提供程序的可用性。

值得注意的是,开发人员毋庸编写自定义 Mapper 接口的实现,MyBatis 会主动为其创立动静代理对象。在有些场景中,自定义 Mapper 接口能够齐全代替映射配置文件,但有的映射规定和 SQL 语句的定义还是写在映射配置文件中比拟不便,例如动静 SQL 语句的定义。

注解模块

对应 annotations 包,MyBatis 提供了 注解 的形式,使得咱们不便的在 Mapper 接口上编写简略的数据库 SQL 操作代码,而无需像之前一样,必须编写 SQL 在 XML 格局的 Mapper 文件中。

异样模块

对应 exceptions 包。定义了 MyBatis 专有的 PersistenceException TooManyResultsException 异样。

总结

通过以上模块大略理解 Mybatis 后,这样能够更好为咱们后续研读 MyBatis 源码有着很大帮忙,后续将研读一下 SQL 执行的流程,提供 Mybatis 自动化能力。在最初咱们在来看看模块的架构图:

各位看官还能够吗?喜爱的话,动动手指导个再看???? 呗!!谢谢反对!
欢送扫码关注,原创技术文章第一工夫推出

退出移动版