• 七张图解锁Mybatis整体脉络,让你轻松拿捏面试官


    前言

    MyBatis是一款ORM(Object-Relational Mapping)框架,其主要用于将Java对象与关系数据库之间进行映射,凭借其轻量性、稳定性以及广泛的开源社区其受到了广大开发者的追捧。

    那MyBatis为我们做了哪些事情呢?其实,总结来看主要有如下几点:

    1. SQL映射配置:MyBatis使用XML或注解配置文件来定义SQL查询、插入、更新和删除操作,以及与数据库表之间的映射关系。这使得开发者能够将SQL语句与Java代码分离,提高了代码的可维护性。
    2. 动态SQL:MyBatis支持动态SQL,允许根据不同的条件生成不同的SQL语句。这使得构建复杂的查询变得更加灵活和方便。
    3. 参数映射:MyBatis能够将Java对象的属性与SQL语句中的参数进行映射,无需手动编写繁琐的参数传递代码。
    4. 结果集映射:MyBatis支持将SQL查询结果映射到Java对象,自动将数据库表中的列值赋给Java对象的属性,大大简化了数据的读取和处理。
    5. 事务管理:MyBatis可以与Java的事务管理框架(如Spring)无缝集成,确保数据库操作的原子性和一致性。
    6. 连接池集成:MyBatis可以与常见的Java连接池库(如Apache DBCP、C3P0、HikariCP)集成,以管理数据库连接的获取和释放。
    7. 二级缓存:MyBatis支持二级缓存,可以在多个会话之间共享数据,提高性能。

    知晓了MyBatis的功能特性后,接下来让我们一起来看看MyBatis内部是通过哪些组件来支撑起这些功能的。

    总览MyBatis

    对于Mybatis的架构大致可以分为三层:基础支持层核心处理层接口层。

    或许,你会觉得上图过于复杂,难以理解。如果此刻你也有这样的疑惑,不要慌。不妨跟着笔者思路来进行梳理。

    首先,使用MyBatis概括来看大致包括如下几步:

    1. 定义接口,配置相关的xml文件信息
    2. 加载接口的配置文件,解析相关配置文件
    3. 生成接口代理类,执行相关sql

    由于在使用MyBatis过程中会编写相关的配置文件,所以Mybatis内部必然需要相应组件来支撑配置文件的解析,这些也就构成了底层的基础支撑层。既然会解析配置文件,那是不是必然会涉及到资源加载、配置解析等模块?

    进一步,当配置文件解析完成后,下一步就是生成代理,然后执行sql,此时所涉及的也就是核心处理层中的sql执行,sql解析等。更进一步,执行sql过程中为了避免Connection频繁创建,是不是需要对连接进行池化操作?所以MyBatis内部会抽象出一个数据源模块来统一管理连接。

    除此之外,对于sql执行过程中的事务是不是也需要控制?所以MyBatis还有事务管理模块来对sql执行过程中的事务进行管理。

    事实上,你只需要记住Mybatis的使用过程为:定义接口,提供配置文件,而后生成代理,执行Sql 即可。以此进行发散,自然而然能扩展出上图所示内容,根本没必要死记硬背。

    熟悉了MyBatis的整体架构后,我们接下来看Mybatis内部执行sql的大致流程:

    接下来,我们将主要围绕这张图中内容进行总结分析。

    配置文件解析

    配置文件解析过程大致如下所示:

    事实上,MyBatis内部对于配置文件解析的过程可以概括如下:

    1. 加载配置文件:MyBatis首先加载主配置文件(通常是mybatis-config.xml),并创建一个Configuration对象来表示整个MyBatis配置。
    2. 解析主配置文件:MyBatis使用XML解析器解析主配置文件,该文件包含了关于数据源、插件、类型别名、缓存等全局配置信息。这些配置会被存储在Configuration对象中。

    而参与配置文件解析的都继承与BaseBuilder,其体系结构如下所示:

    其中

    1. XMLStatementBuilder:这个类用于解析映射文件中的