一、开篇:理解MyBatis的核心价值

在当今Java持久层框架生态中,MyBatis凭借其灵活的SQL控制能力简洁的ORM实现成为企业级应用的首选。与JPA的全自动ORM不同,MyBatis采用半自动化映射理念,在保持SQL灵活性的同时,通过智能映射减少70%的JDBC样板代码。

开发者
直接编写SQL
MyBatis核心引擎
自动参数绑定
结果集映射
事务管理
JDBC

本文将深入剖析MyBatis的架构核心,通过源码解析揭示其内部工作机制。阅读本文后,您将掌握:

  1. MyBatis核心对象的职责与协作关系
  2. SQL从映射到执行的完整生命周期
  3. 配置文件加载的关键流程
  4. 执行器体系的运作原理

二、核心对象体系解析

1. 基础组件关系图

SqlSessionFactoryBuilder
+build(InputStream inputStream) : SqlSessionFactory
SqlSessionFactory
+openSession() : SqlSession
SqlSession
+selectOne(String statement)
+getMapper(Class type)
«interface»
Executor
+query(MappedStatement ms, Object parameter) : List
«interface»
StatementHandler
+prepare(Connection connection)
+parameterize(Statement statement)

2. 核心对象职责说明

(1) SqlSessionFactoryBuilder
  • 功能:根据配置信息构建SqlSessionFactory
  • 生命周期:方法局部(构建后即可销毁)
  • 源码关键路径
public class SqlSessionFactoryBuilder {public SqlSessionFactory build(Reader reader) {return build(reader, null, null);}public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}.....}
(2) SqlSessionFactory
  • 功能:创建SqlSession实例
  • 实现类DefaultSqlSessionFactory
  • 核心方法
public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {this.configuration = configuration;}@Overridepublic SqlSession openSession() {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}
......}
(3) SqlSession
  • 功能:执行CRUD操作、获取Mapper接口
  • 实现类DefaultSqlSession
  • 关键源码
public class DefaultSqlSession implements SqlSession {private final Configuration configuration;private final Executor executor;private final boolean autoCommit;private boolean dirty;private List<Cursor<?>> cursorList;public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {this.configuration = configuration;this.executor = executor;this.dirty = false;this.autoCommit = autoCommit;}public DefaultSqlSession(Configuration configuration, Executor executor) {this(configuration, executor, false);}@Overridepublic <T> T selectOne(String statement) {return this.selectOne(statement, null);}......}
(4) Executor执行器
类型特点适用场景
SimpleExecutor每次执行创建新Statement常规操作
ReuseExecutor复用预处理Statement高频相同SQL操作
BatchExecutor批量操作优化大批量数据插入/更新
(5) StatementHandler
  • 职责链
    1. 准备Statement对象
    2. 参数绑定
    3. 执行SQL
    4. 结果集映射
  • 核心实现PreparedStatementHandler

三、配置文件加载机制深度解析

1. 配置文件加载流程

App XMLConfigBuilder XMLMapperBuilder Configuration DefaultSqlSessionFactory parse() parse() addMappedStatement() 返回 完成 构建实例 返回 App XMLConfigBuilder XMLMapperBuilder Configuration DefaultSqlSessionFactory

2. 核心源码分析(MyBatis 3.5.10)

(1) XMLConfigBuilder 关键路径
public Configuration parse() {parseConfiguration(parser.evalNode("/configuration"));return configuration;
}private void parseConfiguration(XNode root) {propertiesElement(root.evalNode("properties"));typeAliasesElement(root.evalNode("typeAliases"));pluginsElement(root.evalNode("plugins"));objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));settingsElement(root.evalNode("settings"));environmentsElement(root.evalNode("environments"));databaseIdProviderElement(root.evalNode("databaseIdProvider"));typeHandlerElement(root.evalNode("typeHandlers"));mapperElement(root.evalNode("mappers"));
}
(2) Mapper解析核心逻辑
// XMLMapperBuilder.java
private void configurationElement(XNode context) {String namespace = context.getStringAttribute("namespace");// 解析缓存配置cacheRefElement(context.evalNode("cache-ref"));cacheElement(context.evalNode("cache"));// 解析SQL片段sqlElement(context.evalNodes("/mapper/sql"));// 解析CRUD操作buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
}

四、SQL执行全链路剖析

1. 执行流程时序图

App SqlSession Executor StatementHandler ParameterHandler ResultSetHandler Statement selectOne("com.example.UserMapper.findById", 101) query() prepare() setParameters() execute() handleResultSets() 返回结果对象 User实例 App SqlSession Executor StatementHandler ParameterHandler ResultSetHandler Statement

2. 核心阶段源码分析

(1) 执行器选择策略
// DefaultSqlSessionFactory.java
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);
}
(2) 参数绑定过程
// DefaultParameterHandler.java
public void setParameters(PreparedStatement ps) {for (int i = 0; i < parameterMappings.size(); i++) {ParameterMapping parameterMapping = parameterMappings.get(i);Object value;String property = parameterMapping.getProperty();// 获取参数值(支持复杂对象导航)value = parameterMapping.getTypeHandler().getParameter(parameterObject, property);// 设置到PreparedStatementtypeHandler.setParameter(ps, i + 1, value, jdbcType);}
}
(3) 结果集映射核心逻辑
// DefaultResultSetHandler.java
public List<Object> handleResultSets(Statement stmt) throws SQLException {final List<Object> multipleResults = new ArrayList<>();ResultSetWrapper rsw = getFirstResultSet(stmt);// 遍历结果集while (rsw != null) {// 处理单结果集Object resultObject = handleResultSet(rsw, resultMaps);multipleResults.add(resultObject);rsw = getNextResultSet(stmt);}return collapseSingleResultList(multipleResults);
}

五、生产级最佳实践

1. SqlSession使用规范

// 正确用法:确保资源释放
try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.findById(101);// 业务处理...
} // 自动关闭session

2. 执行器选择策略

场景推荐执行器配置方式
常规单条操作SimpleExecutor默认配置
批量更新操作BatchExecutoropenSession(ExecutorType.BATCH)
高并发重复SQLReuseExecutoropenSession(ExecutorType.REUSE)

3. 二级缓存陷阱规避方案

问题场景

<!-- 错误配置:导致脏读 -->
<cache/>

解决方案

<!-- 正确配置:启用事务缓存 -->
<cache type="org.apache.ibatis.cache.TransactionalCache"/>

六、总结

本文深入剖析了MyBatis的核心架构运行机制,关键要点包括:

  1. 核心对象职责:SqlSessionFactoryExecutorStatementHandler的协作关系
  2. 配置文件加载:XML解析与Configuration对象构建过程
  3. SQL执行全链路:从映射到结果集转换的完整流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87278.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87278.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87278.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移远通信携手高通:以全栈车载解决方案,共绘智能出行新蓝图

6月26日至27日&#xff0c;2025高通汽车技术与合作峰会于苏州盛大举办。本次峰会以 “我们一起&#xff0c;行稳智远” 为主题&#xff0c;全方位呈现智能汽车全栈技术、全产业链生态与全场景体验。作为高通长期稳定的战略合作伙伴&#xff0c;移远通信携全栈车载智能解决方案深…

拿来就能用的python 课程 1

拿来就能用的python 课程 引言 python是很多人入门计算机语言的首选。 但是繁文缛节&#xff0c;很多人从怎么装python开始学起&#xff0c;然后python计算&#xff0c;然后什么是函数&#xff0c;然后什么是类&#xff0c;然后就因为太难放弃了。&#xff08;说的是不是你&a…

openssh-server

默认地&#xff0c;Ubuntu桌面版不带SSH服务器 1 检查服务是否存在 ls /usr/sbin/sshd2 安装服务 apt install openssh-server3 关闭防火墙 ufw disable 4 启动服务 service ssh start

html虚拟滚动,解决dom渲染过多卡顿的问题

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><title>极简虚拟滚动</title><style>.container {width: 300px;height: 300px;border: 1px solid #ccc;overflow: auto;position: relative;}.pl…

华锐互动:全方位定制化 VR 内容制作服务流程剖析​

华锐互动始终坚持以客户为中心&#xff0c;为客户提供全方位、定制化的 VR 内容制作服务。从项目的最初阶段开始&#xff0c;华锐互动就会深入了解客户的需求和目标&#xff0c;与客户进行充分的沟通和交流&#xff0c;挖掘项目背后的故事和文化内涵&#xff0c;然后根据客户的…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DragNDrop(拖拽占用组件)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— DragNDrop组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 语法结合…

springboot应用即使使用了连接池,MySQL数据库仍然有大量sleep状态的连接

springboot应用即使使用了连接池&#xff0c;MySQL数据库仍然有大量sleep状态的连接 问题背景概念理解MySQL配置参数wait_timeout概念Hikari配置参数&#xff08;项目使用hikari作为数据库连接池&#xff09; 实践出真知总结和解决思路 问题背景 近期客户生产环境报&#xff1…

windows下安装和使用git

本文为windows下git的下载安装和使用。 git下载和安装 参考&#xff1a; windows安装git&#xff08;全网最详细&#xff0c;保姆教程&#xff09;-CSDN博客 【学了就忘】Git介绍 — 4.Git的安装 - 简书 先解决下载时的一些疑惑&#xff1a; 选择哪个架构&#xff1f; 电脑ARM6…

借助工具给外语视频加双语字幕的实用指南​

给外语视频配上双语字幕&#xff0c;能让不同语言背景的观众更轻松理解内容&#xff0c;也能让视频在传播时更受欢迎。现在有不少智能工具能帮我们高效完成这项工作&#xff0c;比如 ViiTor AI 平台&#xff0c;它在处理双语字幕方面有不少实用功能&#xff0c;下面就结合其功能…

Claude 4 与 Gemini 2.5 Pro:开发者深度比较

Claude 4 与 Gemini 2.5 Pro&#xff1a;开发者深度比较 在使用相同的编码挑战对Claude Sonnet 4和Gemini 2.5 Pro Preview进行广泛的正面测试后&#xff0c;我发现了每个开发人员都应该了解的显著性能差异。我的发现揭示了执行速度、成本效率以及最重要的&#xff0c;精确执行…

怎么进入9870端口

在实验时想进入9870端口查看safe状态 但是输入localhost:9870后显示&#xff1a; 首先使用jps确认hadoop状态&#xff1a; 从 jps 的输出来看&#xff0c;Hadoop 的核心服务&#xff08;NameNode、DataNode、ResourceManager、NodeManager 等&#xff09;都已经正常运行&…

Windows、Linux、macOS 三大系统安装 Git 的常见坑点及解决方案,附带 具体操作示例,帮助新手快速避坑

以下是 Windows、Linux、macOS 三大系统安装 Git 的常见坑点及解决方案,附带 具体操作示例,帮助新手快速避坑。 一、Windows 系统安装 Git 1. 安装路径含空格或中文 坑点:默认路径 C:\Program Files\Git 可能导致某些脚本报错。 解决:自定义路径(如 D:\DevTools\Git)。…

OpenAI最新 GPT-4.1 、 GPT-4.1 mini 和 GPT-4.1 nano 新模型如何在ChatGPT付费创作系统平台对接API使用

GPT-4.1 ‌是 OpenAI 于2025年4月15日发布的最新语言模型系列&#xff0c;包括 GPT-4.1 、 GPT-4.1 mini 和 GPT-4.1 nano 三款新成员。这些模型在编程、指令遵循和长上下文理解方面表现出色&#xff0c;支持最大可达100万个Token的上下文窗口&#xff0c;适用于处理复杂任务和…

计算机网络(三)传输层TCP

目录 一、TCP概述​ 二、TCP三大核心特性 三、 对比UDP​​ &#xff08;1&#xff09;TCP、UDP对比 &#xff08;2&#xff09;TCP、UDP头部格式: &#xff08;3&#xff09;应用场景 ​ 四、TCP的三次握手、四次挥手 &#xff08;1&#xff09;三次握手&#xff08;建…

Spring、SpringBoot 本身为什么不提供 Bean 的异步初始化

这是一个很有深度的架构问题&#xff01;Spring/Spring Boot 本身为什么不直接提供 Bean 的异步初始化&#xff1f; 下面从原理、历史、设计哲学、技术挑战、社区现状等多个层面为你详细分析。 一、Spring Bean 初始化的默认行为 Spring IoC 容器在启动时&#xff0c;会同步地…

第十三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - 接口操作审计日志功能

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入…

AI掌柜失守记:AI Agent商业自动化边界实验

1. 实验设计&#xff1a;数字掌柜接管实体货架 1.1 硬件载体与虚拟人格构建 位于旧金山的实验场地被改造成微型零售生态系统&#xff1a;智能冰箱搭配商品篮构成实体货架&#xff0c;iPad自助结账系统连接Venmo支付接口&#xff0c;Slack通讯平台成为人机交互窗口。Claude So…

NAT 打洞

本文基于NAT3NAT3实现upd打洞&#xff08;假设你对NAT类型已经很清楚&#xff09; 如果A网络的NATAB网络的NATB的值大于6则打洞会失败&#xff0c;需要使用turn中继服务 STUN协议解析 #pragma once #include "hv/UdpClient.h" #include "fmt/format.h" /*…

java近期工作总结

近期工作中的一些总结 &#xff08;1&#xff09;三层模板和流程 我发现很多东西其实吧&#xff0c;三层就是一个模板和流程&#xff1b; 正向推&#xff0c;从控制层开始&#xff0c;反向从内个sql开始写&#xff0c;大部分应该就是从xml文件开始的&#xff0c;然后写到控制层…

vue中的torefs

在 Vue 中&#xff0c; toRefs(state) 的返回值是一个 新对象&#xff0c;其中每个属性都是对应 state 中原始属性的 ref 对象。具体来说&#xff1a; 返回值的结构与特性 1. 对象结构 - 若输入 state 为 { a: 1, b: text } &#xff0c;则 toRefs(state) 返回&a…