什么是JPA? Java Persistence API简介

什么是Java ORM?

虽然它们的执行不同,但每个JPA实现都提供某种ORM层。为了理解JPA和JPA兼容的工具,我们要知道ORM。

作为应用程序体系结构的一部分,ORM层负责管理软件对象的转换,以便与关系数据库中的表和列进行交互。在Java中,ORM层转换Java类和对象,以便可以在关系数据库中进行存储和管理。

默认情况下,持久化对象的名称将成为表的名称,字段将成为列。设置表后,每个表行对应于应用程序中的对象。一般来说对象映射是可配置的,不过默认值往往效果很好。

Java中的数据持久性

从编程的角度来看,ORM层是一个适配器层:它使面向对象的开发语言适应SQL和关系表的语言。 ORM层允许面向对象的开发人员构建持久保存数据的软件,而无需离开面向对象这个概念。

使用JPA时,可以创建从数据存储区到应用程序的数据模型对象的映射。您可以定义对象和数据库之间的映射,而不是定义对象的保存和检索方式,然后调用JPA来保存它们。如果您正在使用关系数据库,那么应用程序代码和数据库之间的大部分实际连接将由JDBC处理。

作为规范,JPA提供元数据注解,您可以使用它来定义对象和数据库之间的映射。每个JPA实现都为JPA注解提供了自己的引擎。 JPA规范还提供了PersistanceManager或EntityManager,它们是与JPA系统联系的关键点(其中我们的业务逻辑代码告诉系统如何处理映射对象)。

为了看得更仔细,我们看看下面的代码,这是一个用于为音乐家建模的简单数据类。

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类用于保存数据。 它可以包含原始数据,例如名称字段。 它还可以与其他类(如mainInstrument和performance)保持关系。

Musician 这种类有时称为DTO或数据传输对象。 DTO是软件开发的常见功能。 虽然它们包含多种数据,但它们不包含任何业务逻辑。 持久化数据对象是软件开发中普遍存在的挑战。

JDBC的数据持久性

将Musician类的实例保存到关系数据库的一种方法是使用JDBC库。 JDBC是一个抽象层,它允许应用程序发出SQL命令而无需考虑底层数据库实现。

下面的代码显示了如何使用JDBC持久化Musician类。

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();

// Error handling removed for brevity

georgeHarrison对象可以来自任何地方(前端提交,外部服务等),并设置其ID和名称字段。 然后,对象上的字段用于提供SQL插入语句的值。 (PreparedStatement类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。)

虽然JDBC允许手动配置附带的控件,但与JPA相比,它很麻烦。 要修改数据库,首先需要创建一个SQL查询,该查询从Java对象映射到关系数据库中的表。 然后,只要对象签名发生更改,就必须修改SQL。 使用JDBC,维护SQL本身就成了一项任务。

JPA的数据持久性

现在看看下面的代码,我们使用JPA持久保存Musician类。

Musician georgeHarrison = new Musician(0, “George Harrison”);
musicianManager.save(georgeHarrison)

我们用一行session.save()替换了JDBC中的手动SQL,它指示JPA持久保存该对象。 从那时起,SQL转换由框架处理,因此我们永远不必离开面向对象。

JPA中的元数据注释

上面的代码中的魔力来自配置,该配置是使用JPA的注解创建的。 我们使用注解来告知JPA应该保留哪些对象,以及如何保留它们。

下面的代码显示了带有单个JPA注解的Musician类。

@Entity
public class Musician {
// …class body
}

持久对象有时称为实体。 将@Entity附加到类似Musician的类可以告知JPA该类及其对象应该被保留。JPA还支持使用外部XML文件而不是注释来定义类元数据。

配置JPA

与大多数现代框架一样,JPA遵循约定编码(也称为约定优于配置),其中框架提供基于行业最佳实践的默认配置。 作为一个示例,名为Musician的类将默认映射到名为Musician的数据库表。

传统配置是节省时间的,并且在许多情况下它运行良好。 当然也可以自定义JPA配置。 例如,我们可以使用JPA的@Table注释来指定应存储音乐家类的表。

@Entity
@Table(name=“musician”)
public class Musician {
// …class body
}

上面的代码告诉JPA将实体(音乐家类)持久保存到音乐家表中。

主键

在JPA中,主键是用于唯一标识数据库中每个对象的字段。 主键可用于引用对象并将对象与其他实体相关联。 每当我们在表中存储对象时,我们还将指定要用作其主键的字段。

在下面的代码中,我们告诉JPA哪个字段用作Musician的主键。

@Entity
public class Musician {
@Id
private Long id;

在这种情况下,我们使用JPA的@Id注释将id字段指定为Musician的主键。 默认情况下,此配置假定主键将由数据库设置 - 例如,当字段设置为在表上自动递增时。

JPA支持生成对象主键的其他策略。 它还有用于更改单个字段名称的注释。 通常,JPA足够灵活,可以适应我们可能需要的任何持久性映射。

CRUD操作

将类映射到数据库表并建立其主键后,即可拥有在数据库中创建,检索,删除和更新该类所需的一切。 调用session.save()将创建或更新指定的类,具体取决于主键字段是否为null或是否适用于现有实体。 调用entityManager.remove()将删除指定的类。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

大厂面试场景

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

知识点总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

知识点总结

[外链图片转存中…(img-XtqzCGB1-1713465135075)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值