最后
分布式技术专题+面试解析+相关的手写和学习的笔记pdf
还有更多Java笔记分享如下:
JDBC的数据持久性
==========
将Musician
类的实例保存到关系数据库的一种方法是使用JDBC库。JDBC是一个抽象层,它允许应用程序发出SQL命令而无需考虑底层数据库实现。
清单2显示了如何使用JDBC 来持久化Musician
类。
清单2.插入记录的JDBC
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
清单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还具有管理彼此相关实体的能力。在表和对象中都有四种实体关系:
-
一到多
-
许多到一
-
许多一对多
-
一比一
每种类型的关系描述了实体与其他实体的关系。例如,Musician
实体可以与由诸如List
或Set
的集合表示的实体具有一对多的关系。
如果Musician
包含一个Band
字段,这些实体之间的关系可以是多对一的,这意味着在单个Band
类上有Musician
集合 。(假设每个音乐家只在一个乐队中演奏。)
如果Musician
包含BandMates
字段,则可以表示与其他Musician
实体的多对多关系。
最后,Musician
可能与Quote
实体有一对一的关系,用于表示一个着名的引语:Quote famousQuote = new Quote()
。
定义关系类型
======
JPA为每种关系映射类型提供注解。清单7显示了如何注解Musician
和Performances
之间的一对多关系。
清单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的默认配置通常可以直接使用,无需更改:
-
一对多:lazy
-
多对一:eager
-
多对多:lazy
-
一对一: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依赖关系
一线互联网大厂Java核心面试题库
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!
0229)]
正逢面试跳槽季,给大家整理了大厂问到的一些面试真题,由于文章长度限制,只给大家展示了部分题目,更多Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等已整理上传,感兴趣的朋友可以看看支持一波!