手寫 Hibernate 系列 手寫 Hibernate ORM 框架 00-hibernate 簡介 手寫 Hibernate ORM 框架 00-環境準備 手寫 Hibernate ORM 框架 01-註解常量定義 手寫 Hibernate ORM 框架 02-實體 Bean 定義,建表語句自動 ...
手寫 Hibernate 系列
手寫 Hibernate ORM 框架 00-hibernate 簡介
手寫 Hibernate ORM 框架 02-實體 Bean 定義,建表語句自動生成
手寫 Hibernate ORM 框架 03-配置文件讀取, 資料庫連接構建
手寫 Hibernate ORM 框架 05-整體效果測試驗證
從零手寫組件系列
前言
類似的還有其他系列,主要用於學習其中的原理。
Hibernate 屬於比較早的框架了,後期將實現一套 mybatis。
在開始實現 hibernate 之前,我們先熟悉一下 hibernate。
hibernate 是什麼?
Hibernate 是一個流行的開源對象關係映射(ORM)框架,它用於簡化 Java 應用程式與關係型資料庫之間的交互。
Hibernate 將 Java 類映射到資料庫表,將 Java 對象的屬性映射到表中的列,從而使開發人員可以使用面向對象的編程方式來操作資料庫。以下是 Hibernate 的一些關鍵特性和工作原理:
關鍵特性
-
對象-關係映射(ORM):
- Hibernate 提供了強大的映射功能,可以將 Java 對象與資料庫表進行映射。這包括基本數據類型、集合、繼承、關聯(如一對一、一對多、多對多)等複雜映射。
-
自動生成 SQL:
- Hibernate 自動生成 SQL 查詢,以便將對象數據存儲到資料庫中,或從資料庫中檢索數據。這減少了開發人員編寫 SQL 查詢的負擔。
-
緩存機制:
- Hibernate 支持一級緩存(Session 緩存)和二級緩存(SessionFactory 緩存),提高了數據訪問性能。
-
資料庫無關性:
- Hibernate 支持多種資料庫,可以通過配置輕鬆切換資料庫,而無需修改應用程式代碼。
-
查詢語言(HQL):
- Hibernate 提供了 Hibernate Query Language(HQL),它是一種面向對象的查詢語言,類似於 SQL,但操作的是類和屬性,而不是表和列。
-
事務管理:
- Hibernate 集成了 Java 事務 API(JTA),支持聲明式事務管理。
-
數據驗證:
- Hibernate 支持在持久化操作之前驗證數據,確保數據的一致性和完整性。
工作原理
-
配置文件:
- Hibernate 的核心配置文件是
hibernate.cfg.xml
,它包含了資料庫連接信息、Hibernate 屬性以及映射文件的位置。 - 映射文件(如
User.hbm.xml
)定義了 Java 類與資料庫表之間的映射關係。
- Hibernate 的核心配置文件是
-
SessionFactory:
SessionFactory
是 Hibernate 的核心介面,用於創建Session
對象。它是線程安全的,通常在應用程式啟動時創建,併在整個應用程式生命周期內使用。
-
Session:
Session
是 Hibernate 與資料庫交互的主要介面。它負責執行 CRUD 操作、查詢、事務管理等。Session
不是線程安全的,通常在每個線程中創建一個新的Session
。
-
事務管理:
- Hibernate 提供了對事務的支持,可以通過
Session.beginTransaction()
開啟事務,通過Transaction.commit()
或Transaction.rollback()
提交或回滾事務。
- Hibernate 提供了對事務的支持,可以通過
-
持久化操作:
- Hibernate 提供了多種持久化操作方法,如
save()
,update()
,delete()
,get()
,load()
等,用於將對象狀態與資料庫同步。
- Hibernate 提供了多種持久化操作方法,如
-
查詢:
- Hibernate 支持使用 HQL 進行查詢,同時也支持使用 Criteria API 和原生 SQL 查詢。
入門例子
以下是一個簡單的示例,展示瞭如何使用 Hibernate 進行基本的 CRUD 操作:
配置文件(hibernate.cfg.xml)
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
<property name="hibernate.connection.username">your_username</property>
<property name="hibernate.connection.password">your_password</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.example.User"/>
</session-factory>
</hibernate-configuration>
映射類(User.java)
package com.example;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private int id;
private String name;
// Getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
主類(Main.java)
package com.example;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class Main {
public static void main(String[] args) {
// 創建 SessionFactory
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
// 創建 Session
Session session = sessionFactory.openSession();
// 開啟事務
Transaction transaction = session.beginTransaction();
// 創建新用戶對象
User user = new User();
user.setId(1);
user.setName("John Doe");
// 保存用戶對象到資料庫
session.save(user);
// 提交事務
transaction.commit();
// 關閉 Session
session.close();
// 關閉 SessionFactory
sessionFactory.close();
}
}
這個示例展示瞭如何配置 Hibernate,定義實體類,並通過 Hibernate 將一個用戶對象保存到資料庫中。
通過這種方式,Hibernate 簡化了資料庫操作,提高了開發效率。
hibernate 有哪些優秀的設計?
Hibernate 是一個流行的Java持久化框架,它通過提供對象/關係映射(ORM)功能,簡化了Java應用程式與關係資料庫的交互。
以下是Hibernate的一些優秀設計特點:
-
自動且透明的對象/關係映射:Hibernate允許開發者像操作普通Java對象一樣與資料庫打交道,而無需考慮底層的SQL語句,從而解放了開發者,使他們能夠專註於應用程式的對象和功能。
-
輕量級解決方案:Hibernate是一個輕量級的ORM解決方案,它避免了一些商業產品或EJB標準的複雜性,使得開發人員不需要修改對象的行為方式,只需創建XML映射文檔即可。
-
靈活的查詢方式:Hibernate提供了HQL(Hibernate Query Language)和Criteria API,使得開發者可以以面向對象的方式編寫查詢,同時它也支持原生SQL操作,增加了靈活性。
-
動態構建Java類:Hibernate在運行時讀取映射文檔,動態構建Java類來管理資料庫與Java之間的轉換,提供了簡單直觀的API來執行查詢和數據操作。
-
代碼與資料庫無關:使用Hibernate,開發者編寫的代碼不需要關心使用的資料庫種類,這在資料庫廠商更換時尤其有用,只需修改Hibernate配置文件即可。
-
豐富的映射策略:Hibernate支持基本和高級的映射選項,包括處理繼承、集合以及複雜類關聯,同時也支持遺留資料庫模式的集成。
-
事務性數據處理:Hibernate提供了編程介面和方法來編寫事務性應用程式,並有效從資料庫載入數據。
-
分層和有會話意識的設計:Hibernate支持分層和有會話意識的Java資料庫應用程式的設計與實現,常用設計模式如Data Access Object(DAO)模式,使得Hibernate應用程式易於測試,並遵循最佳實踐。
-
Hibernate工具集:Hibernate提供了一套工具集,支持不同的工作流,如從映射文檔生成資料庫表,從映射文檔生成數據類,以及反向設計資料庫和類來擬定映射文檔。
為什麼國內 hibernate 沒有 mybatis 火爆?
國內MyBatis比Hibernate更火爆的原因可以從以下幾個方面進行分析:
-
技術特點:
- 靈活性:MyBatis更加靈活,支持定製化SQL、存儲過程以及高級映射,使得開發者可以根據實際需求進行定製。相比之下,Hibernate提供了更多的自動映射和查詢功能,但同時也需要更多的配置。在國內的開發環境中,由於項目需求多樣化,開發者更傾向於選擇靈活性更高的框架。
- SQL控制:MyBatis允許開發人員直接編寫SQL語句,提供了更直觀的資料庫訪問控制,適合需要定製化SQL語句的場景。而Hibernate則通過對象關係映射(ORM)自動生成SQL語句,減少了開發人員手動編寫SQL的工作量。
-
社區支持:
- MyBatis的社區規模和活躍度在國內明顯優於Hibernate。MyBatis有更多的國內技術博客、開源項目以及社區支持,這使得開發者在學習、交流和解決問題時更加方便。而Hibernate雖然也有一定的社區支持,但在國內相對較為有限。
-
實際應用案例:
- MyBatis在國內的應用案例比Hibernate更多。很多知名的互聯網公司都在使用MyBatis作為持久層框架,這也促使了更多開發者選擇MyBatis。同時,一些開源項目也傾向於使用MyBatis,這進一步推動了MyBatis在國內的流行。
-
開發速度和工作量:
- MyBatis框架相對簡單,容易上手,適合快速開發。雖然Hibernate在基本的增刪改查操作上更為便捷,但在複雜查詢和大型項目中,MyBatis的靈活性和直接控制SQL的能力使其更受歡迎。
- Hibernate的配置和學習成本較高,需要更多的時間來掌握,而MyBatis則相對簡單,易於學習和使用。
-
SQL優化和緩存機制:
- MyBatis的SQL是手動編寫的,因此可以按需求指定查詢的欄位,優化SQL比Hibernate方便很多。而Hibernate生成的SQL語句較為複雜,可能會影響查詢性能。
- 在緩存機制上,MyBatis的二級緩存配置可以在每個具體的表-對象映射中進行詳細配置,而Hibernate的二級緩存配置則在SessionFactory生成的配置文件中進行詳細配置。MyBatis的緩存機制在某些情況下可能更靈活。
-
項目需求和團隊偏好:
- 在實際項目中,開發人員可以根據項目需求和團隊技術棧選擇合適的持久化框架。如果項目需求多樣化且需要定製化開發,MyBatis可能是一個更好的選擇;如果團隊更傾向於全面、自動化的解決方案,Hibernate可能更適合項目需求。