只会写 Mapper 就想进大厂?小7 的 MyBatis 逆袭路

Java教程 2025-09-23

面试危机,MyBatis 灵魂拷问​

那是一个阳光明媚的上午,怀揣着对新机遇的憧憬,我踏入了一家心仪大厂的面试间。此前的几轮面试都还算顺利,我内心逐渐放松下来,觉得这份工作已经在向我招手。然而,面试官接下来的问题,瞬间让我的心情跌入谷底。​

“看你简历上写了熟练使用 MyBatis,那你能详细讲讲 MyBatis 的原理吗?” 面试官的目光透过镜片,直直地看向我,眼神里满是期待。​

听到这个问题,我的笑容瞬间僵在脸上,大脑一片空白。说实话,日常工作中,我确实经常使用 MyBatis 来编写 Mapper 接口,进行数据库操作,但对于它的底层原理,却只是一知半解。我张了张嘴,却不知道该从何说起,只能结结巴巴地蹦出几个词:“呃…… 就是那个 SQL 映射…… 还有配置文件……” 话一出口,我就后悔了,这回答听起来是多么的空洞和无力。​

面试官微微皱了皱眉头,我知道,这次回答肯定让他很失望。尽管面试还在继续,但我心里清楚,这个问题已经成为了我面试路上的一道坎。面试结束后,我失落地走出大楼,心里满是懊悔。为什么平时不多花些时间去深入了解 MyBatis 的原理呢?仅仅满足于会写 Mapper,在这样的大厂面试中,显然是远远不够的。​

这次面试的失败,让我深刻认识到,想要进入大厂,必须对技术有更深入的理解和掌握。于是,我下定决心,一定要把 MyBatis 的原理搞清楚。

慌张?先给面试官画个执行流程 “大饼”​

回家之后,我马上打开电脑,开始疯狂查阅资料,恶补 MyBatis 的知识。我深知,想要在下次面试中应对自如,就必须从最基础的原理开始学起。​

我先从 MyBatis 的大致执行流程入手。原来,MyBatis 的执行流程就像是一场精心编排的舞台剧,每个环节都紧密相扣。​

演出的帷幕拉开,首先是加载配置。MyBatis 会读取配置文件,这个配置文件就像是整个舞台剧的剧本大纲,包含了数据库连接信息、事务管理器配置、类型别名以及映射文件路径等重要信息 ,比如下面这段配置,就定义了数据库的连接信息和事务管理器类型:

"1.0" encoding="UTF-8"?>

configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<environments default="development">

<environment id="development">

<transactionManager type="JDBC"/>

<dataSource type="POOLED">

<property name="driver" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/test"/>

<property name="username" value="root"/>

<property name="password" value="password"/>

dataSource>

environment>

environments>

<mappers>

<mapper resource="com/example/mapper/UserMapper.xml"/>

mappers>

configuration>

读取配置文件后,就进入了解析 Mapper 环节。这一步,MyBatis 会将 Mapper 接口和 XML 映射文件关联起来,就像是为舞台上的每个角色找到了对应的剧本台词。每一个标签:










会被解析成一个 id 为com.example.mapper.UserMapper.selectAllUsers的 MappedStatement,存在全局容器里。​

接着,创建 SqlSession。SqlSession 是 MyBatis 与数据库交互的核心接口,它就像是舞台上的主角,负责执行各种数据库操作 。创建 SqlSession 的过程,就像是为主角搭建舞台,准备好一切表演所需的道具。我们可以通过 SqlSessionFactory 的openSession()方法来创建 SqlSession,例如:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession sqlSession = sqlSessionFactory.openSession();

在创建 SqlSession 时,还会涉及到事务管理和执行器的创建。事务管理就像是舞台上的秩序维护者,确保数据库操作的一致性和完整性;而执行器则是真正执行 SQL 语句的 “幕后英雄”,它会根据不同的配置,选择合适的执行策略。​

一切准备就绪,就到了执行 SQL 语句的环节。当我们在代码中调用 Mapper 接口的方法时,实际上是通过 SqlSession 来执行对应的 SQL 语句 。比如,调用userMapper.selectAllUsers()方法,底层就会执行之前解析好的 SQL 语句,从数据库中查询数据。​

最后,是处理结果集。MyBatis 会将数据库返回的结果集映射到 Java 对象中,就像是将舞台上的表演成果呈现给观众 。例如,查询用户信息的结果,会被映射成User对象的列表返回给调用者。​

通过对 MyBatis 执行流程的梳理,我对它的工作原理有了一个初步的认识。这就像是在黑暗中找到了一丝曙光,让我对接下来的学习充满了信心。​

从配置文件开启 MyBatis 探秘之旅​

在搞清楚 MyBatis 的执行流程后,我决定深入研究一下它的配置文件,毕竟这是 MyBatis 启动的关键。我了解到,MyBatis 的配置文件通常命名为 mybatis-config.xml,它就像是整个框架的 “指挥中心”,控制着 MyBatis 的各种行为。​

当 MyBatis 启动时,会通过 SqlSessionFactoryBuilder 来解析 mybatis-config.xml 文件。这个过程就像是一个专业的翻译官,将配置文件中的信息翻译成 MyBatis 能够理解的指令 。在解析过程中,首先会读取标签中的环境配置,这里面包含了数据源和事务管理器的相关信息,比如前面提到的数据库连接信息和事务管理器类型 。这些信息就像是搭建舞台的基础材料,为后续的数据库操作提供了必要的支持。​

接着,会读取标签中的映射配置,它会告诉 MyBatis 去哪里找到 Mapper 接口和 XML 映射文件。这一步非常关键,就像是为每个演员找到了对应的剧本,让它们知道自己在舞台上该做些什么 。例如,这条配置,就指定了 UserMapper.xml 文件的位置,MyBatis 会根据这个路径去加载映射文件。​

在解析配置文件的过程中,MyBatis 会使用 XMLConfigBuilder 类将各种配置信息加载到 Configuration 对象中。这个 Configuration 对象就像是一个 “大管家”,保存了 MyBatis 的所有配置信息,包括数据源、事务管理器、映射器等 。它会在后续的操作中发挥重要作用,比如创建 SqlSession 时,就会用到 Configuration 对象中的配置信息。​

Mapper 解析,揭开核心面纱​

在了解了配置文件的重要性后,我将目光聚焦到了 Mapper 的解析上,这可是 MyBatis 的核心部分。Mapper 就像是数据库操作的 “代言人”,它既有接口,又有 XML 配置,两者相互配合,完成各种数据库操作 。​

MyBatis 在启动过程中,会将 XML 映射文件解析成一个个 MappedStatement 对象 。这就像是把剧本中的每一幕都拆解成具体的演出指令,每个元素,XMLMapperBuilder 可能会使用 XPath 表达式类似于mapper/select来定位