MyBatis 简介
MyBatis 是 Java 领域使用最广的"半自动"持久层框架:SQL 由开发者亲自编写,框架负责把方法参数绑定进 SQL、把查询结果映射成 Java 对象。它脱胎于早期的 iBATIS 项目,如今由 Apache 基金会孵化、以 mybatis/mybatis-3 在 GitHub 上维护,是 Spring Boot 后端项目最常见的数据库访问方案。
MyBatis 的定位
- 持久层框架:替你管理 JDBC 连接、预编译语句、参数绑定与结果集转换。
- 半自动(SQL 映射):SQL 由人写,框架只做"输入参数 → SQL → 输出对象"的映射。
- 与全自动 ORM 的区别:全自动 ORM(如 Hibernate)由框架根据实体类自动生成 SQL;MyBatis 反过来,一切以你手写的 SQL 为准,可预测、易调优。
与 JDBC 的关系
MyBatis 底层依然是 JDBC,它只是把重复劳动封装了起来。原生 JDBC 每次查询都要写:获取连接、创建 PreparedStatement、逐个 set 参数、遍历 ResultSet、手动封装对象、finally 释放资源。换成 MyBatis 后,这些步骤被框架接管:
| 环节 | 原生 JDBC | MyBatis |
|---|---|---|
| 连接获取 | DriverManager/连接池手工写 | 由数据源(dataSource)统一管理 |
| 参数绑定 | ps.setXxx() 逐行写 | #{} 自动预编译绑定 |
| 结果封装 | rs.getXxx() + new 对象 | resultType/resultMap 自动映射 |
| 资源释放 | 手工 finally | SqlSession 自动处理 |
| 缓存/插件 | 无 | 一级/二级缓存、Interceptor 插件 |
与 JPA/Hibernate 的关系
JPA(Jakarta Persistence)是官方规范,Hibernate 是它最流行的实现;这类框架"以实体为中心",框架替你生成 SQL。MyBatis"以 SQL 为中心",两者不是替代关系,而是风格之争:
| 对比项 | JPA / Hibernate | MyBatis |
|---|---|---|
| SQL 来源 | 框架自动生成 | 开发者手写 |
| 简单 CRUD | 极省事 | 需要写 SQL |
| 复杂 SQL/报表 | 难调优、易生成低效 SQL | 完全可控 |
| 学习曲线 | 概念多(映射、缓存、懒加载) | 会 SQL + 少量 XML 即可上手 |
| 典型团队 | 领域建模驱动 | DBA/复杂查询多、要精细控制 SQL |
主要特性
- 双驱动开发:Mapper XML 与注解两种写法,复杂 SQL 用 XML,简单 SQL 可用注解。
- 动态 SQL:
<if>、<where>、<foreach>等标签按条件拼接 SQL,无需字符串拼接。 - 强大的结果映射:resultMap 可处理列名不一致、一对一/一对多嵌套、构造函数映射等。
- 缓存与插件:内置一级/二级缓存;Interceptor 插件机制可做分页、审计、慢 SQL 统计。
- 生态成熟:官方提供 mybatis-spring、mybatis-spring-boot-starter,可无缝融入 Spring/Spring Boot。
版本主线
- 当前主流版本主线为 MyBatis 3.5.x,3.x 是 2009 年后完全重写的版本,API 长期稳定向后兼容。
- 官方文档以 mybatis.org/mybatis-3 为准,含完整中文翻译;版本、依赖坐标的最新情况请以官网与 Maven 中央仓库为准。
- 运行时要求 Java 8 及以上;每发布一个小版本都持续修复缺陷,建议关注官方 Release 说明再升级。
- 配套组件与 MyBatis 主版本需匹配:mybatis-spring、mybatis-spring-boot-starter 都有各自的版本对应关系,集成前先查官方兼容说明。
小结
MyBatis 用"手写 SQL + 框架映射"的方式,在 JDBC 的繁琐与全自动 ORM 的不可控之间找到了平衡点,是企业 Java 后端的主流选择。下一节我们从零跑通第一个 MyBatis 程序,亲眼看看它如何工作。