1. 程式人生 > 其它 >【SpringData&JPA從入門到精通】00-JPA 簡介

【SpringData&JPA從入門到精通】00-JPA 簡介

筆記來源:尚矽谷jpa開發教程全套完整版(初學者零基礎入門)

目錄

JPA 簡介

1、JDBC

JDBC(Java DataBase Connectivity,Java 語言連線資料庫),提供了一組規範即介面,由各個資料庫廠商提供這些介面的對應實現,而 Java 應用程式只需要通過 JDBC

就可以完成對不同資料庫(如 MySQL、Oracle、SQLServer 和 DB2 等)的統一呼叫

2、JPA

JPA(Java Persistence API,Java 持久化 API),用於物件持久化的 API

JavaEE5.0 平臺標準的 ORM(Object Relational Mapping,物件關係對映)規範,使得應用程式以統一的方式訪問持久層

3、JPA 和 Hibernate 的關係

JPAHibernate 的一個抽象(就像 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 支援 XMLJDK5.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>標籤中namejavax.persistence.jdbc.xxx系列配置:連線資料庫基本資訊
  • <property>標籤中namehibernate.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:主鍵生成策略,指定欄位的生成方式,指定strategyTABLESEQUENCEIDENTITYAUTO其中之一,其中
    • 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 持久化物件的基本步驟

附上導圖,僅供參考