MyBatis整体架构解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
简介: MyBatis可以帮助开发人员屏蔽底层重复性的原生JDBC代码,MyBatis通过映射配置文件或相应注解将ResultSet映射为Java对象,其映射规则可以嵌套其他映射规则以及子查询,从而实现复杂的逻辑,也可实现一对一,一对多,多对多映射以及双向映射。相比Hibemate更加轻量级,可控性也更高。

Mybatis的使用这里就不介绍了,不知道怎么使用的朋友可以点击

http://www.mybatis.org/mybatis-3/zh/index.html

这里面的教程很详细,包括xml的配置、映射、动态sql都有介绍,可以学习和使用,本系列的文章将会更深入的了解MyBatis。

1. ORM简介

  ORM(Object Relational Mapping)对象-关系映射框架,ORM的主要功能就是根据映射配置文件,完成数据在对象模型与关系模型之间的映射。
在这里插入图片描述

1.1 常见的ORM框架

1.1.1 Hibernate

  Hibernate通过hbm.xml映射文件维护一个Java类与数据库表的映射关系,通过Hibernate的映射,Java开发人员可以用看待Java对象的角度去看待数据库表中的数据行,数据库中多有的表通过hbm.xml配置文件映射之后,都对应一个Java类。

1.1.2 JPA

  JPA(Java Persistence API) 是EJB 3.0中持久化部分的规范,他可以脱离EJB的体系单独作为一个持久化规范进行使用。

1.1.3 Spring JDBC

  严格来说,Spring JDBC并不能算一个ORM框架,它仅仅是使用模板方式对原生JDBC进行了一层非常薄的封装,使用Spring JDBC可以帮助开发人员屏蔽创建数据库连接对象,Statement对象,异常处理以及事务管理的重复性代码,提高开发效率。

1.1.4 MyBatis

  MyBatis与前面介绍的持久化框架一样,可以帮助开发人员屏蔽底层重复性的原生JDBC代码,MyBatis通过映射配置文件或相应注解将ResultSet映射为Java对象,其映射规则可以嵌套其他映射规则以及子查询,从而实现复杂的逻辑,也可实现一对一,一对多,多对多映射以及双向映射。相比Hibemate更加轻量级,可控性也更高。

2. MyBatis整体架构

  MyBatis的整体分为三层,分别是基础支持层,核心处理层和接口层,如图所示
在这里插入图片描述

2.1 基础支持层

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

2.1.1 数据源模块

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

2.1.2 事务管理模块

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

2.1.3 缓存模块

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

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

2.1.4 Binding模块

  在调用 SqISession 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点,如果出现拼写错误,我们只能在运行时才能发现相应的 异常 。 为了尽早发现这种错误, MyBatis 通过 Binding 模块将用户自定义的 Mapper 接 口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作,从而避免上述问题。值得读者注意的是,开发人员无须编写自定义 Mapper接口的实现, MyBatis会自动为 其创建动态代理对象。在有些场景中,自定义 Mapper接口可以完全代替映射配置文件, 但有的映射规则和 SQL 语句的定义还是写在映射配置文件中比较方便,例如动态 SQL 语句的定义 。

2.1.5 反射模块

  Java中的反射功能虽然强大,但对大多数开发人员来说,写出高质量的反射代码还是有一定难度的。MyBatis中专门提供了反射模块,该模块对Java原生的反射进行了一系列优化,例如缓存了类的元数据,提高了反射的性能。

2.1.6 类型转换模块

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

2.1.7 日志模块

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

2.1.8 资源加载模块

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

2.1.9 解析器模块

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

2.2 核心处理层

  在MyBatis的核心处理层中实现了MyBatis的核心处理流程,其中包括MyBatis的初始化以及完成一次数据库操作的全部流程,而这些都是基于基础支持层实现的。

2.2.1 配置解析

  在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中 。例如,节点(即ResultSet 的映射规则) 会被解析成 ResultMap 对象,定义的节点(即属性映射)会被解析成 ResultMapping对象。之后,利用该 Configuration对象创SqlSessionFactor对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到SqlSessionFactory创建 SqlSession 对象并完成数据库操作。

2.2.2 参数映射-SQL解析

  拼凑 SQL 语句是一件烦琐且易出错的过程,为了将开发人员从这项枯燥无趣的工作中解脱出来,MyBatis实现动态SQL语句的功能,提供了多种动态 SQL语句对应的节点, 例如,节点、节点、节点等 。通过这些节点的组合使用,开发人员可以写出几乎满足所有需求的动态 SQL语句。
  MyBatis 中的scripting模块会根据用户传入的实参,解析映射文件中定义的动态SQL节点,并形成数据库可执行的SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。

2.2.3 SQL执行

  SQL语句的执行涉及多个组件,其中比较重要的是Executor、StatementHandler、ParameterHandler和ResultSetHandler。Executor主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给StatementHandler完成。StatementHandler首先通过ParamHandler完成SQL语句的实参绑定,然后通过java.sql.Statement对象执行SQL语句并得到结果集,最后通过ResultSetHandler完成结果集的映射,得到结果对象并返回。如图展示一条sql的执行过程:
在这里插入图片描述

2.2.4 插件

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

3.MyBatis 核心类介绍

SqlSession            作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
Executor              MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler      封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler      负责对用户传递的参数转换成JDBC Statement 所需要的参数,
ResultSetHandler      负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
TypeHandler           负责java数据类型和jdbc数据类型之间的映射和转换
MappedStatement       MappedStatement维护了一条<select|update|delete|insert>节点的封装, 
SqlSource             负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql              表示动态生成的SQL语句以及相应的参数信息
Configuration         MyBatis所有的配置信息都维持在Configuration对象之中。

4. MyBatis执行流程

在这里插入图片描述
到这里本篇文章就结束,此篇文章作为MyBatis系列开篇,这里只是做一个整体的介绍,后面会陆续对Mybatis的各个模块进行分析。喜欢的朋友可以关注一波,跟着我一起学习MyBatis。

目录
相关文章
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
51 6
|
10天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
27 1
|
5天前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
11天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
12天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
7天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
6天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
6天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
17 1
服务架构的演进:从单体到微服务的探索之旅
|
5天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
25 5

推荐镜像

更多