什么是JPA?Java Persistence API简介(1)

本文对比了JDBC和JPA在数据持久化中的应用,介绍了JPA的注解、元数据配置、主键管理、CRUD操作和实体关系处理,展示了JPA如何通过注解简化对象到数据库的映射过程。
摘要由CSDN通过智能技术生成

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

清单2中的代码是相当自我记录的。该georgeHarrison对象可以来自任何地方(前端提交,外部服务等),并设置其ID和name字段。然后,对象上的字段用于提供SQL insert语句的值。(PreparedStatement该类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。)

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

JPA的数据持久性

=========

现在考虑清单3,我们使用JPA 持久化Musician类。

清单3.使用JPA保留George Harrison


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

musicianManager.save(georgeHarrison);

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

JPA中的元数据注释

==========

清单3中的魔力是配置的结果,该配置是使用JPA的注释创建的。开发人员使用注释来告知JPA应该保留哪些对象,以及如何保留它们。

清单4显示了具有单个JPA注释的Musician类。

清单4. JPA的@Entity注释


@Entity

public class Musician {

// …class body

}

持久对象有时称为实体。附加@Entity到类,Musician告知JPA应该保留此类及其对象。

配置JPA

=====

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

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

清单5. JPA的@Table注释


@Entity

@Table(name=“musician”)

public class Musician {

// …class body

}

清单5告诉JPA将实体(Musician类)持久化到musician表中。

主键

==

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

在清单6中,我们告诉JPA要使用哪个字段作为Musician主键。

清单6.指定主键


@Entity

public class Musician {

@Id

private long id;

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

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

CRUD操作

======

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

JPA中的实体关系

=========

简单地使用原始字段持久化对象只是方程式的一半。JPA还具有管理彼此相关实体的能力。在表和对象中都有四种实体关系:

  1. 一到多

  2. 许多到一

  3. 许多一对多

  4. 一比一

每种类型的关系描述了实体与其他实体的关系。例如,Musician实体可以与由诸如ListSet的集合表示的实体具有一对多的关系。

如果Musician包含一个Band字段,这些实体之间的关系可以是多对一的,这意味着在单个Band类上有Musician集合 。(假设每个音乐家只在一个乐队中演奏。)

如果Musician包含BandMates字段,则可以表示与其他Musician实体的多对多关系。

最后,Musician可能与Quote实体有一对一的关系,用于表示一个着名的引语:Quote famousQuote = new Quote()

定义关系类型

======

JPA为每种关系映射类型提供注解。清单7显示了如何注解MusicianPerformances之间的一对多关系。

清单7.注释一对多关系


public class Musician {

@OneToMany

@JoinColumn(name=“musicianId”)

private List performances = new ArrayList();

//…

}

需要注意的一点是@JoinColumn告诉JPA Performance表上的哪一列将映射到Musician实体。每个performance都将与单个Musician关联,该列由此列跟踪。当JPA将一个 Musician或一个Performance 加载到数据库中时,它将使用此信息重新构建对象图。

在JPA中获取策略

=========

除了知道在数据库中放置相关实体​​的位置之外,JPA还需要知道如何加载它们。获取策略告诉JPA如何加载相关实体。加载和保存对象时,JPA框架必须能够微调对象图的处理方式。例如,如果Musician类有一个bandMate字段(如清单7所示),加载george可能导致整个Musician表从数据库加载!

我们需要的是定义相关实体的延迟加载的能力- 当然,认识到JPA中的关系可能是eager或lazy的。您可以使用注释来自定义提取策略,但JPA的默认配置通常可以直接使用,无需更改:

  1. 一对多:lazy

  2. 多对一:eager

  3. 多对多:lazy

  4. 一对一:eager

JPA安装和设置

========

最后,我们将简要介绍如何为Java应用程序安装和设置JPA。在本演示中,我将使用EclipseLink,即JPA参考实现。

安装JPA的常用方法是在项目中包含 JPA提供程序。清单8显示了如何将EclipseLink作为Maven pom.xml文件中的依赖项包含在内。

清单8.将EclipseLink包含为Maven依赖项


org.eclipse.persistence

eclipselink

2.5.0-RC1

您还需要包含数据库的驱动程序,如清单9所示。

清单9. MySql连接器的Maven依赖关系


mysql

mysql-connector-java

5.1.32

接下来,您需要告诉系统您的数据库和提供程序。这在persistence.xml文件中完成,如清单10所示。

清单10. Persistence.xml


http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

还有其他方法可以向系统提供此信息,包括以编程方式。我建议使用该persistence.xml文件,因为以这种方式存储依赖项使得在不修改代码的情况下更新应用程序非常容易。

JPA的Spring配置

============

使用Spring将极大地简化JPA与应用程序的集成。例如,将@SpringBootApplication注释放在应用程序头中会指示Spring 根据您指定的配置自动扫描类并根据需要注入EntityManager

如果您希望Spring为您的应用程序提供JPA支持,清单11显示了要包含的依赖项。

清单11.在Maven中添加Spring JPA支持


org.springframework.boot

spring-boot-starter

2.1.3.RELEASE

org.springframework.boot

spring-boot-starter-data-jpa

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

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

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

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

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

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

img

最后

最后,强调几点:

  • 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
  • 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

三面头条+四面阿里+五面腾讯拿offer分享面经总结,最终入职阿里

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

  • 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。

面试答案

[外链图片转存中…(img-xbKtx03l-1713465169110)]

[外链图片转存中…(img-63hLqCEg-1713465169111)]

[外链图片转存中…(img-1NJosGop-1713465169111)]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值