Hibernate的入門知識

Red88Army發表於2020-04-06
Hibernate的入門知識
一,hibernate概述
Hibernate 是由JBoss公司著名構架師Gavin King設計,開發的一個開源ORM框架,可以從不同的角度解析Hibernate。
1. 它是連線java應用程式和關聯式資料庫的中介軟體
2. 它對JDBC API進行了封裝,負責Java物件的持久化
3. 在分層的軟體架構中它位於持久化層,封裝了所有資料訪問細節,使業務邏輯層專注於實現業務邏輯。
4. 它是一種ORM工具,能夠建立物件導向的域模型和關係模型的對映。
二.搭建Hibernate應用開發環境
1)下載和安裝配置
第一步:下載。登入到Hibernate官方網站http://www.hibernate.org/6.html,下載
第二步:解壓獲取必需類庫檔案。解壓縮叢Hibernate網站下載的hibernate釋出包,在根目錄下有Hibernate3.jar檔案,該檔案就是Hibernate Core的核心類庫檔案,把它新增到Hibernate應程式中,在根目錄lib/required目錄下的所有jar檔案都是Hibernate3核心類庫檔案編譯和執行所必須的第三方類庫檔案,也新增到Hibernate應用程式中。如圖所示所需的包

[img]http://dl.iteye.com/upload/attachment/604682/855b9f2e-1e55-30a8-8c95-2609e669076a.bmp[/img]



三.第一個Hibernate應用程式
我們所做的第一件事就是建立我們的開發目錄,並把所需要的java庫檔案放進去。解壓縮叢Hibernate網站下載的Hibernate釋出包,並把/lib目錄下所有需要的庫檔案拷到我們新建的開發目錄下的/lib目錄下。
1) 第一個class
我們的第一個持久化類是一個帶有一些屬性(property)的簡單
1.JavaBean類:
public class User {
private int id;
private Name name;
private Date brithday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Date getBrithday() {
return brithday;
}
public void setBrithday(Date brithday) {
this.brithday = brithday;
}

}


你可以看到這個類對屬性的存取方法(getter and setter method)使用了標準JavaBean命名約定。同時把類屬性的訪問級別設為私有的(private),這是推薦的設計,但並不是必須的。Hibernate也可以直接訪問這些屬性,而使用訪問方法的好處是提供了重構時的健壯,為了通過反射機制來例項化這個類的物件,我們需要提供一個無參的構造器。
所有的持久化類都要求有無參的構造器,因為Hibernate必須使用java反射機制來為你建立物件。構造器的訪問級別可以是Private,然而當生成執行時代理時這則要求使用至少package級別的訪問控制,這樣在沒有位元組碼的指令的情況下,從持久化類裡獲取資料會更有效率
2.對映檔案:
Hibernate需要知道怎樣去載入和儲存持久化的物件。這正是hibernate對映檔案發揮作用的地方,對映檔案告訴Hibernate,應該訪問資料庫裡面的哪一個表及應該使用表裡面的那些欄位。
一起看一下對映檔案的基本結構:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
[....]
</hibernate-mapping>

在hibernate-mapping標籤之間,含有一個class元素,所有的持久化實體類(再次宣告,或許接下來會有依賴類,就是那些次要實體)都需要一個這樣的對映,來把類物件對映到sql資料庫裡的表
User類對應的對映檔案
<hibernate-mapping
package="com.hbsi.domain">--指定java實體類的包名

<class name="User" table="user">---說明實體類怎樣對映成表
<id name="id" column="id">--column可省略
<generator class="native"/>--宣告主鍵
</id>
<property name="name"/>
<property name="brithday"/>
</class>

id元素識別符號屬性的宣告,name=”id”宣告瞭java屬性的名字(hibernate會使用getId()和SetId()來訪為它),column屬性則告訴Hibernate,我們使用User表的哪一個欄位作為主鍵,巢狀的generator元素指定了識別符號生成策略,在這裡我們指定為native。它根據已配置的資料庫自動選擇最佳的識別符號生成策略。
和id元素一樣,property元素的name屬性告訴hibernate使用哪個getter和setter方法,在此類之中會尋找getName(),getBrithday()
3.Hibernate配置
現在我們已經有了一個持久化類和它的對映檔案,該是配置Hibernate的時候了。為了儲存Hibernate的配置,我們可以使用一個簡單的Hibernate.properties檔案,或者一個稍微複雜的Hibernate.cfg.xml。

<!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="connection.url">jdbc:mysql:///demo</property>

<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.show_sql">true</property>


<mapping resource="com/hbsi/domain/User.hbm.xml"/>

</session-factory>
</hibernate-configuration>

最開始的四個Property元素包含JDBC連結資訊。方言(dialect)的property元素指明Hibernate生成的特定SQL變數。
把這個檔案拷貝到原始碼目錄下面,這樣他就位於classpath的根目錄的最後。Hibernate在啟動時會在classpath的根目錄查詢名為hibernate.cfg.xml的配置檔案。
Hibernate.show-sql:指定是否把hibernate執行時的sql語句輸出到控制檯。
Hibernate.format_sql:指定是否把hibernate執行時的sql語進行格式化以便於閱讀。
Hibernate.Hbm2ddl.auto:指定應用程式在執行時,當產生SessionFactory例項時對是否自動檢查資料庫結構,可選值有:vaildate(檢查資料庫結構),update(資料庫結構發生變化是修改),create(將資料庫的DDL匯出到資料庫)和crete-drop(SessionFactory例項建立時將資料庫schema的DDL匯入到資料庫,在sessionFactory被顯示關閉時將資料庫自動刪除)
啟動和輔助類
是時候載入和儲存一些Event物件了,但首先我們得編寫一些基礎的程式碼以完成設定。此過程包括建立一個全域性sessionFactory,並把它儲存在應用程式程式碼容易訪問的地方。SessionFactory可以建立開啟新的session,一個session代表一個單執行緒的單元操作,sessionFactory則是一個執行緒安全的全域性物件,只需要被例項化一次。
我們將建立一個HibernateUtil輔助類來負責啟動Hibernate和更方便的操作SessionFactory,讓我們來看一下他的實現吧!
package com.hbsi.hibernate.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public final class HibernateUtil {
private static SessionFactory sessionFactory;

private HibernateUtil(){

}
static{

//第一步:讀取配置檔案並啟動hibernate
Configuration cfg=new Configuration();
cfg.configure();
//第二步:獲取會話工廠
sessionFactory=cfg.buildSessionFactory();}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession(){
return sessionFactory.openSession();

}
}
把HibernateUtil.java 放在開發目錄的原始碼路徑下,與方User的包並列。
4.載入並儲存物件
我們終於可以使用Hibernate來載入和儲存物件了,編寫一個帶有main()方法的TestHibernate類
public class TestHibernate {
public static void main(String[] args) {
User user=new User();
user.setName("Tom");
user.setBrithday(new Date());
addUser(user);
}
public static void addUser1(User user){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
session.save(user);

tx.commit();

}finally{

if(session!=null)
session.close();
}
}

}


我們建立了個新的User物件並把它傳遞給Hibernate。現在Hibernate負責與SQL打交道並把INSERT命令傳給資料庫。在執行之前,讓那個我們來看一下處理session和Transaction的程式碼。
首先,只要你持有SessionFactory(幸虧我們有HIbernateUtil,可以隨時獲取得到),大可在任何時候,任何地點呼叫這個方法
其次,session在第一次被使用的時候,其生命週期就開始。然後它被Hibernate繫結到當前執行緒。當事務結束的時候,不管是提交還是回滾,Hibernate會自動把Session從當前執行緒剝離,並且關閉它。

相關文章