| 特性 | Spring Data JDBC | JPA / Hibernate |
|---|---|---|
| 设计哲学 | 简单、轻量、直接 | 功能完整、企业级 |
| 对象管理 | 简单的数据映射 | 完整的对象关系映射(ORM) |
| 缓存机制 | ❌ 无缓存,每次查数据库 | ✅ 有一级缓存、二级缓存 |
| 懒加载(Lazy Loading) | ❌ 不支持 | ✅ 支持 |
| 关联关系 | 只支持简单的父子关系 | 支持多对多、一对多、继承等复杂关系 |
| SQL 生成 | 生成简单的 SQL | 生成复杂 SQL,有时甚至出乎意料 |
| 性能 | 更轻量,性能更好(无缓存开销) | 功能多,有时会有性能损耗 |
| 学习曲线 | 平缓,容易上手 | 陡峭,概念多 |
| 适用场景 | 简单 CRUD、微服务 | 复杂业务逻辑、大型企业应用 |
🔍 代码层面的区别
使用 JPA(传统方式)
java
@Entity // ← 需要注解
@Table(name = "dog")
public class Dog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "owner")
private String owner;
@OneToMany // ← 支持复杂关联
private List<Toy> toys;
// 需要 getter/setter
}
使用 Spring Data JDBC(你的方式)
java
record Dog(@Id int id, String name, String owner, String description) {
// 极其简洁!
// 只需要 @Id,不需要其他注解
}
对比:
-
JPA 需要
@Entity、@Table、@Column、@GeneratedValue等 -
Spring Data JDBC 只需要
@Id,其他自动推断
ListCrudRepository 是 Spring Data JDBC 的接口,而 JPA 用的是 JpaRepository。
选择 Spring Data JDBC,可能是因为:
-
✅项目中使用了 GraalVM Native Image(JPA 在原生镜像中经常出问题)
-
✅ 数据结构简单(只有
Dog,没有复杂关联) -
✅ 轻量级,容易编译成原生镜像
-
✅ 代码更简洁,适合教学
💡 什么时候用哪个?
用 Spring Data JDBC 当:
-
✅ 简单的 CRUD 操作
-
✅ 数据结构简单(没有复杂的多表关联)
-
✅ 需要高性能、低开销
-
✅ 想用 GraalVM 原生编译(JPA 在 Native Image 中问题很多)
-
✅ 新项目,想保持简单
用 JPA 当:
-
✅ 复杂的业务逻辑
-
✅ 多表关联(一对多、多对多)
-
✅ 需要缓存、懒加载等高级特性
-
✅ 传统企业应用
-
✅ 团队已经熟悉 JPA
📝 总结一句话
Spring Data JDBC = 简单直接,你写什么 SQL 它就执行什么,没有魔术。
JPA = 功能强大,但会替你做很多事情,有时候你都不知道它偷偷干了什么。