Hibernate作為數據持久化層的一種技術(shù)應用很廣泛?,F在就其中的知識點(diǎn)在讀書(shū)過(guò)程中進(jìn)行記錄和總結。
這里主要考慮的一種數據的解決方案是:通過(guò)DAO(Data Accss Object)和ORM(Object Relational Mapping)實(shí)現數據的持久化操作。在這種數據持久化實(shí)現方案中,通過(guò)DAO來(lái)實(shí)現對Java對象與數據庫中數據之間的相互轉換,同時(shí)他還包括了數據庫的連接管理、事務(wù)管理以及對象的緩沖管理等功能。
這種數據持久化解決方案的實(shí)現方法的示意圖圖下:業(yè)務(wù)層--->DAO--->ORM--->數據庫
首先配置軟件開(kāi)發(fā)環(huán)境:JDK1.5,Tomcat5.0,MySQL5,Ant1.5,Eclipse3.1相關(guān)軟件的下載地址見(jiàn):
http://blog.163.com/wyl_jxy/collection/各種工具的配置和使用請參考相應的資料。
現在先簡(jiǎn)單介紹一下運用Hibernate進(jìn)行Web應用開(kāi)發(fā)的過(guò)程,為更深層次利用Hibernate工作打下基礎。
當然不同的項目可以根據自身情況對設計過(guò)程進(jìn)行適當的剪裁或補充。適合的就是最好的。不必拘泥與某一種方式步驟。
這里采用的開(kāi)發(fā)順序是先進(jìn)行系統的建模以及實(shí)現系統模型的工作,接下來(lái)的工作是完成系統的配置文件和HBM文件(即映射文件),然后進(jìn)行DAO的開(kāi)發(fā)和測試工作,最后完成整個(gè)系統的頁(yè)面處理部分。
設計、分析和實(shí)現持久層對象需要很多步驟來(lái)完成,下面一步一步來(lái)說(shuō)明
首先,需要掌握如何確定一個(gè)應用程序的業(yè)務(wù)實(shí)體。在分析業(yè)務(wù)實(shí)體的過(guò)程中將會(huì )創(chuàng )建一系列概念上的模型,用這些模型對象來(lái)表示業(yè)務(wù)實(shí)體以及業(yè)務(wù)實(shí)體的屬性,這樣的模型被稱(chēng)為域模型。然后,使用Java語(yǔ)言實(shí)現這個(gè)域模型,也就是為每一個(gè)實(shí)體創(chuàng )建一個(gè)持久層的JAVA對象。
然后,完成映射文件的定義工作。映射文件的主要作用就是描述這些java持久層對象以及他們的屬性和數據庫中的表以及表中的字段之間的關(guān)系。這樣,Hibernate才能自動(dòng)建立java對象與數據庫中數據的關(guān)聯(lián)關(guān)系,從而實(shí)現他們之間的轉換。換言之,映射文件是為了把java對象和數據表以及數據字段關(guān)聯(lián)。配置文件則定義的是如何連接數據庫。
接下來(lái)的步驟是進(jìn)行DAO的定義和開(kāi)發(fā)工作。通過(guò)DAO,可以完成對數據庫進(jìn)行的各種持久化操作以及在開(kāi)發(fā)中所需實(shí)現的部分業(yè)務(wù)邏輯。
最后的工作是完成JSP頁(yè)面,通過(guò)對DAO的調用完成整個(gè)系統的所有功能。
映射文件的說(shuō)明:
映射文件頂層是一個(gè)hibernate-mapping元素,定義了當前配置文件中映射關(guān)系的基本屬性,也可以說(shuō)它所定義的屬性是對映射文件中所有子節點(diǎn)發(fā)揮作用的。
具體細節以后詳述
配置文件的說(shuō)明:
Hibernate配置文件主要用來(lái)設置Hibernate的行為。他所描述的信息主要包括以下幾個(gè)方面:
1 數據庫的連接信息:在Hibernate中可以使用兩種方式連接數據庫。一種是根據JDBC的參數連接數據庫,由Hibernate完成連接的過(guò)程和連接的管理。另一種方式是通過(guò)JNDI完成數據庫的連接,Hibernate之間獲取數據庫的連接。
使用JDBC進(jìn)行連接方式,需要對下列參數進(jìn)行配置:
hibernate.dialect 指定數據庫使用的SQL方言
hibernate.connection.driver_class 指定數據庫的驅動(dòng)程序
hibernate.connection.url 指定數據庫的URL
hibernate.connection.username 指定連接數據庫的用戶(hù)名
hibernate.connection.password 指定連接數據庫的口令
hibernate.show_sql 如果為true,表示程序在運行時(shí),會(huì )在控制臺輸入SQL語(yǔ)句,這有利于跟蹤Hiberante的運行狀態(tài),默認為false。在應用開(kāi)發(fā)和測試階段,可以設這個(gè)屬性為true,以便跟蹤和測試程序,在應用開(kāi)發(fā)階段,應該把這個(gè)屬性設為false,以便減少應用的輸出信息,提高性能
2 數據庫連接池的信息
3 可選的配置項
4 HBM(映射文件)列表
使用Hibernate進(jìn)行數據持久化操作的過(guò)程
使用Hibernate進(jìn)行持久化操作主要需要以下步驟:
STEP 1:創(chuàng )建Configuration對象。在這一步中主要為了進(jìn)行配置文件的裝載操作,讀取所有的配置文件并進(jìn)行解析
STEP 2: 創(chuàng )建SessionFactory對象。通過(guò)創(chuàng )建好的Configuration對象可以創(chuàng )建一個(gè)sessionFactory對象的實(shí)例,特使Session對象實(shí)例的工廠(chǎng),他在整個(gè)應用中應該是唯一的。
STEP 3:創(chuàng )建Session對象。 Session對象類(lèi)似于數據庫的連接對象,可以理解為與數據庫建立的一個(gè)連接,但是他的功能要比JDBC中的Connection對象豐富很多。
STEP 4:開(kāi)始一個(gè)事務(wù)。在Java中定義一個(gè)事務(wù)操作的開(kāi)始,這是使用Hibernate進(jìn)行持久化操作必不可少的步驟
STEP 5:進(jìn)行持久化操作。在這個(gè)步驟中可以讀取或者保存Java對象。
STEP 6:結束事務(wù)。在操作完成之后還要進(jìn)行顯式的結束事務(wù)的操作。
STEP 7:關(guān)閉Session。類(lèi)似于釋放數據庫的連接。
下面說(shuō)最后一項DAO層的實(shí)現
DAO層的實(shí)現
在完成了域模型的定義和配置工作之后,接下來(lái)要完成的工作就是定義DAO接口,并使用Hibernate來(lái)實(shí)現所定義的DAO接口。
當然直接使用Hibernate來(lái)訪(fǎng)問(wèn)數據庫也是完全可以的,但是這種結構的系統會(huì )具有更好的靈活性。通過(guò)這種使用接口的編程方法,可以在方法的調用者和方法的實(shí)現者之間建立一個(gè)屏障,即他們之間不存在任何關(guān)聯(lián),一邊的修改不會(huì )影響到另外一邊的正確運行。例如現在所選擇的持久化組件為Hibernate,過(guò)一段時(shí)間可能會(huì )有更好的持久化層組件出現,或者想直接采用JDBC來(lái)實(shí)現持久化層的操作,那么只需要修改具體的實(shí)現方法就可以了,而不需要對調用持久化層的業(yè)務(wù)處理方法進(jìn)行任何修改。
DAO接口和DAO實(shí)現之間的關(guān)系:HibernateDAO,IUerDAO,UserDAO
上述的三個(gè)*DAO是中(1)HibernteDAO是基礎類(lèi),它包含了使用Hibernate進(jìn)行持久化操作的一些基礎方法。實(shí)現具體業(yè)務(wù)方法的DAO方法,通過(guò)繼承這個(gè)類(lèi),可以在很大程度上簡(jiǎn)化持久化操作的步驟,減少代碼的重復量。(2)IUerDAO是接口,定義了對對象User進(jìn)行持久化操作的各種方法。只有接口定義,沒(méi)有實(shí)現。具體有什么樣的方法,完全取決于對象User。User是前面工作中定義的持久化對象。 注意:一個(gè)持久化對象對應一個(gè)DAO接口(3)UserDAO 這個(gè)才是真正的DAO實(shí)現類(lèi)。他集成了基礎類(lèi),實(shí)現了DAO接口。一個(gè)實(shí)現類(lèi)要實(shí)現對應的接口。
下面貼出幾段代碼可以根據上面的說(shuō)明自己理解DAO:
提示:在Hibernate軟件包的etc目錄下,有一個(gè)hibernate.properties文件,它提供了連接各種關(guān)系數據庫的配置代碼樣例