MyBatis 运行原理

MyBatis 运行原理

MyBatis 是一个半自动化的 ORM 框架,其核心运行原理围绕 SQL 与 Java 对象的映射展开,通过动态代理和反射机制实现数据库操作。

配置加载阶段

MyBatis 启动时会加载全局配置文件(如 mybatis-config.xml),解析数据源、事务管理器等基础配置。同时加载 Mapper 映射文件(XML 或注解),将 SQL 语句与接口方法绑定。

SQL 会话创建

通过 SqlSessionFactoryBuilder 构建 SqlSessionFactory,再由工厂生成 SqlSession。SqlSession 是核心交互对象,提供增删改查 API,内部通过执行器(Executor)管理数据库操作。

动态代理机制

调用 Mapper 接口方法时,MyBatis 使用 JDK 动态代理生成代理对象。MapperProxy 拦截方法调用,根据方法名和参数匹配映射的 SQL 语句。

SQL 解析与执行

代理对象将方法调用转为 MappedStatement 操作,通过 ParameterHandler 处理参数,StatementHandler 构建 JDBC PreparedStatement,最终由执行器完成数据库交互。

结果映射

ResultSetHandler 将查询结果转换为 Java 对象,依据 ResultMap 配置进行属性映射,支持自动驼峰转换或自定义类型处理器(TypeHandler)。

缓存机制

一级缓存(SqlSession 级别)默认开启,二级缓存(Mapper 级别)需手动配置。执行更新操作时会自动清空缓存,保证数据一致性。

核心组件协作流程

  1. 接口调用:用户调用 Mapper 接口方法。
  2. 代理拦截 :MapperProxy 解析方法签名,定位对应的 MappedStatement。
  3. 参数处理 :ParameterHandler 将 Java 参数转换为 SQL 参数。
  4. SQL 执行 :Executor 通过 JDBC 执行 SQL,可能经过缓存判断。
  5. 结果转换 :ResultSetHandler 将 ResultSet 转为方法返回类型。

示例代码片段

java 复制代码
// 初始化阶段
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 运行时阶段
try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectById(1);  // 触发动态代理与SQL执行
}

关键设计特点

  • 灵活性 :SQL 与代码分离,支持动态 SQL(<if>, <foreach> 等标签)。
  • 低侵入性:无需强制继承或实现特定接口。
  • 可扩展性:插件机制可拦截四大对象(Executor、StatementHandler 等)。
  • 性能优化:支持批量操作、延迟加载、缓存策略。
相关推荐
天空鸟_时光不老17 小时前
13-亮点提炼:把技术说辞翻译成业务价值
java·spring boot·spring·spring cloud·mybatis
禾小西2 天前
Redis AOF 日志:宕机了,如何避免数据丢失?
java·redis·mybatis
天空鸟_时光不老2 天前
09-RAG问答系统落地:从默认分割器的坑到Milvus召回调优
java·人工智能·spring boot·spring·spring cloud·maven·mybatis
西凉的悲伤2 天前
MyBatis 中 association 与 collection 详解
java·mybatis
天空鸟_时光不老2 天前
10-Agent安全隐患与SQL执行层加固
java·数据库·人工智能·sql·spring·maven·mybatis
jianjinwssy3 天前
MyBatis-Plus 从入门到实战:常用功能与核心原理
java·mybatis
ss2733 天前
AI全栈实战 | 3.6-01 数据库与 ORM:学过 MyBatis 再看 SQLAlchemy,才知道“半自动“和“全自动“差在哪
数据库·mybatis
代码什么用7 天前
使用javassist生成类 && MyBatis中接口代理机制及使用
mybatis
paopaokaka_luck7 天前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
韩曙亮7 天前
【JavaEE】MyBatis 基本用法 ⑤ ( 单条件查询 | 多条件查询 | 多条件动态查询 | 单条件动态查询 )
java·sql·java-ee·mybatis·mapper·sql映射