手寫 Hibernate ORM 框架 00-hibernate 簡介

老马啸西风發表於2024-07-30

手寫 Hibernate 系列

手寫 Hibernate ORM 框架 00-hibernate 簡介

手寫 Hibernate ORM 框架 00-環境準備

手寫 Hibernate ORM 框架 01-註解常量定義

手寫 Hibernate ORM 框架 02-實體 Bean 定義,建表語句自動生成

手寫 Hibernate ORM 框架 03-配置檔案讀取, 資料庫連線構建

手寫 Hibernate ORM 框架 04-持久化實現

手寫 Hibernate ORM 框架 05-整體效果測試驗證

從零手寫元件系列

java 從零手寫 spring ioc 控制反轉

java 從零手寫 spring mvc

java 從零手寫 jdbc-pool 資料庫連線池

java 從零手寫 mybatis

java 從零手寫 hibernate

java 從零手寫 rpc 遠端呼叫

java 從零手寫 mq 訊息元件

java 從零手寫 cache 快取

java 從零手寫 nginx4j

java 從零手寫 tomcat

前言

類似的還有其他系列,主要用於學習其中的原理。

Hibernate 屬於比較早的框架了,後期將實現一套 mybatis。

在開始實現 hibernate 之前,我們先熟悉一下 hibernate。

hibernate 是什麼?

Hibernate 是一個流行的開源物件關係對映(ORM)框架,它用於簡化 Java 應用程式與關係型資料庫之間的互動。

Hibernate 將 Java 類對映到資料庫表,將 Java 物件的屬性對映到表中的列,從而使開發人員可以使用物件導向的程式設計方式來運算元據庫。以下是 Hibernate 的一些關鍵特性和工作原理:

關鍵特性

  1. 物件-關係對映(ORM)

    • Hibernate 提供了強大的對映功能,可以將 Java 物件與資料庫表進行對映。這包括基本資料型別、集合、繼承、關聯(如一對一、一對多、多對多)等複雜對映。
  2. 自動生成 SQL

    • Hibernate 自動生成 SQL 查詢,以便將物件資料儲存到資料庫中,或從資料庫中檢索資料。這減少了開發人員編寫 SQL 查詢的負擔。
  3. 快取機制

    • Hibernate 支援一級快取(Session 快取)和二級快取(SessionFactory 快取),提高了資料訪問效能。
  4. 資料庫無關性

    • Hibernate 支援多種資料庫,可以透過配置輕鬆切換資料庫,而無需修改應用程式程式碼。
  5. 查詢語言(HQL)

    • Hibernate 提供了 Hibernate Query Language(HQL),它是一種物件導向的查詢語言,類似於 SQL,但操作的是類和屬性,而不是表和列。
  6. 事務管理

    • Hibernate 整合了 Java 事務 API(JTA),支援宣告式事務管理。
  7. 資料驗證

    • Hibernate 支援在持久化操作之前驗證資料,確保資料的一致性和完整性。

工作原理

  1. 配置檔案

    • Hibernate 的核心配置檔案是 hibernate.cfg.xml,它包含了資料庫連線資訊、Hibernate 屬性以及對映檔案的位置。
    • 對映檔案(如 User.hbm.xml)定義了 Java 類與資料庫表之間的對映關係。
  2. SessionFactory

    • SessionFactory 是 Hibernate 的核心介面,用於建立 Session 物件。它是執行緒安全的,通常在應用程式啟動時建立,並在整個應用程式生命週期內使用。
  3. Session

    • Session 是 Hibernate 與資料庫互動的主要介面。它負責執行 CRUD 操作、查詢、事務管理等。Session 不是執行緒安全的,通常在每個執行緒中建立一個新的 Session
  4. 事務管理

    • Hibernate 提供了對事務的支援,可以透過 Session.beginTransaction() 開啟事務,透過 Transaction.commit()Transaction.rollback() 提交或回滾事務。
  5. 持久化操作

    • Hibernate 提供了多種持久化操作方法,如 save(), update(), delete(), get(), load() 等,用於將物件狀態與資料庫同步。
  6. 查詢

    • 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的一些優秀設計特點:

  1. 自動且透明的物件/關係對映:Hibernate允許開發者像操作普通Java物件一樣與資料庫打交道,而無需考慮底層的SQL語句,從而解放了開發者,使他們能夠專注於應用程式的物件和功能。

  2. 輕量級解決方案:Hibernate是一個輕量級的ORM解決方案,它避免了一些商業產品或EJB標準的複雜性,使得開發人員不需要修改物件的行為方式,只需建立XML對映文件即可。

  3. 靈活的查詢方式:Hibernate提供了HQL(Hibernate Query Language)和Criteria API,使得開發者可以以物件導向的方式編寫查詢,同時它也支援原生SQL操作,增加了靈活性。

  4. 動態構建Java類:Hibernate在執行時讀取對映文件,動態構建Java類來管理資料庫與Java之間的轉換,提供了簡單直觀的API來執行查詢和資料操作。

  5. 程式碼與資料庫無關:使用Hibernate,開發者編寫的程式碼不需要關心使用的資料庫種類,這在資料庫廠商更換時尤其有用,只需修改Hibernate配置檔案即可。

  6. 豐富的對映策略:Hibernate支援基本和高階的對映選項,包括處理繼承、集合以及複雜類關聯,同時也支援遺留資料庫模式的整合。

  7. 事務性資料處理:Hibernate提供了程式設計介面和方法來編寫事務性應用程式,並有效從資料庫載入資料。

  8. 分層和有會話意識的設計:Hibernate支援分層和有會話意識的Java資料庫應用程式的設計與實現,常用設計模式如Data Access Object(DAO)模式,使得Hibernate應用程式易於測試,並遵循最佳實踐。

  9. Hibernate工具集:Hibernate提供了一套工具集,支援不同的工作流,如從對映文件生成資料庫表,從對映文件生成資料類,以及反向設計資料庫和類來擬定對映文件。

為什麼國內 hibernate 沒有 mybatis 火爆?

國內MyBatis比Hibernate更火爆的原因可以從以下幾個方面進行分析:

  1. 技術特點

    • 靈活性:MyBatis更加靈活,支援定製化SQL、儲存過程以及高階對映,使得開發者可以根據實際需求進行定製。相比之下,Hibernate提供了更多的自動對映和查詢功能,但同時也需要更多的配置。在國內的開發環境中,由於專案需求多樣化,開發者更傾向於選擇靈活性更高的框架。
    • SQL控制:MyBatis允許開發人員直接編寫SQL語句,提供了更直觀的資料庫訪問控制,適合需要定製化SQL語句的場景。而Hibernate則透過物件關係對映(ORM)自動生成SQL語句,減少了開發人員手動編寫SQL的工作量。
  2. 社群支援

    • MyBatis的社群規模和活躍度在國內明顯優於Hibernate。MyBatis有更多的國內技術部落格、開源專案以及社群支援,這使得開發者在學習、交流和解決問題時更加方便。而Hibernate雖然也有一定的社群支援,但在國內相對較為有限。
  3. 實際應用案例

    • MyBatis在國內的應用案例比Hibernate更多。很多知名的網際網路公司都在使用MyBatis作為持久層框架,這也促使了更多開發者選擇MyBatis。同時,一些開源專案也傾向於使用MyBatis,這進一步推動了MyBatis在國內的流行。
  4. 開發速度和工作量

    • MyBatis框架相對簡單,容易上手,適合快速開發。雖然Hibernate在基本的增刪改查操作上更為便捷,但在複雜查詢和大型專案中,MyBatis的靈活性和直接控制SQL的能力使其更受歡迎。
    • Hibernate的配置和學習成本較高,需要更多的時間來掌握,而MyBatis則相對簡單,易於學習和使用。
  5. SQL最佳化和快取機制

    • MyBatis的SQL是手動編寫的,因此可以按需求指定查詢的欄位,最佳化SQL比Hibernate方便很多。而Hibernate生成的SQL語句較為複雜,可能會影響查詢效能。
    • 在快取機制上,MyBatis的二級快取配置可以在每個具體的表-物件對映中進行詳細配置,而Hibernate的二級快取配置則在SessionFactory生成的配置檔案中進行詳細配置。MyBatis的快取機制在某些情況下可能更靈活。
  6. 專案需求和團隊偏好

    • 在實際專案中,開發人員可以根據專案需求和團隊技術棧選擇合適的持久化框架。如果專案需求多樣化且需要定製化開發,MyBatis可能是一個更好的選擇;如果團隊更傾向於全面、自動化的解決方案,Hibernate可能更適合專案需求。

相關文章