当前位置: 首页 > news >正文

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 注入。
http://www.gsyq.cn/news/1375352.html

相关文章:

  • 从spring到spring boot——JAVA项目开发
  • UE4项目实战:用两个Widget组件搞定3DUI穿模问题(附蓝图与材质设置)
  • 2026年4月惠州知名的设备运输服务商推荐,精密设备搬迁/工厂设备搬运/设备安装搬迁/平台吊装,设备运输一站式服务哪家好 - 品牌推荐师
  • Armv9 SME指令集:FMLS与FMLSL浮点运算优化
  • 跨VM RowHammer攻击防御技术与DRAM安全研究
  • LLM推理解耦技术:提升大型语言模型推理效率的关键方法
  • BFloat16与SME2指令集在AI加速中的应用
  • 亚秒级计时电流法在室温离子液体中的突破应用
  • Mysql:事务管理(上)
  • 基于机器学习的癫痫发作检测与预测:从EEG信号处理到LSTM时序建模
  • 告别瞎猜!用DBSCAN和K-means搞定毫米波雷达点云聚类,附完整Matlab代码与数据集
  • 基于退火序贯蒙特卡洛的符号回归:从高维物理数据中自动发现多项式约束
  • 纯前端到底要不要学 Java
  • Unity新手避坑指南:从预制体变体到导航网格,这些基础概念别再搞混了
  • CentOS 7最小化安装后,复制粘贴和网络配置的保姆级教程(附图形界面切换)
  • DYNAMIX:基于强化学习的动态批处理优化,破解分布式训练效率与精度困局
  • 手把手教你用Linux命令‘偷看’UEFI启动日志,排查系统启动失败问题
  • 企业IT必看:如何用Chrome企业版MSI配合组策略,实现全网电脑静默部署
  • 流式处理与可解释AI:构建实时电竞胜率预测系统的核心技术
  • GB5768.3钻牛角尖的几点
  • 别再只会用Set-ExecutionPolicy了!深入理解Windows PowerShell的四种执行策略与安全实践
  • ARM SVE架构WHILEGT指令详解与应用优化
  • Ubuntu 22.04下gcc安装报错?手把手教你用apt-get指定版本解决cpp依赖冲突
  • 不止于播放:用Unity Video Player的RenderTexture模式,轻松实现游戏内电视、监控屏效果
  • 2026年智己LS8与问界M7深度分析:家庭增程SUV场景的配置与性能代差困境 - 品牌推荐
  • Unity新手避坑指南:从零搭建第一个3D场景,这些基础概念千万别搞错
  • (干货整理)实测好用的AI写作辅助网站,毕业党收藏备用
  • Unity项目整合透明视频?试试这个Pr+WebM的高效流程(附资源链接)
  • 告别小方块!在Unity中为TextMesh Pro动态加载自定义中文字体的完整流程(含雅黑字体文件)
  • 用Unity做个2D平台跳跃游戏:从角色控制器到粒子特效的全流程实战