【SpringData&JPA從入門到精通】00-JPA 簡介
目錄
JPA 簡介
1、JDBC
JDBC
(Java DataBase Connectivity,Java 語言連線資料庫),提供了一組規範即介面,由各個資料庫廠商提供這些介面的對應實現,而 Java 應用程式只需要通過 JDBC
2、JPA
JPA
(Java Persistence API,Java 持久化 API),用於物件持久化的 API
JavaEE5.0 平臺標準的 ORM(Object Relational Mapping,物件關係對映)規範,使得應用程式以統一的方式訪問持久層
3、JPA 和 Hibernate 的關係
JPA
是 Hibernate
的一個抽象(就像 JDBC 和 JDBC 驅動的關係)
-
JPA 是規範:
JPA
本質上就是一種 ORM 規範,不是 ORM 框架- 因為
JPA
並未提供 ORM 實現,它只是制訂了一些規範,提供了一些程式設計的 API 介面,但具體實現則由 ORM 廠商提供實現
- 因為
-
Hibernate 是實現:
Hibernate
除了作為 ORM 框架之外,它也是一種JPA
實現 - 從功能上來說,JPA 是 Hibernate 功能的一個子集
4、JPA 的供應商
JPA 的目標之一是制定一個可以由很多供應商實現的 API,目前 Hibernate 3.2+
、TopLink 10.1+
以及 OpenJPA
都提供了 JPA 的實現
Hibernate
- JPA 的“始作俑者”就是 Hibernate 的作者
- Hibernate 從 3.2 開始相容 JPA
OpenJPA
- OpenJPA 是 Apache 組織提供的開源專案
TopLink
- TopLink 以前需要收費,如今開源了
5、JPA 的優勢
- 標準化:提供相同的 API,這保證了基於 JPA 開發的企業應用能夠經過少量的修改就能夠在不同的 JPA 框架下執行
-
簡單易用,整合方便:JPA 的主要目標之一就是提供更加簡單的程式設計模型,在 JPA 框架下建立實體和建立 Java 類一樣簡單,只需要使用
javax.persistence.Entity
進行註釋;JPA 的框架和介面也都非常簡單 -
可媲美 JDBC 的查詢能力:JPA 的查詢語言是面向物件的,JPA 定義了獨特的
JPQL
,而且能夠支援批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能夠提供的高階查詢特性,甚至還能夠支援子查詢 - 支援面向物件的高階特性:JPA 中能夠支援面向物件的高階特性,如類之間的繼承、多型和類之間的複雜關係,最大限度的使用面向物件的模型
6、JPA 技術
- ORM 對映元資料:JPA 支援 XML 和 JDK5.0 註解 兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中
- JPA 的 API:用來操作實體物件,執行 CRUD 操作,框架在後臺完成所有的事情,開發者從繁瑣的 JDBC 和 SQL 程式碼中解脫出來
- 查詢語言(JPQL):這是持久化操作中很重要的一個方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式和具體的 SQL 緊密耦合
7、JPA 持久化物件步驟
1、建立 persistence.xml,配置持久化單元
- 需要指定跟哪個資料庫進行互動
- 需要指定 JPA 使用哪個持久化的框架以及配置該框架的基本屬性
2、建立實體類,使用 annotation 描述實體類與資料庫表間對映關係
3、使用 JPA API 完成資料增刪改查操作
- 建立
EntityManagerFactory
(對應 Hibernate 中的 SessionFactory) - 建立
EntityManager
(對應 Hibernate 中的 Session)
HelloWorld
1)建立 JPA 工程
1、填寫工程相關資訊(PS:IDEA 貌似不能像 Eclipse 直接建立 JPA 工程)
2、勾選Persistence(JPA)
和Hibernate
(需要注意的是這裡 JPA 版本預設是 2.2,後面需要修改配置檔案),點選FINISH
建立完成
2)配置 POM
相關依賴,清單如下
antlr
dom4j
hibernate-commons-annotations
hibernate-core
hibernate-entitymanager
hibernate-jpa-2.0-api
javassist
jboss-logging
jboss-transaction-api_1.1_spec
mysql-connector-java
pom.xml
中新增依賴
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.hibernate.common</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>4.0.2.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.4.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.15.0-GA</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.1_spec</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
3)配置 persistence
注意:JPA 規範要求在類路徑的 META-INF 目錄下放置 persistence.xml,檔案的名稱是固定的。換句話說,
persistence.xml 的名稱和位置都是固定的
1、進入工程後,檢視persistence.xml
,其預設內容如下(可以發現,這裡版本為 2.2,需要修改)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
<persistence-unit name="default">
</persistence-unit>
</persistence>
進入工程結構,刪除並新建一個persistence.xml
(如果想直接替換整個 xml 內容,此步也可跳過)
配置完成後,persistence.xml
預設內容如下
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
</persistence>
2、修改persistence.xml
檔案,新增如下配置資訊
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="jpa-1" transaction-type="RESOURCE_LOCAL">
<!--
配置使用什麼 ORM 產品來作為 JPA 的實現
1.實際上配置的是 javax.persistence.spi.PersistenceProvider 介面的實現類
2.若 JPA 專案中只有一個 JPA 的實現產品,則也可以不配置該節點。
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--新增持久化類-->
<class>com.vectorx.jpa.helloworld.Customer</class>
<properties>
<!--連線資料庫基本資訊-->
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<!--配置 JPA 實現產品的基本屬性。配置 hibernate 的基本屬性-->
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
配置資訊詳解:
-
<persistence-unit>
標籤中name
屬性:用於自定義持久化單元的名稱,必選 -
<persistence-unit>
標籤中transaction-type
屬性:用於指定 JPA 的事務處理策略-
RESOURCE_LOCAL
:預設值,資料庫級別事務。只能針對一種資料庫,不支援分散式事務 - 如果想要支援分散式事務,使用 JTA:
transaction-type="JTA"
-
-
<provider>
標籤:顯式列出實體類 -
<property>
標籤中name
為javax.persistence.jdbc.xxx
系列配置:連線資料庫基本資訊 -
<property>
標籤中name
為hibernate.xxx
系列配置:ORM 框架的基本資訊
4)建立實體類
// 標識為持久化類
@Entity
// 設定關聯資料表
@Table(name = "JPA_CUSTOMERS")
public class Customer {
private Integer id;
private String lastName;
private String email;
private int age;
// 標識為主鍵
@Id
// 設定生成策略為 AUTO
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
// 設定關聯欄位名,若同名可省略
@Column(name = "LAST_NAME")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
關於註解作用的詳細說明:
-
@Entity
:標識當前類為持久化類 -
@Table
:與資料庫表建立關聯關係,指定name
為對應的表名 -
@Id
:標識當前屬性為資料表主鍵欄位 -
@GeneratedValue
:主鍵生成策略,指定欄位的生成方式,指定strategy
為TABLE
、SEQUENCE
、IDENTITY
、AUTO
其中之一,其中-
AUTO
:可以根據底層資料庫的型別,自動選用主鍵生成方式 -
IDENTITY
:顯式地指定資料表主鍵欄位自增
-
-
@Column
:與資料表字段建立關聯關係,如果屬性名與欄位名一致,則該註解可以省略不寫
5)測試 JPA API
//1、建立 EntityManagerFactory
String persistenceUnitName = "jpa-1";
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
//2、建立 EntityManager
EntityManager entityManager = entityManagerFactory.createEntityManager();
//3、開啟事務
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//4、進行持久化操作
Customer customer = new Customer();
customer.setLastName("Vector");
customer.setEmail("[email protected]");
customer.setAge(100);
entityManager.persist(customer);
//5、提交事務
transaction.commit();
//6、關閉 EntityManager
entityManager.close();
//6、關閉 EntityManagerFactory
entityManagerFactory.close();
後臺日誌資訊,主要內容如下
Hibernate:
insert
into
JPA_CUSTOMERS
(age, email, LAST_NAME)
values
(?, ?, ?)
檢視資料庫表結構生成情況
檢視資料表資料是否新增成功
可以看到,資料表結構和資料已分別成功生成和新增
總結
本節重點關注:
- 熟悉 JPA 的基本概念與技術定位
- 掌握 JPA 的核心技術點,包括基本註解與其 API
- 熟練 JPA 持久化物件的基本步驟
附上導圖,僅供參考