Featured image of post Java基础知识:JPA

Java基础知识:JPA

Java基础知识补充

show

What’s JPA

JPA(Jakarta Persistence API)是一个规范,定义了Java应用程序中持久性的一组概念。JPA提供了一个对象关系映射(ORM)层,允许开发人员使用Java对象进行工作,而无需手动转换对象导向范式和关系数据库之间的差异。JPA实现如HibernateEclipseLink处理Java对象和数据库表之间的转换,使开发人员免于编写底层JDBC代码。

What’s ORM

ORM是一项任务 - 开发人员有很好的理由手动避免执行这项任务。

HibernateEclipseLink这样的框架将该任务编纂为一个库或框架,这就是ORM层。作为应用程序架构的一部分,ORM层负责管理软件对象与关系数据库中的表和列之间的转换。

在Java中,ORM层将Java类和对象转换为可以存储和管理在关系数据库中的形式。默认情况下,被持久化的对象的名称成为表的名称,字段成为列。一旦表设置好,每个表行都对应于应用程序中的一个对象。

Summary of ORM

ORM是一种将面向对象的数据模型映射到关系数据库模型的技术。

ORM层是实现这种映射的框架或库,它负责在应用程序代码和数据库之间进行转换,使开发人员无需手动编写JDBC代码。

下图说明了JPA和ORM层在应用程序开发中的作用。

image-20241122154557335

How to Do

使用一个栗子来感受一下,不使用JPA和使用JPA的差异

定义一个简单的数据 Java 类 Musician

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class Musician {
  private Long id;
  private String name;
  private Instrument mainInstrument;
  private ArrayList performances = new ArrayList();
  public Musician( Long id, String name){ /* constructor setters... */ }
  public void setName(String name){
      this.name = name;
  }
  public String getName(){
      return this.name;
  }
  public void setMainInstrument(Instrument instr){
      this.instrument = instr;
  }
  public Instrument getMainInstrument(){
      return this.instrument;
  }
  // ...Other getters and setters...
}

Musician类用于保存数据。它可以包含诸如名称字段之类的基本数据类型,也可以包含对其他类(如InstrumentArrayList)对象的引用关系。

Musician类的主要目的是保存数据。

这种类型的类有时被称为DTO(数据传输对象)。DTO是软件开发中的一个常见特征。它们可以保存各种类型的数据,但不包含任何业务逻辑。

Non-JPA

这时候,如果要去查询或者操作数据库,代码应该如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

Musician georgeHarrison = new Musician(0, "George Harrison");
      String myDriver = "org.gjt.mm.mysql.Driver";
      String myUrl = "jdbc:mysql://localhost/test";
      Class.forName(myDriver);
      Connection conn = DriverManager.getConnection(myUrl, "root", "");
      String query = " insert into users (id, name) values (?, ?)";
      PreparedStatement preparedStmt = conn.prepareStatement(query);
      preparedStmt.setInt     (1, 0);
      preparedStmt.setString (2, "George Harrison");
      preparedStmt.setString (2, "Rubble");
      preparedStmt.execute();
      conn.close();
// 省略错误处理代码

上方代码和业务场景耦合度相当高。georgeHarrison对象可以来自任何地方(前端提交、外部服务等),并且其ID和名称字段已设置。对象上的字段用于提供SQL插入语句的值。(PreparedStatement类是JDBC的一部分,提供了一种安全地将值应用于SQL查询的方法。)

虽然JDBC提供了手动配置所带来的可控性,但与JPA相比它更加繁琐。要修改数据库,您首先需要创建一个SQL查询,将Java对象映射到关系数据库中的表。您随后还需要在对象签名发生变化时修改SQL。使用JDBC,维护SQL本身就成为程序员的一项任务,而这个与业务逻辑相距甚远。

Use-JPA

1
2
Musician georgeHarrison = new Musician(0, "George Harrison");
musicianManager.save(georgeHarrison);

手动SQL替换为单行代码entityManager.save(),这会告诉JPA需要持久化该对象。从此以后,框架会处理SQL转换。

因此程序员无需离开面向对象编程的范围。

Supplementary

Java Data Objects

Java Data Objects (JDO)是一个标准化的持久性框架,它与JPA的主要区别在于在对象中支持持久性逻辑,以及它长期以来对非关系数据存储的支持。 JPA和JDO足够相似,以至于JDO提供程序通常也支持JPA。 请访问 Apache JDO Project 了解更多关于JDO与JPA和JDBC等其他持久性标准的信息。

Other Articles

JPA(Java Persistence API)是 Java 标准中的一套ORM规范

提供了一些编程的 API 接口,具体实现由 ORM 厂商实现,如Hiernate、TopLink 、Eclipselink等都是 JPA 的具体实现

借助 JPA 技术可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中(即Object Model与Data Model间的映射)。

JPA是Java持久层API,由Sun公司开发,希望规范、简化Java对象的持久化工作,整合ORM技术,整合第三方ORM框架,建立一种标准的方式,目前也是在按照这个方向发展,但是还没能完全实现。在ORM框架中,Hibernate框架做了较好的 JPA 实现,已获得Sun的兼容认证。

JPA 的优势:

  1. 开发者面向 JPA 规范的接口,但底层的JPA实现可以任意切换:觉得Hibernate好的,可以选择Hibernate JPA实现;觉得TopLink好的,可以选择TopLink JPA实现。

  2. 开发者可以避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架。

JPA为我们提供了以下规范:

  • ORM映射元数据:JPA支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中
  • JPA的Criteria API:提供API来操作实体对象,执行CRUD操作,框架会自动将之转换为对应的SQL,使开发者从繁琐的 JDBC、SQL中解放出来。
  • JPQL查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

After All

  • JPA是一个定义Java应用程序持久性概念的规范
  • JPA提供了一个ORM层,抽象了Java对象和关系数据库之间的转换
  • 流行的JPA实现包括Hibernate和EclipseLink

Ref

https://www.infoworld.com/article/2259807/what-is-jpa-introduction-to-the-java-persistence-api.html

Licensed under CC BY-NC-SA 4.0
Dan❤Anan
Built with Hugo
主题 StackJimmy 设计