MyBatis 与 MySQL 执行流程

发布时间:2026/5/25 6:13:21

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 的Connection、Statement与数据库建立连接并执行 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 为例优先从缓冲池Buffer Pool中读取数据页若不存在则从磁盘加载数据页到缓冲池。执行事务操作记录 Redo Log重做日志和 Undo Log回滚日志保证事务的 ACID 特性。写操作会先写入缓冲池再通过刷盘机制持久化到磁盘。8. 结果返回存储引擎将数据返回给执行器执行器将结果集返回给客户端MyBatis。MyBatis 再将结果集映射为 Java 对象完成整个流程。三、面试高频考点补充#{}与${}的区别#{}预编译处理SQL 中的参数会被替换为?使用 PreparedStatement 赋值防止 SQL 注入推荐使用。${}直接字符串拼接不会预编译存在 SQL 注入风险仅适用于表名、列名等动态场景。MyBatis 一级缓存与二级缓存一级缓存SqlSession级别缓存默认开启同一会话内相同查询直接从缓存取数据会话关闭则缓存失效。二级缓存Mapper级别缓存跨SqlSession共享需手动配置开启适用于多会话场景。MySQL 预编译的作用预编译语句PreparedStatement会将 SQL 模板提前发送给数据库后续仅发送参数数据库可复用执行计划提升效率同时防止 SQL 注入。

相关新闻