實際上Hibernate就完成了一件事兒,從編程的體驗上看就是通過hibernate可以使用面向對象的方式操作數據庫。引用一段話:在理想環境中,獲得任何java對象並將它持久化到數據庫應該是很輕鬆的,不需要編寫特殊的代碼,也不會有性能損失,而且結果是完全可以移植的。在這樣的理想環境中,我們可能會按照以下方式執行數據庫操作:
Hibernate是款神奇的軟件,只需要你有少量的編程經驗就可以完成上述的“理想”,在hibernate中我們是這樣操作的:POJO pojo = new POJO(); ORMSolution magic = ORMSolution.getInstance(); magic.save(pojo);
其中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實體類到底與那種表對應(還有表之間的關係)。 一個實體和映射文件的例子:session = HibernateSessionFactory.getSession(); session.beginTransaction(); User user = new User(); session.save(user); session.getTransaction.commit();
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中有 事件和監聽器,有攔截器這些概念。