一文搞懂 JDBC、MyBatis、JPA 的区别与底层原理
在 Java 后端开发中,数据库访问层(DAO / Repository)几乎是每个项目的核心。
而在实际开发中,我们最常见的三种方案是:
JDBC(最底层)
MyBatis(半自动 ORM)
JPA / Hibernate(全自动 ORM)
很多初学者会有这些疑问:
🤔 JDBC、MyBatis、JPA 到底差在哪?
🤔 为什么公司不用 JDBC?
🤔 MyBatis 为什么还能写 SQL?
🤔 JPA 为什么“简单但慢”?
本文将从底层原理 + 实战角度带你一次彻底搞懂。
一、整体分层视角(先有全局概念)
从抽象程度来看:
JPA(Hibernate) ↑ MyBatis ↑ JDBC从工作量与控制力来看:
| 技术 | 抽象层级 | SQL 控制 | 开发效率 |
|---|---|---|---|
| JDBC | 最低 | ⭐⭐⭐⭐⭐ | ⭐ |
| MyBatis | 中等 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| JPA | 最高 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
二、JDBC:最原始、最底层的数据库访问方式
1️⃣ JDBC 是什么?
JDBC(Java Database Connectivity)是 Java 官方提供的一套数据库访问 API 标准。
👉 本质:Java 代码直接操作数据库
2️⃣ JDBC 的核心流程
Connection conn = DriverManager.getConnection(url, user, pwd); PreparedStatement ps = conn.prepareStatement("select * from user where id=?"); ps.setInt(1, 1); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString("name")); }JDBC 做了什么?
加载数据库驱动
建立数据库连接
手写 SQL
设置参数
执行 SQL
解析 ResultSet
手动关闭资源
👉几乎所有细节都要你自己处理
3️⃣ JDBC 的优缺点
✅ 优点:
性能最好(最少封装)
完全掌控 SQL
学习数据库原理必经之路
❌ 缺点:
模板代码极多
易出错(忘关连接)
代码可读性差
不适合大型项目
4️⃣ JDBC 的真实定位
JDBC 是“地基”,不是“商品房”
📌 实际开发中:
JDBC 很少直接使用
MyBatis / JPA 底层最终都是 JDBC
三、MyBatis:半自动 ORM(SQL 仍在你手中)
1️⃣ MyBatis 是什么?
MyBatis = JDBC + SQL 映射 + 动态 SQL
👉 核心思想:
SQL 我来写,对象你来帮我映射
2️⃣ MyBatis 的核心架构
Mapper 接口 ↓ XML / 注解 SQL ↓ MyBatis Executor ↓ JDBC ↓ Database3️⃣ MyBatis 工作原理(重点)
以一次查询为例:
调用 Mapper 接口方法
MyBatis 找到对应 SQL(XML / 注解)
解析
#{}参数生成 PreparedStatement
通过 JDBC 执行 SQL
自动封装 ResultSet → Java 对象
返回结果
👉你只负责 SQL 和接口,JDBC 细节 MyBatis 帮你搞定
4️⃣ MyBatis 示例
@Mapper public interface UserMapper { User selectById(Long id); }<select id="selectById" resultType="User"> select * from user where id = #{id} </select>5️⃣ MyBatis 的优势
✅ 优点:
SQL 可控(非常适合复杂查询)
动态 SQL 强大
学习成本低
性能可预测
国内使用最广泛
❌ 缺点:
SQL 与 Java 分离(维护成本)
CRUD 代码仍偏多
对象关系映射能力有限
6️⃣ MyBatis 适合谁?
📌强 SQL 驱动项目:
金融系统
报表系统
数据分析系统
历史项目改造
四、JPA:真正的 ORM(面向对象操作数据库)
1️⃣ JPA 是什么?
JPA(Java Persistence API)是一套ORM 规范,不是实现。
常见实现:
Hibernate(最常用)
EclipseLink
👉 核心思想:
把数据库当成对象集合来操作
2️⃣ JPA 的核心概念
| 概念 | 含义 |
|---|---|
| Entity | 数据库表 |
| EntityManager | 数据操作入口 |
| Persistence Context | 一级缓存 |
| JPQL | 面向对象的查询语言 |
3️⃣ JPA 的工作原理
@Entity @Table(name = "user") class User { @Id private Long id; private String name; }userRepository.findById(1L);内部发生了什么?
JPA 解析实体映射
根据方法名 / JPQL 生成 SQL
Hibernate 生成 JDBC SQL
执行 SQL
结果放入一级缓存
返回实体对象
👉你几乎看不到 SQL
4️⃣ JPA 的“黑魔法”能力
方法名生成 SQL
findByNameAndAge()自动脏检查(不用手写 update)
级联保存 / 删除
对象关系自动管理
5️⃣ JPA 的优缺点
✅ 优点:
CRUD 开发效率极高
面向对象思维
代码极简
非常适合业务系统
❌ 缺点:
SQL 不直观
学习曲线陡
复杂查询性能不易掌控
调优成本高
五、三者核心对比总结(必看)
| 维度 | JDBC | MyBatis | JPA |
|---|---|---|---|
| 抽象程度 | ⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| SQL 控制 | 最强 | 强 | 弱 |
| 开发效率 | 最低 | 中 | 最高 |
| 学习成本 | 低 | 中 | 高 |
| 性能可控 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| 适合项目 | 底层 | 复杂 SQL | 业务系统 |
六、真实项目中该怎么选?
✅ 选择建议(经验之谈)
🟢 用 MyBatis 的情况
SQL 复杂
强调性能
需要精确控制查询
国内传统项目
🟢 用 JPA 的情况
CRUD 为主
业务变化快
表结构相对稳定
追求开发效率
🟢 JDBC 什么时候用?
写框架
学原理
极端性能场景
七、混合使用是最佳实践
JPA + MyBatis 并不冲突
常见组合:
JPA:80% CRUD
MyBatis:20% 复杂 SQL
Spring Boot 中非常常见 👍
八、一句话总结
JDBC 是基础,MyBatis 是工程利器,JPA 是效率神器