Spring Data JDBC vs JPA

特性 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,其他自动推断

ListCrudRepositorySpring Data JDBC 的接口,而 JPA 用的是 JpaRepository

选择 Spring Data JDBC,可能是因为:

  1. ✅项目中使用了 GraalVM Native Image(JPA 在原生镜像中经常出问题)

  2. ✅ 数据结构简单(只有 Dog,没有复杂关联)

  3. ✅ 轻量级,容易编译成原生镜像

  4. ✅ 代码更简洁,适合教学


💡 什么时候用哪个?

用 Spring Data JDBC 当:

  • ✅ 简单的 CRUD 操作

  • ✅ 数据结构简单(没有复杂的多表关联)

  • ✅ 需要高性能、低开销

  • ✅ 想用 GraalVM 原生编译(JPA 在 Native Image 中问题很多)

  • ✅ 新项目,想保持简单

用 JPA 当:

  • ✅ 复杂的业务逻辑

  • ✅ 多表关联(一对多、多对多)

  • ✅ 需要缓存、懒加载等高级特性

  • ✅ 传统企业应用

  • ✅ 团队已经熟悉 JPA


📝 总结一句话

Spring Data JDBC = 简单直接,你写什么 SQL 它就执行什么,没有魔术。

JPA = 功能强大,但会替你做很多事情,有时候你都不知道它偷偷干了什么。