JavaEE學習之Hibernate框架
一、hibernate 簡介
-
Hibernate 是由 Gavin King 於 2001 年建立的開放原始碼的物件關係框架。它強大且高效的構建具有關係物件永續性和查詢服務的 Java 應用程式。
-
Hibernate 將 Java 類對映到資料庫表中,從 Java 資料型別中對映到 SQL 資料型別中,並把開發人員從 95% 的公共資料持續性程式設計工作中解放出來。
-
支援的資料庫:Hibernate 支援幾乎所有的主要 RDBMS。
二、hibernate 架構
-
Hibernate 是傳統 Java 物件和資料庫伺服器之間的橋樑,用來處理基於 O/R 對映機制和模式的那些物件。
-
Hibernate 架構是分層的,作為資料訪問層,你不必知道底層 API 。Hibernate 利用資料庫以及配置資料來為應用程式提供持續性服務(以及持續性物件)。
-
Hibernate 在三層架構中的地位
三、hibernate ORM
ORM 表示 Object-Relational Mapping (ORM),是一個方便在關係資料庫和類似於 Java, C# 等面向物件的程式語言中轉換資料的技術。ORM 系統相比於普通的 JDBC 有以下的優點:
-
使用業務程式碼訪問物件而不是資料庫中的表
-
從面向物件邏輯中隱藏 SQL 查詢的細節
-
基於 JDBC 的 'under the hood'
-
沒有必要去處理資料庫實現
-
實體是基於業務的概念而不是資料庫的結構
-
事務管理和鍵的自動生成
-
應用程式的快速開發
四、hibernate 配置(以MySQL為例)
-
環境搭建(可以到 http://www.hibernate.org/downloads 下載hibernate相關jar包),除了hibernate需要的jar包外,還要匯入資料庫驅動。
-
Hibernate框架核心配置檔案
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--四個必填項-->
<!--配置資料來源-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--可選項-->
<!--是否輸出hibernate相關資訊到控制檯-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--配置方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--配置建表策略-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--關聯一下 ORM 檔案-->
<mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
-
Hibernate 持久化類
public class User {
private int id;
private String username;
private String password;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
-
Hibernate 對映檔案
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--ORM 對映 實體類和 資料表對映-->
<class name="cn.edu.dgut.bean.User" table="tb_user">
<id name="id" column="id">
<!--設定主鍵策略-->
<generator class="native"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
五、hibernate 註釋
Hibernate 註釋是無需使用 XML 檔案來定義對映的最新方法。你可以額外使用註釋或直接代替 XML 對映元資料。
Hibernate 註釋是一種強大的來給物件和關係對映表提供元資料的方法。所有的元資料被新增到 POJO java 檔案程式碼中,這有利於使用者在開發時更好的理解表的結構和 POJO。
-
添加註釋相關jar包
hibernate-annotations.jar, hibernate-comons-annotations.jar和 ejb3-persistence.jar
-
用帶有註釋的 Employee 類來對映使用定義好的 Employee 表的物件
import javax.persistence.*;
Hibernate 檢測到 @Id 註釋欄位並且認定它應該在執行時通過欄位直接訪問一個物件上的屬性。如果你將 @Id 註釋放在 getId() 方法中,你可以通過預設的 getter 和 setter 方法來訪問屬性。因此,所有其它註釋也放在欄位或是 getter 方法中,決定於選擇的策略。下一節將解釋上面的類中使用的註釋。
-
註釋
@Entity 註釋
-
EJB 3 標準的註釋包含在 javax.persistence 包,所以我們第一步需要匯入這個包。第二步我們對 Employee 類使用 @Entity 註釋,標誌著這個類為一個實體 bean,所以它必須含有一個沒有引數的建構函式並且在可保護範圍是可見的。
@Table 註釋
-
@table 註釋允許您明確表的詳細資訊保證實體在資料庫中持續存在。
-
@table 註釋提供了四個屬性,允許您覆蓋的表的名稱,目錄及其模式,在表中可以對列制定獨特的約束。現在我們使用的是表名為 EMPLOYEE。
@Id 和 @GeneratedValue 註釋
-
每一個實體 bean 都有一個主鍵,你在類中可以用 @Id 來進行註釋。主鍵可以是一個欄位或者是多個欄位的組合,這取決於你的表的結構。
-
預設情況下,@Id 註釋將自動確定最合適的主鍵生成策略,但是你可以通過使用 @GeneratedValue 註釋來覆蓋掉它。strategy 和 generator 這兩個引數我不打算在這裡討論,所以我們只使用預設鍵生成策略。讓 Hibernate 確定使用哪些生成器型別來使程式碼移植於不同的資料庫之間。
@Column Annotation
@Column 註釋用於指定某一列與某一個欄位或是屬性對映的細節資訊。您可以使用下列註釋的最常用的屬性:
-
name 屬性允許顯式地指定列的名稱。
-
length 屬性為用於對映一個值,特別為一個字串值的列的大小。
-
nullable 屬性允許當生成模式時,一個列可以被標記為非空。
-
unique 屬性允許列中只能含有唯一的內容
-
-
hibernate.cfg.xml 配置檔案
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--四個必填項-->
<!--配置資料來源-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--可選項-->
<!--是否輸出hibernate相關資訊到控制檯-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--配置方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--配置建表策略-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--關聯一下 ORM 檔案-->
<mapping resource="cn/edu/dgut/bean/User.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
六、hibernate 主要物件
-
SessionFactory 物件
-
配置物件被用於創造一個 SessionFactory 物件,使用提供的配置檔案為應用程式依次配置 Hibernate,並允許例項化一個會話物件。SessionFactory 是一個執行緒安全物件並由應用程式所有的執行緒所使用。
-
SessionFactory 是一個重量級物件所以通常它都是在應用程式啟動時創造然後留存為以後使用。每個資料庫需要一個 SessionFactory 物件使用一個單獨的配置檔案。所以如果你使用多種資料庫那麼你要創造多種 SessionFactory 物件。
-
Session 物件
-
一個會話被用於與資料庫的物理連線。Session 物件是輕量級的,並被設計為每次例項化都需要與資料庫的互動。持久物件通過 Session 物件儲存和檢索。
-
Session 物件不應該長時間保持開啟狀態因為它們通常情況下並非執行緒安全,並且它們應該按照所需創造和銷燬。
-
Transaction 物件
-
一個事務代表了與資料庫工作的一個單元並且大部分 RDBMS 支援事務功能。在 Hibernate 中事務由底層事務管理器和事務(來自 JDBC 或者 JTA)處理。
-
這是一個選擇性物件,Hibernate 應用程式可能不選擇使用這個介面,而是在自己應用程式程式碼中管理事務。
-
Query 物件
-
Query 物件使用 SQL 或者 Hibernate 查詢語言(HQL)字串在資料庫中來檢索資料並創造物件。一個查詢的例項被用於連結查詢引數,限制由查詢返回的結果數量,並最終執行查詢。
-
Criteria 物件
-
Criteria 物件被用於創造和執行面向規則查詢的物件來檢索物件。
七、hibernate 基本的增刪改查
-
建立sql會話物件的過程封裝成工具類
public class HibernateUtil {
private static SessionFactory sessionFactory = null;
static {
// 建立配置物件,讀取hibernate.cfg.xml配置檔案
Configuration configuration = new Configuration().configure();
// 建立一個會話工廠
sessionFactory = configuration.buildSessionFactory();
}
// 返回一個會話物件
public static Session getSession() {
// 開啟會話,類似於jdbc中的connection
return sessionFactory.openSession();
}
}-
基本的增刪改查
public class HbmDemo01 {
/*// 建立配置物件
Configuration configuration = new Configuration().configure();
// 建立一個會話工廠
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 開啟會話
Session session = sessionFactory.openSession();*/
//增
-