MyBatis面试题分析导读-架构以及核心内容

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: MyBatis不管在是平时的使用还是在面试中都必须掌握一个知识点,MyBatis 是支持自定义 SQL、存储过程和高级映射的类持久框架,跟数据库打交道的一个开源持久化框架

前言


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


我们来看看MyBatis架构:


22.png


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。


23.png


插件层


插件层对应 模块: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 专有的PersistenceExceptionTooManyResultsException 异常。


总结


经过以上模块大概了解Mybatis后,这样可以更好为我们后续研读MyBatis源码有着很大帮助,后续将研读一下SQL 执行的流程,提供Mybatis自动化能力。在最后我们在来看看模块的架构图:


24.png


各位看官还可以吗?喜欢的话,动动手指点个赞💗呗!!谢谢支持!


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
安全 数据处理 数据安全/隐私保护
C/S架构与B/S架构的适用场景分析
C/S架构(客户端/服务器架构)与B/S架构(浏览器/服务器架构)在适用场景上各有特点,主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。
297 6
|
1月前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
1月前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
84 4
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
483 37
|
2月前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
144 1
|
3月前
|
存储 监控 安全
SaaS业务架构:业务能力分析
【9月更文挑战第20天】在数字化时代,软件即服务(SaaS)模式逐渐成为企业软件解决方案的首选。SaaS 业务架构设计对于提供高效、可靠的服务至关重要。其核心业务能力包括:用户管理(注册登录、角色权限)、数据管理(存储备份、安全共享)、业务流程管理(设计定制、工作流自动化)、应用集成(第三方应用、移动应用)及客户服务(支持培训、反馈改进)。通过优化这些能力,可为企业提供更高效、可靠的 SaaS 服务。
71 11
|
4月前
|
数据采集 存储 Java
Flume Agent 的内部原理分析:深入探讨 Flume 的架构与实现机制
【8月更文挑战第24天】Apache Flume是一款专为大规模日志数据的收集、聚合及传输而设计的分布式、可靠且高可用系统。本文深入解析Flume Agent的核心机制并提供实际配置与使用示例。Flume Agent由三大组件构成:Source(数据源)、Channel(数据缓存)与Sink(数据目的地)。工作流程包括数据采集、暂存及传输。通过示例配置文件和Java代码片段展示了如何设置这些组件以实现日志数据的有效管理。Flume的强大功能与灵活性使其成为大数据处理及实时数据分析领域的优选工具。
148 1
|
3月前
|
缓存 负载均衡 数据管理
深入探索微服务架构的核心要素与实践策略在当今软件开发领域,微服务架构以其独特的优势和灵活性,已成为众多企业和开发者的首选。本文将深入探讨微服务架构的核心要素,包括服务拆分、通信机制、数据管理等,并结合实际案例分析其在不同场景下的应用策略,旨在为读者提供一套全面、深入的微服务架构实践指南。**
**微服务架构作为软件开发领域的热门话题,正引领着一场技术革新。本文从微服务架构的核心要素出发,详细阐述了服务拆分的原则与方法、通信机制的选择与优化、数据管理的策略与挑战等内容。同时,结合具体案例,分析了微服务架构在不同场景下的应用策略,为读者提供了实用的指导和建议。
|
4月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
76 0
下一篇
DataWorks