01 Mybatis 整体架构

01 Mybatis 简介

Mybatis 整体架构分为三层,分别是基础层、核心处理层、和接口层。如下图:

基础支持层

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

反射模块

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

类型转换模块

MyBatis 为简化配置文件提供了别名机制,该机制是类型转换模块的主要功能之一。

类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。在为 SQL 语句绑定实参时,会将数据由Java 类型转换成 JDBC 类型;而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。

日志模块

良好的日志功能可以帮助开发人员和测试人员快速定位问题代码,也可以帮助运维人员快速定位性能瓶颈等问题。目前的 Java 世界中存在很多优秀的日志框架,例如 Log4j、Log4j2、Slf4j 等。Mybatis 作为一个设计优良的框架,除了提供详细的日志输出信息,还要能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架

资源加载模块

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

解析器模块

解析器模块主要提供了两个功能:

一个是对 XPath 进行封装,为 Mybatis 初始化时解析 Mybatis-config.xml 配置文件以及映射文件提供支持;

另一个是为处理动态 SQL 语句中的占位符提供支持。

数据源模块

数据源是实际开发中常用的组件。现在开源的数据源都提供了比较丰富的功能,例如,连接池功能、检测链接状态等,选择性能优秀的数据源组件对于提升 ORM 框架乃至整个系统的性能是非常重要的。Mybatis 自身提供了相应的数据源实现,当然 Mybatis 也提供了于第三方数据源集成的接口。

事务管理

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

缓存模块

优化数据库性能是一个非常重要的环节,而添加缓存则是优化数据库时最有效的手段之一。正确、合理的使用缓存可以将一部分数据库请求拦截在缓存这一层,减少数据库压力。

Mybatis 提供了一级缓存和二级缓存,这两级缓存都是依赖于基础支持层的缓存模块实现。

需要注意的是,Mybatis 自带的缓存与 Mybatis 以及整个应用是运行在同一个 JVM 中的,共享一块堆内存。如果这两块缓存中的数据量大,可能会影响系统中其他功能的运行,所以需要缓存大量数据时,优先考虑使用 Redis、Memcache 等缓存产品。

Binding 模块

调用 SqlSession 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点,如果出现拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,Mybatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成对数据库操作,从而避免上述问题。

需要注意的是,开发人员无须编写自定义 Mapper 接口的实现,Mybatis 会自动为其创建动态代理对象。甚至某些场景下,自定义 Mapper 接口完全可以替代映射配置文件。但是有的映射规则和 SQL 语句的定义还是写在映射配置文件中比较方便,例如动态 SQL语句的定义。

核心处理层

在核心处理层中,实现了 Mybatis 的核心处理流程,其中包括 Mybatis 的初始化以及完成一次数据库操作涉及到的全部流程。

配置解析

在 Mybatis 初始化过程中,会加载 mybatis-config.xml 配置文件,映射配置文件以及在 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。

例如,<resultMap> 节点会被解析成 ResultMap对象;<result>节点会被解析成 ResultMapping对象。之后利用该 Configuration 对象创建出 SqlSessionFactory 对象。

等 Mybatis 初始化完成之后,开发人员可以通过初始化的 SqlSessionFactory 对象创建 SqlSession 对象并完成数据库操作。

SQL 解析与 scripting 模块

拼凑 SQL 语句是一项繁琐而又容易出粗的过程,而 Mybatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点。例如,<where><if><foreach>节点等。通过这些节点的组合使用,几乎可以写出满足所有需求的 SQL 语句。

Mybatis 中的 scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成对数据库可以执行的 SQL语句。之后处理 SQL 语句中的占位符,绑定用户传入的实参。

SQL 执行

SQL 的执行涉及多个组件,其中比较重要的有 ExecutorStatementHandlerParameterHandlerResultHandler

Executor 主要负责维护一级和二级缓存,并提供事务相关操作,它会将数据库相关操作委托给 StatementHandler 完成。

StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过 java.sql.statement 对象执行 SQL 语句并得到结果集。

最后通过 ResultHandler 完成对结果集的映射,得到对象并返回。

插件

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

接口层

接口层相对简答,其核心是 SqlSession 接口,该接口定义了 Mybatis 暴露给应用程序调用的 API,也就是上层应用与 Mybatis 沟通的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

原文地址:https://www.cnblogs.com/kjgym/p/12592444.html

时间: 2025-01-11 01:56:32

01 Mybatis 整体架构的相关文章

MyBatis整体架构

一.模块概览 模块名称 作用 主要类 反射模块 封装JAVA API,易用,进行了缓存优化 类型转换模块 绑定实参及映射查询结果集 日志模块 定位BUG,解决瓶颈 资源加载模块 类加载器,确定类加载器使用顺序 解析器模块 Xpath,初始化解析mybatis-confg.xml,mapper.xml, 动态SQL占位符 XPathParser TokenHandler EntityResolver 数据源模块 事务管理模块 抽象处理 缓存模块 提供一级和二级缓存 Binding模块 自定义Map

《程序猿闭门造车》之NBPM工作流引擎 - 项目整体架构

前言: 又是一年一度的圣诞节,可这关我什么事呢 :( ,好不容易周末了,还是说说其他的吧,前不久我发布了一篇关于工作流的文章:<程序猿闭门造车>之NBPM工作流引擎 - 开篇,很多爱好工作流的小伙伴对该组件表示感兴趣,所以我打算写一个系列文章来介绍该组件的一些情况,给关心该组件的小伙伴们一些参考和帮助. 先列个目录吧(由于我工作比较忙,只能周末抽空来分享相关资料,进度上还希望大家理解): 01.<程序猿闭门造车>之NBPM工作流引擎 - 开篇02.<程序猿闭门造车>之N

《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现. 一.MyBatis的框架设计        注:上图很大程度上参考了iteye 上的chenjc_it所写的博文原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的非常好,赞一个! 1.接口层---和数据库交互的方式 MyBatis

并发编程 13—— 线程池 之 整体架构

Java并发编程实践 目录 并发编程 01—— ConcurrentHashMap 并发编程 02—— 阻塞队列和生产者-消费者模式 并发编程 03—— 闭锁CountDownLatch 与 栅栏CyclicBarrier 并发编程 04—— Callable和Future 并发编程 05—— CompletionService : Executor 和 BlockingQueue 并发编程 06—— 任务取消 并发编程 07—— 任务取消 之 中断 并发编程 08—— 任务取消 之 停止基于线

RISC处理器设计(八)-------处理器整体架构

将粗略结构模型的数据通路划分为:取指令单元IFU.指令译码单元IDU.算术运算单元ALU.存储器访问单元MAU以及前推和数据寄存器堆FRU. 前推和数据寄存器堆FRU包括写回级.寄存器堆和数据前推逻辑.一些指令的功能涉及在多个流水线级的操作,把流水线的控制功能集中在两个模块完成. 因此分别设计流水线控制单元PCU和总线控制单元BCU,用以实现对外存储器和总线控制协议的接口. 1.取指令级IFU IFU包括程序计数器PC.跳转解码.PC逻辑.通用指令Cache MPC和条件转移目标Cache BT

Spring Framework(框架)整体架构 变迁

Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wd2014610/article/details/80061808 Spring 在这个Spring框架大行其道的软件开发世界里,尚有很多工程师天天在用,但是从来不会去思考下,Spring框架的整体架构到底是什么样子的啊.

《深入理解mybatis原理1》 MyBatis的架构设计以及实例分析

<深入理解mybatis原理> MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现. 一.MyBatis的框架设计   注:上图很大程度上参考了iteye 上的chenjc_it   所写的博文原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的

Spring Framework(框架)整体架构

Spring在这个Spring框架大行其道的软件开发世界里,尚有很多工程师天天在用,但是从来不会去思考下,Spring框架的整体架构到底是什么样子的啊.一.首先通过维基百科看看什么是Spring框架维基百科的地址:Spring框架的维基百科 二.看一下官网的介绍Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache License 2.0开源许可协议的形式发布,也有.NET平台上的移植版本.该框架基于 Expert O

tomcat原理解析(二):整体架构

一 整体结构 前面tomcat实现原理(一)里面描述了整个tomcat接受一个http请求的简单处理,这里面我们讲下整个tomcat的架构,以便对整体结构有宏观的了解.tomat里面由很多个容器结合在一起,主要有server,service,context,host,engine,wrapper,connector这7个容器来组装.当然了tomcat里面还有其它容器这里就不一一列举,因为我只看重点的.这7个容器存着父子关系,即可以通过当前容器找自己的父容器和自己的子容器.说到这我画了一个简单的结