【后端】【Java】一文搞懂 JDBC、MyBatis、JPA 的区别与底层原理
一文搞懂 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
↓
Database
3️⃣ 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 是效率神器
更多推荐
所有评论(0)