使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查課件_第1頁(yè)
使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查課件_第2頁(yè)
使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查課件_第3頁(yè)
使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查課件_第4頁(yè)
使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查課件_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的增刪改查目錄12基于XML映射文件實(shí)現(xiàn)數(shù)據(jù)的增刪改查基于Annotation注解實(shí)現(xiàn)數(shù)據(jù)的增刪改查212.1基于XML映射文件實(shí)現(xiàn)數(shù)據(jù)的增刪改查312.1.1Hibernate數(shù)據(jù)操作流程4作為一個(gè)優(yōu)秀的持久層框架,Hibernate很容易入門。應(yīng)用程序無(wú)須直接訪問(wèn)數(shù)據(jù)庫(kù),甚至無(wú)須理會(huì)底層采用何種數(shù)據(jù)庫(kù)——這一切對(duì)應(yīng)用程序完全透明,應(yīng)用程序只需創(chuàng)建、修改、刪除持久化對(duì)象即可;Hibernate則負(fù)責(zé)把這種操作轉(zhuǎn)換為對(duì)指定數(shù)據(jù)表的操作。在使用Hibernate框架前,先來(lái)看看Hibernate是如何實(shí)現(xiàn)ORM框架的,即Hibernate的執(zhí)行流程,如圖所示。通過(guò)Hibernate操作數(shù)據(jù)庫(kù)需要以下步驟:(1)讀取并解析配置文件;

(2)讀取并解析映射信息,創(chuàng)建SessionFactory;(3)打開(kāi)Session;(4)開(kāi)啟一個(gè)事務(wù);(5)執(zhí)行數(shù)據(jù)庫(kù)操作(6)提交事務(wù)(回滾事務(wù));(7)關(guān)閉Session、關(guān)閉SessionFactory。12.1.2添加數(shù)據(jù)5通過(guò)一個(gè)添加數(shù)據(jù)的實(shí)例來(lái)體驗(yàn)Hibernate的魅力。本實(shí)例采用的數(shù)據(jù)庫(kù)為MySQL5.7,使用Hibernate向數(shù)據(jù)庫(kù)restrant中的users表中添加新記錄。數(shù)據(jù)表users部分字段如表所示。在MyEclipse中創(chuàng)建Java項(xiàng)目,名稱為hibernate-1。在項(xiàng)目中新建文件夾“l(fā)ib”,用于存放項(xiàng)目所需的jar包,項(xiàng)目hibernate-1最終的目錄結(jié)構(gòu)如圖所示。字段名類型說(shuō)明Idint用戶編號(hào),主鍵、自增LoginNamevarchar(20)登錄名稱LoginPwdvarchar(20)登錄密碼TrueNamevarchar(20)真實(shí)姓名12.1.2添加數(shù)據(jù)6將第11章中11.2小節(jié)中的Hibernate必需的jar包,復(fù)制到該項(xiàng)目下的lib目錄中,即完成了Hibernate的安裝。將MySQL的JDBC驅(qū)動(dòng)包也復(fù)制到該項(xiàng)目的lib目錄中,這里使用的版本為“mysql-connector-java-5.1.42-bin.jar”。選中該項(xiàng)目lib目錄下的所有jar包,右擊并選擇“BuildPath”

“AddtoBuildPath”命令,將這些jar包添加到項(xiàng)目的構(gòu)建路徑中。創(chuàng)建實(shí)體類User.java(對(duì)應(yīng)數(shù)據(jù)表users)編寫映射文件User.hbm.xml編寫Hibernate配置文件hibernate.cfg.xml編寫測(cè)試類HibernateTest.java運(yùn)行測(cè)試方法testSaveUserHibernate的對(duì)象3種狀態(tài)轉(zhuǎn)變7Hibernate以面向?qū)ο蟮姆绞綄?shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,即將對(duì)數(shù)據(jù)表和字段的操作轉(zhuǎn)變?yōu)閷?duì)實(shí)體類和屬性的操作。在這一過(guò)程中,Hibernate對(duì)象經(jīng)歷了狀態(tài)的變遷。Hibernate的對(duì)象有3種狀態(tài),分別為:瞬時(shí)態(tài)(Transient)、持久態(tài)(Persistent)、脫管態(tài)(Detached)。處于持久態(tài)的對(duì)象也稱為PO(PersistenceObject),瞬時(shí)對(duì)象和脫管對(duì)象也稱為VO(ValueObject)。Hibernate的對(duì)象3種狀態(tài)轉(zhuǎn)變關(guān)系如圖所示。Hibernate的對(duì)象由瞬時(shí)態(tài)或托管態(tài)轉(zhuǎn)變?yōu)槌志脩B(tài)的方法有:save()、load()或get()、find()、update()、saveOrUpdate()和lock()Hibernate的對(duì)象由持久態(tài)轉(zhuǎn)變?yōu)橥泄軕B(tài)的方法有:close()、evict()Hibernate的對(duì)象3種狀態(tài)轉(zhuǎn)變8由new關(guān)鍵字創(chuàng)建的對(duì)象,如果它與數(shù)據(jù)庫(kù)中的數(shù)據(jù)沒(méi)有任何關(guān)聯(lián),也沒(méi)有通過(guò)Session實(shí)例進(jìn)行任何持久化操作,則該對(duì)象處于瞬時(shí)態(tài)。瞬時(shí)態(tài)對(duì)象一旦不再被其他對(duì)象引用,那么很快將被Java虛擬機(jī)回收。例如,測(cè)試類中通過(guò)new關(guān)鍵字創(chuàng)建的實(shí)體類user,其狀態(tài)為瞬時(shí)態(tài)。在Hibernate中通過(guò)Session的save()和saveOrUpdate()方法,可以將瞬時(shí)對(duì)象轉(zhuǎn)變成持久態(tài)對(duì)象,同時(shí)將對(duì)象中攜帶的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)表中。處于持久態(tài)的對(duì)象在數(shù)據(jù)庫(kù)中具有相應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)。持久態(tài)對(duì)象位于一個(gè)Session實(shí)例的緩存中,即總是與一個(gè)Session實(shí)例相關(guān)聯(lián)。當(dāng)Session清理緩存時(shí),會(huì)根據(jù)持久態(tài)對(duì)象的屬性的變化,同步更新數(shù)據(jù)庫(kù)。例如,測(cè)試類中調(diào)用Session實(shí)例的save方法后,user對(duì)象的狀態(tài)由瞬時(shí)態(tài)轉(zhuǎn)變?yōu)槌志脩B(tài)。如果持久態(tài)對(duì)象的相關(guān)聯(lián)的Session實(shí)例執(zhí)行delete()方法之后,持久態(tài)對(duì)象將轉(zhuǎn)變?yōu)樗矔r(shí)態(tài),同時(shí)刪除數(shù)據(jù)庫(kù)中相應(yīng)的記錄,該對(duì)象不再與數(shù)據(jù)庫(kù)的記錄相關(guān)聯(lián)。如果持久態(tài)對(duì)象的相關(guān)聯(lián)的Session實(shí)例執(zhí)行close方法、clear方法或者evict方法之后,持久態(tài)對(duì)象將轉(zhuǎn)變成托管態(tài)。例如,測(cè)試類中調(diào)用session.close()方法關(guān)閉Session后,user對(duì)象狀態(tài)由持久態(tài)轉(zhuǎn)為托管態(tài)。此后,如果user對(duì)象中屬性值發(fā)生變化,Hibernate不會(huì)再將變化同步到數(shù)據(jù)庫(kù)中。托管態(tài)對(duì)象如果不再被任何對(duì)象引用,將很快被垃圾回收。如果被重新關(guān)聯(lián)到Session上時(shí),托管態(tài)對(duì)象將再次轉(zhuǎn)變?yōu)槌志脩B(tài)。托管態(tài)對(duì)象具有數(shù)據(jù)庫(kù)記錄標(biāo)識(shí),可以使用Session的update()或者saveOrUpdate()方法將托管態(tài)對(duì)象轉(zhuǎn)變?yōu)槌志脩B(tài),即對(duì)象與數(shù)據(jù)庫(kù)記錄同步。托管態(tài)對(duì)象與瞬態(tài)對(duì)象相同之處在于:如果不再被任何對(duì)象引用,將很快被垃圾回收;不同之處在于:托管態(tài)對(duì)象有數(shù)據(jù)庫(kù)記錄標(biāo)識(shí),瞬態(tài)對(duì)象沒(méi)有。12.1.3加載數(shù)據(jù)9加載數(shù)據(jù)是指通過(guò)標(biāo)識(shí)符得到指定類的持久化對(duì)象,可以通過(guò)Session實(shí)例加載數(shù)據(jù),Session提供了兩種方法來(lái)加載數(shù)據(jù),分別如下:

Objectget(Classclass,Serializableid):通過(guò)實(shí)體類class對(duì)象和id加載數(shù)據(jù)。

Objectload(Classclass,Serializableid):通過(guò)實(shí)體類class對(duì)象和id加載數(shù)據(jù)。使用get()方法:在測(cè)試類HibernateTest中,添加testGetUser()方法,并使用@Test注解加以修飾,實(shí)現(xiàn)從數(shù)據(jù)表users中加載編號(hào)Id為1的用戶對(duì)象,并在控制臺(tái)輸出。使用load()方法:在測(cè)試類HibernateTest中,添加testLoadUser()方法,并使用@Test注解加以修飾,實(shí)現(xiàn)從數(shù)據(jù)表users中加載編號(hào)Id為1的用戶對(duì)象,并在控制臺(tái)輸出12.1.4刪除數(shù)據(jù)10刪除數(shù)據(jù)是指根據(jù)主鍵值將一條記錄從數(shù)據(jù)表中刪除,可以通過(guò)Session實(shí)例的delete(Objectobj)方法來(lái)刪除數(shù)據(jù)庫(kù)中的記錄。delete方法的參數(shù)obj表示要?jiǎng)h除的持久態(tài)對(duì)象。因此在調(diào)用delete方法前,需要通過(guò)Session的get方法獲得指定標(biāo)識(shí)的持久態(tài)對(duì)象。在測(cè)試類HibernateTest中,添加testDeleteUser()方法,并使用@Test注解加以修飾,實(shí)現(xiàn)將數(shù)據(jù)表users中編號(hào)id為8的記錄刪除。12.1.5修改數(shù)據(jù)11通過(guò)Session實(shí)例的update(Objectobj)方法可以修改數(shù)據(jù)庫(kù)中的記錄,參數(shù)obj表示要修改的對(duì)象。update方法可將一個(gè)處于托管態(tài)的對(duì)象加載到Session緩存中,與一個(gè)具體的Session實(shí)例關(guān)聯(lián),使其狀態(tài)轉(zhuǎn)變?yōu)槌志脩B(tài)。在調(diào)用update方法前,需要通過(guò)Session的get方法獲得指定標(biāo)識(shí)的持久態(tài)對(duì)象。在測(cè)試類HibernateTest中,添加testUpdateUser()方法,并使用@Test注解加以修飾,實(shí)現(xiàn)將數(shù)據(jù)表users中編號(hào)Id為2的記錄中登錄名由“shijun”修改為“sj”。以面向?qū)ο蟮乃季S編寫代碼是Hibernate持久化操作的一個(gè)理念。12.2基于Annotation注解實(shí)現(xiàn)數(shù)據(jù)的增刪改查1212.2基于Annotation注解實(shí)現(xiàn)數(shù)據(jù)的增刪改查13從JDK1.5開(kāi)始,Java增加了Annotation注解技術(shù)解決方案,將原來(lái)通過(guò)XML配置文件管理的信息改為通過(guò)Annotation進(jìn)行管理,從而實(shí)現(xiàn)Hibernate的零配置。Hibernate的Annotation方案是以Java持久化(JavaPersistenceAPI,簡(jiǎn)稱JPA)為基礎(chǔ),進(jìn)一步擴(kuò)展而來(lái)。使用Annotation注解實(shí)現(xiàn)數(shù)據(jù)的CRUD步驟如下:

(1)先將項(xiàng)目hibernate-1復(fù)制并命名為“hibernate-2”,再導(dǎo)入到MyEclipse開(kāi)發(fā)環(huán)境中。

(2)修改實(shí)體類User.java,通過(guò)Annotation注解將數(shù)據(jù)表與實(shí)體類之間的映射在實(shí)體類中完成,無(wú)需使用映射文件,因此需要先將項(xiàng)目hibernate-2的com.hibernate.entity包中的映射文件User.hbm.xml刪除,然后修改實(shí)體類User.java。

(3)修改Hibernate配置文件。12.2基于Annotation注解實(shí)現(xiàn)數(shù)據(jù)的增刪改查14JPA(JavaPersistenceAPI)規(guī)范推薦使用Annotation來(lái)管理實(shí)體類與數(shù)據(jù)表之間的映射關(guān)系,從而避免同時(shí)維護(hù)兩份文件(Java實(shí)體類和XML映射文件),將映射信息(寫在Annotation中)與實(shí)體類集中在一起。在實(shí)體類User.java代碼中,使用了@Entity注解、@Table注解、@Id注解、@GeneratedValue注解和@Column注解,這些注解的含義如表所示。主鍵生成策略通過(guò)GenerationType來(lái)指定,有以下幾種:GenerationType.IDENTITYGenerationType.AUTOGenerationType.SEQUENCEGenerationType.TABLEAnnotation名稱功能描述@Entity表示當(dāng)前類為實(shí)體Bean,需要進(jìn)行持久化。將一個(gè)JavaBean聲明為持久化類時(shí),默認(rèn)情況下,該類的所有屬性都將映射到數(shù)據(jù)表的字段。如果在該類中添加了無(wú)需映射的屬性,則需使用@Transient注解聲明@Table實(shí)現(xiàn)數(shù)據(jù)表與持久化類之間的映射,catalog指定數(shù)據(jù)庫(kù)名,name指定表名。@Table注解位置在@Entity注解之下。@Id指定當(dāng)前持久化類的ID標(biāo)識(shí)屬性,與@GeneratedValue配合使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論