{T}

MyBatis 概述与框架选型

MyBatis 是一款优秀的 Java 持久层框架,它封装了 JDBC 的样板代码,让你以最小的成本操作数据库,同时保留对 SQL 的完全掌控。它不属于全自动 ORM,而是"半自动"——你写 SQL,它负责参数映射、执行与结果集映射。

一、核心特性

  • SQL 与代码解耦:SQL 写在 XML 或注解中,改动 SQL 无需重新编译 Java 代码。
  • 原生 SQL 可控:直接使用 SQL,便于针对业务做索引、分页、复杂联表等优化。
  • 自动映射:ResultSet 自动映射为 Java 对象(基于列名/ResultMap),减少手工转换。
  • 轻量易上手:仅需 SqlSessionFactory 与 Mapper 接口即可工作,学习曲线低于 Hibernate。
  • 强扩展性:插件(Interceptor)、TypeHandler、数据源、日志均可通过 SPI 或配置替换。
  • 与 Spring 无缝集成mybatis-spring 提供 SqlSessionFactoryBean 与 Mapper 扫描。

二、与其他持久层框架对比

维度MyBatisHibernate / Spring Data JPA
SQL 控制完全手写,可深度优化由框架生成(HQL/JPQL/Criteria)
学习成本低(懂 SQL 即可)高(需理解会话、脏检查、缓存、状态)
数据库移植弱(SQL 方言耦合)强(屏蔽方言)
复杂查询自然、直观容易写出 N+1 或低效语句
对象状态管理无(每次查询都是新对象)有(持久态/游离态、一级/二级缓存)
适用场景报表、复杂 SQL、性能敏感业务领域模型复杂、CRUD 为主的中后台

选型原则:业务 SQL 复杂、对性能敏感、团队 SQL 能力强 → 选 MyBatis领域模型复杂、以 CRUD 为主、追求开发效率与数据库无关性 → 选 JPA。二者并非互斥,很多项目混用。

三、为什么要深入原理

停留在"会调用 API"层面,遇到以下问题会难以定位:

  • 同一个 Mapper 方法在别处正常、此处却 BindingException
  • 修改了数据库隔离级别,但事务表现未变(不理解 MyBatis 事务与 autoCommit 的交互);
  • 压测时 DAO 层响应慢甚至 OOM(不理解一级缓存、fetchSize、批量执行)。

理解初始化、动态 SQL、执行链路(Executor → StatementHandler)、缓存与插件机制,才能做到"知其然,也知其所以然",并在设计与排障时游刃有余。后续各篇按"基础支撑 → 初始化 → SQL 解析 → 执行 → 缓存与插件 → Spring 集成"的顺序逐层展开。

相关阅读:快速上手与三层架构见 快速上手与整体架构

版本差异(旧版 → MyBatis 3.5.x)

特性旧版(MyBatis 3.4.x)MyBatis 3.5.x
JDK 基线Java 8Java 8+(17/21 兼容)
与 Spring Boot 集成mybatis-spring-boot-starter 2.x3.x(Boot 3 兼容,jakarta 支持)
动态 SQL基本支持3.5.x 完善(XMLScriptBuilder 增强)
新版特性@Mapper 扫描、dynamic SQL 优化