1.1 類到表的映射
在學習了 JDBC 之後,您很可能會有這樣的印象:從 Java 應用程序中使用數據庫仍然是一種樂趣。如果我告訴你所有這些工作都可以輕鬆 10 倍地完成,你會怎樣?
SQL語言的主要優點是什麼?這是一種聲明性語言——它描述了我們想要得到什麼,但完全沒有說明如何去做。如何 - 這是 SQL 服務器的關注點。
使用數據庫時可以使用相同的方法。
在一個理想的世界中,我們可以簡單地將 SQL 查詢寫入數據庫,作為響應,如果我們請求多個部分,我們將收到現成的 Java 對像或 Java 對象的集合。
我能說什麼,這就是幾個人在 2000 年的想法,並決定編寫他們自己的 ORM 框架。
ORM代表對象關係映射,本質上是 Java 對像到 SQL 查詢的映射。
伙計們想到了一個非常簡單的事情——數據庫中的每個表都必須對應於 Java 應用程序中的某個類。在 Java 應用程序中,我們對對象進行操作,這些對像已經知道如何將自己保存到數據庫中。
解決這個問題有三種方法,它們看起來像這樣:
- 該對象將自身保存到數據庫中,並根據數據庫中的信息更新其字段。
- 該對象能夠將自身保存到數據庫中,但從不啟動這種情況。
- 該對象僅包含數據,有人將其保存到數據庫並從數據庫中加載。
最初,第一種方法占主導地位,然後應用服務器和企業 Java Beans 流行起來。甚至有一整類稱為 Persistence EJB 的 bean,它們可以將自己保存到數據庫中。
但是有一天,一切都變了……
1.2 Hibernate的出現
2001 年,發布了 Hibernate 框架的第一個版本。這是一個非常簡單的框架,但它允許使用普通的“愚蠢的對象”,這些對像不知道如何將它們存儲在數據庫中或從那裡加載。
使用 XML 文件設置數據庫表中 Java 類字段和列的映射。有時它們非常笨重。好吧,我在跟誰開玩笑。它們是大量的 XML 代碼畫布。只是因為 20 年前沒有像現在這樣龐大的數據庫,才挽救了這種局面。
但事實上,最強大的決定是最終將需要保存到數據庫的對象與保存它的代碼分開。這個解決方案不是很明顯。因為封裝的原則表明對象最清楚它需要如何存儲和加載。
而 ORM 方法確實打破了這個概念。數據類公開了它的內部結構,但操作不同類型的對象組變得容易多了。
在 Java 5 發布之後,JDK 中出現了兩個重大突破:
- 註釋
- 代理人
註釋XML 很快就被取代了,現在很容易在 Java 類中指定所有必要的設置來將 Java 類映射到數據庫中的表。
代理人對於 Hibernate 用戶來說不是那麼引人注目,但他們的貢獻更為重要。當您從 Hibernate 請求一個或多個特定對象時,它只會返回一個存根(代理),並攔截對其方法的所有調用。
這使得實現各種 Lazy Loading 機製成為可能,將 Hibernate 的速度和效率提升到了當時完全天價的水平。Hibernate 不僅成為事實上的行業標準——它還開始被翻譯成其他語言。因此,例如,針對 C# 出現了 Framework NHibernate。
1.3 JPA的出現
事實上,隨後是法律上的承認。JDK 開發人員決定創建一個關於如何正確地將對象映射到數據庫中的表的規範。這個規範叫做JPA- Java 持久性 API。
這正是規範。它描述了一切應該如何工作,以及如果我們希望將類的對象保存到數據庫中,我們需要哪些註釋來標記類的不同部分。
看來這些傢伙只是以 Hibernate 為基礎,並從中更改了包名。因為原本在Hibernate中的註解幾乎都一一轉移到了JPA中。
今天,Hibernate 完全實現了整個 JPA 規範,以及一些使使用它更加舒適的附加功能。因此,在標準化方面,我們可以說Hibernate有兩套特性:
- JPA標準
- Hibernate Native API(附加功能)
Hibernate 官方文檔是這樣描述的:
但根據我的經驗和重新閱讀 Hibernate 文檔後,我可以說 JPA 和 Hibernate API 有 95% 相同。它們只是相同的概念。
1.4 用於休眠的 Maven
既然我對 Hibernate 贊不絕口,我認為是時候更努力地使用它了。
首先,有一個官方網站,那裡只有一堆英文文檔。當然,她在參考信息方面有偏見,而不是在培訓方面。但它仍然比調試源代碼要好,對吧?:)
操作說明:
- 你打開鏈接。
- 你久久地看著她。
- 回到 CodeGym。
- 你閱讀我的進一步講座。
我的工作是將復雜的事情簡單化,並用簡單的術語解釋它們。如果你達到了這個水平,那麼我可以做到。
那麼,要開始使用 Hibernate,您需要將它添加到您的 pom.xml 中。迄今為止,Hibernate 的第 6 版已經可用,或者說是 6.1.1,因此我們將學習如何使用最新版本。
只需將這些行添加到您的 pom.xml 中:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.1.Final</version>
</dependency>
如果您在 2023+ 窗口之外閱讀本講座,那麼可以在此處下載新版本。
重要的!Hibernate 使用的一些庫已在 JDK 11 和 JDK 17 中棄用,因此如果您在啟動和運行項目時遇到問題,請向其中添加以下依賴項:
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.0-GA</version>
</dependency>
GO TO FULL VERSION