ORM & JPA & Spring Data JPA 之间的关系

这篇文章主要梳理一下 ORM & JPA & Spring Data JPA 三者之间的关系,后面会写一篇现在主流 ORM 框架(Hibernate、Mybatis)的文章。

ORM

What

对象关系映射( Object Relational Mapping,简称 ORM ),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

Why

在原来 Java 对数据库的访问是通过 JDBC(Java Database Connectivity),JDBC 提供了一组 Java API 来访问数据库。使用 JDBC 开发应用程序的优缺点如下:

JDBC 的优点 JDBC 的缺点
干净整洁的 SQL 处理 大项目中使用很复杂
大数据下有良好的性能 很大的编程成本
对于小应用非常好 没有封装
易学的简易语法 难以实现 MVC 的概念

针对 JDBC 存在的缺点,一些厂商开发了 ORM 框架来弥补。比如:Hibernate、iBatis(MyBatis)、openJDK等。使用 ORM 的优点如下:

序号 优点
1 一个 API 来在持久类的对象上实现基本的 CRUD 操作
2 一个语言或 API 来指定引用类和属性的查询
3 一个可配置的服务用来指定映射元数据
4 一个技术和事务对象交互来执行 dirty checking, lazy association fetching 和其它优化的功能

但是现在也出现了一个问题, ORM 框架这么多,大家各自搞自己的,没有一个统一的规范。所以 JPA 就出现了。

JPA

What

Java Persistence API(JPA)即Java持久层API,是一种Java应用程序编程接口规范,它描述了在使用Java平台标准版和Java平台企业版的应用程序中管理关系数据。

持久层是一个包括了以下三个方面的技术:

  • 定义在 javax.persistence 包下的API本身:用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

  • Java持久层查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

  • 对象关系元数据:JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

Why

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。开发者面向 JPA 规范的接口,但底层的 JPA 实现可以任意切换:觉得 Hibernate 好的,可以选择Hibernate JPA 实现;觉得 TopLink 好的,可以选择 TopLink JPA 实现。

JPA 只是提供了一个接口规范,在实际的工程应用中,光靠 JPA 做不了实际的事情。

Spring Data JPA

What

官方给出的定义:Spring Data JPA 可以轻松实现基于JPA的存储库。该模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring应用程序变得更加容易。

Why

在一段时间内实现应用程序的数据访问层很麻烦。需要编写太多的样板代码才能执行简单查询以及执行分页和审计。 Spring Data JPA旨在通过减少实际需要的数量来显着改进数据访问层的实现。作为开发人员,您需要编写存储库接口(包括自定义查找程序方法),Spring将自动提供实现。

这样就清楚了,Spring Data JPA 增强了基于 JPA 的数据访问层的支持,并且对于底层的 ORM 提供了自动的实现(Spring Data JPA 底层 ORM 就是通过 Hibernate 实现的)。

Summary

ORM 框架提供了面向对象方式,方便了开发人员对数据库的操作。各大厂商各自的 ORM 设计发展需要一个规范统一起来,是 JPA 出现的主要原因。在 Java Web 领域的巨头 Spring 推出的 Spring Data JPA 即增强了 JPA,又屏蔽掉了底层 ORM 的实现。极大程度地方便了开发者。最后可以通过如下的图描述三者之间的关系:

Spring_JPA