hibernate小結

一、 Hibernate學習一段時間了,暫時告一段落,總結一下。通過這段時間的學習,算是基本入門了,知道了hibernate是個什麼樣的軟件。首先hibernate是個ORM工具,其hibernate首先是個OTM,這裏T指的就是Table,Table之間有着各種各樣的Relation,這個HIbernate也能“模仿”,也就是ORM,也許Hibernate的作者更看重後者,所以hibernate有很多重要的東西在關係映射上。當然表與實體的映射太簡單了,基本上是一一映射就OK了。
實際上Hibernate就完成了一件事兒,從編程的體驗上看就是通過hibernate可以使用面向對象的方式操作數據庫。引用一段話:在理想環境中,獲得任何java對象並將它持久化到數據庫應該是很輕鬆的,不需要編寫特殊的代碼,也不會有性能損失,而且結果是完全可以移植的。在這樣的理想環境中,我們可能會按照以下方式執行數據庫操作:
POJO pojo = new POJO();
ORMSolution magic = ORMSolution.getInstance();
magic.save(pojo);
Hibernate是款神奇的軟件,只需要你有少量的編程經驗就可以完成上述的“理想”,在hibernate中我們是這樣操作的:
session = HibernateSessionFactory.getSession();
session.beginTransaction();
User user = new User();
session.save(user);
session.getTransaction.commit();
其中HibernateSessionFactory我們編寫的輔助類(很多時候並不需要我們手動編寫此類,如果要編寫的話也不是很難,就是個單例模式),他是個靜態工具類,在hibernate初始化的時候它會被裝入內存,且只能有一個。session是hibernate提供的最重要的編程接口,它類似於jdbc的connection, 而user是一個javabean,它與數據庫中的一張表對應,它擁有表中所有的字段,當然在類中是屬性,含有這些字段的get set方法,這就是實體類,在支持hibernate的系統中這樣操作就可以將實體存入數據庫。二、 一般使用hibernate開發的步驟 ①引入hibernate需要的jar包 ②配置hibernate配置文件(hibernate.cfg.xml),因爲hibernate是對jdbc輕量級的封裝,底層還是jdbc我們必須配置次文件,最重要的就是連接數據庫的url用戶名和密碼。 ③編寫對應數據庫表的實體和映射文件。這個也可以用第三方工具生成。3.0以後映射文件也可以省略,可以使用註解代替。    實體就不用說了,可以認爲是hibernate心中的表,而映射文件是告訴hibernate實體類到底與那種表對應(還有表之間的關係)。   一個實體和映射文件的例子:
package com.jfly.hibernate.beans;
public class User {
	private java.lang.Integer id;

	private java.lang.String username;

	private java.lang.String password;

	private java.lang.String email;

	public java.lang.String getEmail() {
		return email;
	}

	public void setEmail(java.lang.String email) {
		this.email = email;
	}

	public java.lang.Integer getId() {
		return id;
	}

	public void setId(java.lang.Integer id) {
		this.id = id;
	}

	public java.lang.String getPassword() {
		return password;
	}

	public void setPassword(java.lang.String password) {
		this.password = password;
	}

	public java.lang.String getUsername() {
		return username;
	}

	public void setUsername(java.lang.String username) {
		this.username = username;
	}
}


映射文件:
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    
<hibernate-mapping>
<class name="com.jfly.hibernate.beans.User" table="user">
    <id name="id" type="java.lang.Integer" column="id">
        <generator class="assigned" />
    </id>
    <property name="username" type="java.lang.String" column="username" not-null="true" length="50"/>
    <property name="password" type="java.lang.String" column="password" not-null="true" length="50"/>
    <property name="email" type="java.lang.String" column="email" length="60"/>

</class>
</hibernate-mapping>

④在hibernate配置文件中加入此映射信息,雖然實體和表之間映射完成了,還得給hibernate一個查找的入口,可以認爲是映射的“總目錄”,   它是非常簡單的:
<mapping resource="com/jfly/hibernate/beans/hbm/User.hbm.xml" />

 在hibernate啓動時會將所有的映射信息加載到一個configuration中,此類將這些信息保存一個hashmap中。 ⑤利用hibernate提供的api編寫程序,一般指的是dao層,所有的對數據庫的操作都應該寫在data access層,並且不包含任何業務邏輯。     比如前面寫的存儲user。最後你可能還需要編寫sevice層,它就是具體的業務邏輯層了,沒有一般的規律,但是它要操作數據庫必須通過dao層,dao層不知道爲什麼要操作數據庫,因爲他是sevice層要求的。這樣一來hibernate就屏蔽了底層的操作,使得業務邏輯層的代碼非常清晰,而且與dao層是鬆耦合的。
除了這些基本原理我們使用hibernate還需要了解如下內容: 1、 hibernate對象的三種生命狀態 2、操作數據庫的兩套api,hql和criteria,當然session本身的方法我覺得也可以算是一種 3、關係映射,比如表的一對多的關係中,如果我們需要遍歷“一”方和“N”方,我們可能需要首先在外層循環中遍歷一方,       然後查找N方得集合,條件是他們的一方等於當前這個一方的值。這並不複雜,但是在hibernate中,實現起來就更爲簡單,       拿到一個一方,直接調用他的get方法就可以或者對他對應的N方的集合,前提是你在hibernate中做了關係映射。       關於hibernate的關係映射是個很複雜的話題,深入討論的話它可能引起數據庫設計的話題,我們知道數據表之間的關係是由主鍵來實現的,      關係是客觀存在的,而主鍵是人爲設置的。關於這個話題我深受一篇博客的影響,現在也找不到了,他提到數據庫的主鍵應該進可能的簡單,      一般來說只有一個,且是無意義的,比如我們可以使用uuid。這樣一來hibernate的關係映射可能就會變得簡單,而數據的完整性我們應該通過程序來      實現,畢竟對象之間的關係也是一種業務上的行爲,應該有業務層來控制,不應該在底層干涉,我認爲這是有道理的。由於公司裏不用hibernate,關於這塊     只有以後再學了。 4、hibernate的兩種鎖機制。 5、hibernate還有些高級特徵,可能一般情況下我們不會用到,但是應該留意一下:hibernate可以使用傳統的sql,可以調用存儲過程,hibernate中有      事件和監聽器,有攔截器這些概念。
發佈了27 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章