news 2026/5/25 6:13:04

MyBatis 与 MySQL 执行流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis 与 MySQL 执行流程

一、MyBatis 执行流程

MyBatis 是 Java 持久层框架,它负责把 Java 代码中的数据库操作,转化为可执行的 SQL 并与数据库交互。

1. 读取配置文件

  • 读取 MyBatis 全局配置文件(sqlMapConfig.xml/mybatis-config.xml)和所有 Mapper 映射文件。
  • 全局配置文件:包含数据库连接信息、事务、别名、日志、插件等配置。
  • Mapper 映射文件:包含具体 SQL 语句、参数映射、结果集映射规则。

2. 构建SqlSessionFactory对象

  • MyBatis 通过配置文件解析器,将所有配置信息加载到内存,构建出SqlSessionFactory
  • SqlSessionFactory是工厂类,全局唯一,负责创建SqlSession,它相当于数据库连接池的入口。

3. 创建SqlSession对象

  • SqlSessionFactory创建SqlSession对象,它代表一次数据库会话,包含了数据库连接、事务控制、执行 SQL 的能力。
  • SqlSession是 MyBatis 操作数据库的核心对象,是非线程安全的,每次数据库操作都应创建独立实例。

4. 获取 Mapper 代理对象

  • 通过SqlSession.getMapper(XXXMapper.class)获取 Mapper 接口的代理对象。
  • 代理对象会自动绑定 Mapper 映射文件中的 SQL 语句,让开发者可以通过调用接口方法执行数据库操作,无需手动写 JDBC 代码。

5. 执行数据库操作

  • 调用 Mapper 接口的方法时,代理对象会解析对应的 SQL 语句,完成参数绑定、SQL 预编译,再通过SqlSession执行增删改查操作。
  • SqlSession内部封装了 JDBC 的ConnectionStatement,与数据库建立连接并执行 SQL。

6. 结果映射与会话关闭

  • 数据库返回的结果集,会根据 Mapper 映射文件中的规则,自动映射为 Java 对象。
  • 操作完成后,关闭SqlSession,释放数据库连接资源。

二、MySQL 执行流程(以 MyBatis 场景为例)

MyBatis 生成的 SQL 最终会发送给 MySQL 服务器,MySQL 内部会按以下流程处理请求:

1. SQL 与参数拼接(MyBatis 层准备)

  • MyBatis 将用户传入的参数,与 Mapper 映射文件中的 SQL 模板进行预编译拼接(#{}会生成预编译语句,防止 SQL 注入),生成完整可执行的 SQL 语句。

2. 连接器(Connection)处理

  • MySQL 服务器接收客户端(MyBatis)的连接请求,建立 TCP 连接,分配线程处理该请求。
  • 进行用户身份验证、权限校验,确认该用户有执行当前 SQL 的权限。

3. 查询缓存(可选)

  • MySQL 会先检查查询缓存(MySQL 8.0 已移除该功能),如果缓存中存在完全相同的 SQL 及其结果,直接返回缓存数据,跳过后续流程。

4. SQL 解析与预处理

  • 解析器对 SQL 语句进行词法、语法分析,生成抽象语法树(AST),验证 SQL 语法是否合法。
  • 预处理阶段会检查表、字段是否存在,用户权限是否匹配。

5. 查询优化器(Optimizer)优化

  • 优化器根据统计信息,生成多种执行方案,选择最优的执行计划(比如选择合适的索引、决定表连接顺序)。
  • 生成执行计划后,将其传递给执行器。

6. 执行器(Executor)执行 SQL

  • 执行器调用存储引擎的接口,按照优化后的执行计划,向存储引擎请求数据。
  • 对于 DML 语句(增删改),会执行对应的写操作;对于 DQL 语句(查询),会读取数据。

7. 存储引擎处理

  • 以 InnoDB 为例:
    1. 优先从缓冲池(Buffer Pool)中读取数据页,若不存在则从磁盘加载数据页到缓冲池。
    2. 执行事务操作,记录 Redo Log(重做日志)和 Undo Log(回滚日志),保证事务的 ACID 特性。
    3. 写操作会先写入缓冲池,再通过刷盘机制持久化到磁盘。

8. 结果返回

  • 存储引擎将数据返回给执行器,执行器将结果集返回给客户端(MyBatis)。
  • MyBatis 再将结果集映射为 Java 对象,完成整个流程。

三、面试高频考点补充

  1. #{}${}的区别

    • #{}:预编译处理,SQL 中的参数会被替换为?,使用 PreparedStatement 赋值,防止 SQL 注入,推荐使用。
    • ${}:直接字符串拼接,不会预编译,存在 SQL 注入风险,仅适用于表名、列名等动态场景。
  2. MyBatis 一级缓存与二级缓存

    • 一级缓存:SqlSession级别缓存,默认开启,同一会话内相同查询直接从缓存取数据,会话关闭则缓存失效。
    • 二级缓存:Mapper级别缓存,跨SqlSession共享,需手动配置开启,适用于多会话场景。
  3. MySQL 预编译的作用

    • 预编译语句(PreparedStatement)会将 SQL 模板提前发送给数据库,后续仅发送参数,数据库可复用执行计划,提升效率,同时防止 SQL 注入。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 6:12:06

BFloat16与SME2指令集在AI加速中的应用

1. BFloat16浮点格式解析BFloat16(Brain Floating Point 16)是专为机器学习设计的16位浮点格式,它在保持与32位单精度浮点(FP32)相同指数位宽(8位)的同时,将尾数位从23位缩减到7位。…

作者头像 李华
网站建设 2026/5/25 6:08:10

26年5月系分论文~写作思路深度拆解

Hello 我是方才,15人研发leader、5年团队管理&架构经验。文末,附26年10月最新软考备考资料备考交流群,群友可享受每月直播哟!2605系分论文分析今天系分和架构均已考完,方才先预祝所有考生均能逢考必过!…

作者头像 李华
网站建设 2026/5/25 6:08:07

基于机器学习的癫痫发作检测与预测:从EEG信号处理到LSTM时序建模

1. 项目概述:从被动监测到主动预警的癫痫管理革新作为一名长期关注医疗健康与人工智能交叉领域的技术从业者,我始终对如何将前沿算法转化为切实的临床价值抱有浓厚兴趣。癫痫,作为一种影响全球数千万人的慢性神经系统疾病,其核心痛…

作者头像 李华
网站建设 2026/5/25 6:00:33

深入剖析Java面试中的算法与数据结构问题

在当今快速发展的技术领域,Java 作为一门广泛应用的编程语言,在各大企业的技术选型中占据着重要地位。无论是大型互联网公司还是传统行业的数字化转型项目,Java 都是开发人员不可或缺的技能之一。然而,随着技术门槛的不断提高&…

作者头像 李华
网站建设 2026/5/25 5:58:55

别再混淆了!Unity里Bounds和Collider的8个实战区别与性能选择(附代码)

Unity中Bounds与Collider的深度实战指南:8个关键差异与性能优化策略在Unity开发中,Bounds和Collider这两个概念经常被混淆使用,但它们在实际应用场景、性能表现和功能特性上存在显著差异。本文将深入剖析两者的本质区别,并通过实际…

作者头像 李华