前言

这篇文章主要写给 正在学习 Spring 数据访问技术的 Java 开发者,特别是对比过 JDBC、DAO、ORM 却不太清楚区别和应用场景的同学。我自己在做一个小型管理系统时,先用 Spring JDBC 写 SQL,后来切换到 ORM,又尝试了 Spring Data,踩过不少坑,所以整理了这篇文章,方便大家理解这几个模块的关系。


一、Spring JDBC —— 轻量封装原生 JDBC

Spring JDBC 是 Spring 最基础的数据访问支持,核心是 JdbcTemplate。它减少了模板代码,但 SQL 仍需开发者自己编写。

@Autowired
private JdbcTemplate jdbcTemplate;

public List<User> findAll() {
    return jdbcTemplate.query("SELECT * FROM users", 
        (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")));
}

优点:

  • SQL 可控,性能优化空间大。
  • 自动管理资源(Connection、Statement)。

缺点:

  • 代码量相对较大。
  • 数据表结构变化时需要修改大量 SQL。

二、Spring DAO —— 统一抽象与异常体系

Spring DAO 更像是一种 编程模型,它不直接操作数据库,而是为持久化层提供 统一的接口与异常转换

public interface UserDao {
    User findById(int id);
}

@Repository
public class JdbcUserDao implements UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public User findById(int id) {
        return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",
            new Object[]{id}, 
            (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")));
    }
}

优点:

  • 提供统一的异常体系(如 DataAccessException)。
  • DAO 层接口与实现分离,方便替换技术。

缺点:

  • 需要开发者额外定义接口和实现。
  • 本身并不减少 SQL 或 ORM 的复杂度。

三、Spring ORM —— 对象关系映射支持

Spring ORM 主要集成了 Hibernate、JPA、MyBatis 等 ORM 框架,支持基于对象的数据库访问。

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
    User findByName(String name);
}

优点:

  • 通过对象映射减少 SQL 书写。
  • 与 Spring 事务管理无缝整合。

缺点:

  • 学习曲线较高。
  • 对复杂 SQL 仍需自定义。

四、Spring Data —— 更高层次的抽象

在 ORM 的基础上,Spring Data 进一步提升了抽象层次,能自动生成常见的 CRUD 方法。

public interface UserRepository extends CrudRepository<User, Integer> {
    List<User> findByNameContaining(String keyword);
}

特点:

  • 提高开发效率。
  • 支持多种存储系统(关系型、MongoDB、Redis 等)。
  • 基于命名规则生成 SQL,减少重复代码。

五、对比总结

技术 特点 优点 缺点 适用场景
Spring JDBC SQL 封装 灵活、性能可控 代码量大 对 SQL 控制要求高
Spring DAO 抽象模型 统一异常、接口规范 自身不减少复杂度 大型系统需要统一 DAO 层
Spring ORM ORM 集成 面向对象操作、减少 SQL 学习曲线高 中大型系统,业务以对象为主
Spring Data 高层抽象 快速开发、支持多存储 灵活性不足 小团队、快速迭代项目

六、我的实践经验

在我的项目里,我一开始用 Spring JDBC 写查询,因为需要精准优化 SQL。但随着项目扩大,手写 SQL 越来越难维护,于是我切换到 Spring Data JPA,这样 CRUD 基本不用写 SQL,开发效率大幅提升。但遇到复杂报表时,我又回退到自定义 SQL,形成了 “Spring Data + JDBC 混合使用” 的模式,这种方式既保证了效率,又保留了灵活性。


七、结语

本文对比了 Spring JDBC、Spring DAO、Spring ORM、Spring Data 的特点与应用场景。如果你是初学者,建议:

  1. 先学 JDBC,理解数据库访问的底层逻辑。
  2. 再学习 DAO 模型,体会接口与实现分离。
  3. 接着尝试 ORM 框架,掌握对象化开发。
  4. 最后用 Spring Data 提升开发效率。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐