Hibernate-PPT整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)_第1頁
Hibernate-PPT整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)_第2頁
Hibernate-PPT整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)_第3頁
Hibernate-PPT整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)_第4頁
Hibernate-PPT整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)_第5頁
已閱讀5頁,還剩693頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第一章 Hibernate入門 理解Hiberate原理 掌握如何搭建Hibernate開發(fā)環(huán)境 理解持久化對(duì)象的狀態(tài)與轉(zhuǎn)換 掌握Hibernate的配置 了解Hibernate的常用接口1本章指引1.1 SSH概述1.2 Hibernate簡介1.3 第一個(gè)HiBernate項(xiàng)目1.4 映射文件詳解1.5 配置文件詳解1.6 Hibernate持久化對(duì)象1.7 Hibernate的核心接口簡介1.8 上機(jī)實(shí)驗(yàn)21.1 SSH概述 3SSH是JavaEE的 spring,struts2,Hibernate三大框架的縮寫SpringStructs2HibernateDAO層控制層提高數(shù)據(jù)庫的操作

2、效率控制程序的跳轉(zhuǎn)。使用了MVC原理以及文件上傳下載、數(shù)據(jù)驗(yàn)證、眾多功能標(biāo)簽等技術(shù)為類與類之間的過度依賴提供解決方案,以及方便地以AOP方式切入系統(tǒng)級(jí)業(yè)務(wù),并且接管Hibernate的數(shù)據(jù)庫配置,事務(wù)管理等,整合了其余兩個(gè)框架。1.2 Hibernate簡介 Hibernate是當(dāng)前流行的一種ORM(Object Relational Mapping,對(duì)象關(guān)系映射)框架。所謂ORM就是對(duì)象和關(guān)系型數(shù)據(jù)庫表之間的一種映射關(guān)系,可以自動(dòng)把應(yīng)用程序中的對(duì)象,持久化到關(guān)系型數(shù)據(jù)庫的表中,反之也可把關(guān)系型數(shù)據(jù)庫的表中的一條記錄讀取出來并轉(zhuǎn)化為程序中的一個(gè)對(duì)象。什么是ORM?有了ORM,JavaEE開發(fā)者

3、就可以使用面向?qū)ο蟮木幊趟枷雭聿僮鲾?shù)據(jù)庫,取代傳統(tǒng)的JDBC。通過操作Java對(duì)象,就可以完成對(duì)數(shù)據(jù)庫表的操作。1.2 Hibernate簡介 Hibernate對(duì)應(yīng)三層架構(gòu)開發(fā)中的數(shù)據(jù)訪問層、JDBC訪問數(shù)據(jù)庫的代碼做了輕量級(jí)封,是“全自動(dòng)”的ORM框架。支持許多面向?qū)ο蟮奶匦裕缃M合,繼承,多態(tài)等,Java開發(fā)者可以自由地使用對(duì)象編程思維來操縱數(shù)據(jù)庫支持一對(duì)多,多對(duì)多關(guān)聯(lián),連接查詢,級(jí)聯(lián)操作,緩存等,功能強(qiáng)大可移植性好,可適用于多種數(shù)據(jù)庫是一種開源框架,必要時(shí)可以自行編碼進(jìn)行擴(kuò)展??梢宰詣?dòng)生成SQL語句并自動(dòng)執(zhí)行不能使用存儲(chǔ)過程不太適合大規(guī)模的批處理不適合小型項(xiàng)目與MyBatis相比,較為

4、復(fù)雜,不易掌握。使用面向?qū)ο蟮腍QL查詢語言,有些人使用起來不太習(xí)慣。特點(diǎn)缺點(diǎn)1.2 Hibernate簡介 /projects/hibernate/files/hibernate3/點(diǎn)擊圖1.2中的3.6.10.Final鏈接下載其中的hibernate-distribution-3.6.10.Final-dist.zip壓縮包解壓后文件結(jié)構(gòu)如圖1.4所示下載Hiberante 1.2 Hibernate簡介 Hiberante項(xiàng)目必須的jar包 log4j-1.2.17.jar和slf4j-log4j12-1.7.12.jar這2個(gè)jar包用于整合Hibernate的日志系統(tǒng)log4j(這

5、兩個(gè)jar包需要另外上網(wǎng)搜索下載)1.3 第一個(gè)Hibernate項(xiàng)目 1.3.1 創(chuàng)建項(xiàng)目并導(dǎo)入JAR包 首先在Eclipse中創(chuàng)建一個(gè)Web項(xiàng)目ssh01 將表1.1中Hibernate所需10個(gè)jar包復(fù)制到項(xiàng)目的WEB-INF/lib目錄中 此外還需要連接MySQL數(shù)據(jù)庫,需要添加MySQL的驅(qū)動(dòng)包,本書中使用的 MySQL驅(qū)動(dòng)版本是mysql-connector-java-5.1.21.jar 復(fù)制好后,添加到構(gòu)建路徑中1.3 第一個(gè)Hibernate項(xiàng)目 1.3.2 創(chuàng)建數(shù)據(jù)庫及表本書使用的數(shù)據(jù)庫為MySQL5.7.18,客戶端使用SQLyog在MySQL中創(chuàng)建一個(gè)名稱為stude

6、ntdb的數(shù)據(jù)庫,在此數(shù)據(jù)庫中創(chuàng)建一張名為student的數(shù)據(jù)表1.3 第一個(gè)Hibernate項(xiàng)目 1.3.3 創(chuàng)建持久化類持久化類與數(shù)據(jù)庫表相對(duì)應(yīng),持久化類的屬性名稱、個(gè)數(shù)、類型都與數(shù)據(jù)庫表的列名、個(gè)數(shù)、類型一一對(duì)應(yīng)。在項(xiàng)目src目錄下,創(chuàng)建com.seehope.entity包,并在包中創(chuàng)建持久化類Student,類中創(chuàng)建與student數(shù)據(jù)表字段對(duì)應(yīng)的屬性,以及相應(yīng)的getter和setter方法1.3 第一個(gè)Hibernate項(xiàng)目 節(jié)點(diǎn) 配置持久化類的映射信息;它的name屬性對(duì)應(yīng)持久化類名,table屬性對(duì)應(yīng)數(shù)據(jù)庫中的表名。節(jié)點(diǎn) 節(jié)點(diǎn)下;用來定義持久化類的主鍵屬性(對(duì)應(yīng)數(shù)據(jù)庫表中的

7、主鍵);name屬性對(duì)應(yīng)持久化類的主鍵屬性,column屬性對(duì)應(yīng)數(shù)據(jù)庫表中的主鍵列子節(jié)點(diǎn) 節(jié)點(diǎn)下;用于指定主鍵的生成策略。這里設(shè)置成“native”表示主鍵由數(shù)據(jù)庫自動(dòng)生成而不是在程序中指定。節(jié)點(diǎn) 節(jié)點(diǎn)下;用于映射實(shí)體對(duì)象的普通屬性。其name屬性對(duì)應(yīng)實(shí)體中的普通屬性,column屬性對(duì)應(yīng)數(shù)據(jù)庫表中的普通字段(非主鍵),type屬性表示其屬性的數(shù)據(jù)類型。1.3.4 創(chuàng)建映射文件映射文件的作用是告知Hibernate,持久化類Student映射到數(shù)據(jù)庫studentdb中的哪個(gè)表,并且進(jìn)一步精確地指定持久化類中的哪個(gè)屬性對(duì)應(yīng)數(shù)據(jù)庫表中的哪個(gè)字段。在持久化類Student所在包中,新建一個(gè)名稱為S

8、tudent.hbm.xml的映射文件,在該文件中指定了持久化類Student與數(shù)據(jù)庫中的哪個(gè)表對(duì)應(yīng),以及類Student中的每一個(gè)屬性與數(shù)據(jù)庫student表的字段一一對(duì)應(yīng)。Student.hbm.xml中的主要節(jié)點(diǎn)1.3 第一個(gè)Hibernate項(xiàng)目 1.3.5 創(chuàng)建核心配置文件Hibernate的配置文件主要用來配置數(shù)據(jù)庫連接以及Hibernate運(yùn)行時(shí)所需要的各個(gè)屬性的值。在項(xiàng)目的src目錄下創(chuàng)建一個(gè)名稱為hibernate.cfg.xml的文件,代碼如下。該文件將會(huì)在本章1.5節(jié)詳細(xì)介紹。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.5 創(chuàng)建核心配置文件1.3 第一個(gè)Hibernat

9、e項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作 在項(xiàng)目中新建一個(gè)名稱為com.seehope.test的包,然后創(chuàng)建Main.java文件。接下來,在該文件中創(chuàng)建4個(gè)方法分別進(jìn)行增刪改查操作。 添加數(shù)據(jù):在Main類中編寫添加數(shù)據(jù)的方法insertTest(),實(shí)現(xiàn)添加一個(gè)學(xué)生的功能1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作使用JUnit4測(cè)試運(yùn)行insertTest()后在MySQL數(shù)據(jù)庫中查詢student表的數(shù)據(jù)從圖1.8中可以看出,student表中添加數(shù)據(jù)成功。這里添加數(shù)據(jù)的

10、關(guān)鍵方法是session.save(stu),給人感覺保存的是Student對(duì)象stu,實(shí)際結(jié)果卻是數(shù)據(jù)庫中新添加了一條記錄,這正是hibernate的重要特性,通過操作對(duì)象就能實(shí)現(xiàn)數(shù)據(jù)庫操作。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作 修改數(shù)據(jù):在Main類中添加updateTest()方法,使用Hibernate來修改id為2的數(shù)據(jù)Hibernate修改數(shù)據(jù)的基本流程與其保存數(shù)據(jù)的方法大體相同,只是后面創(chuàng)建了一個(gè)對(duì)象,且該對(duì)象的id是要在數(shù)據(jù)庫表中事先存在的,其他屬性值則可以設(shè)置成與數(shù)據(jù)庫表中對(duì)應(yīng)的值不同。最后通過session.update()方法執(zhí)行更

11、新操作,表面上給人感覺是更新對(duì)象,實(shí)際上數(shù)據(jù)會(huì)更新到數(shù)據(jù)庫中。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作使用JUnit4測(cè)試運(yùn)行updateTest()方法,其結(jié)果如圖1.9所示。發(fā)現(xiàn)id為2的記錄已由李白改成了杜甫。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作 查詢單個(gè)對(duì)象數(shù)據(jù):在Main類中,添加一個(gè)名稱為getByIdTest()的查詢數(shù)據(jù)的方法,用于根據(jù)指定id查詢數(shù)據(jù)庫中的數(shù)據(jù),這里查詢id為1的學(xué)生數(shù)據(jù)。查詢操作使用了session.get()的方法,該方法有兩個(gè)參數(shù),第一個(gè)參數(shù)指定要操作的類,第二個(gè)參數(shù)id指明要查

12、找的對(duì)象的主鍵,該方法用于從數(shù)據(jù)庫中查找到指定主鍵的數(shù)據(jù)并封裝成對(duì)象數(shù)據(jù)。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作使用JUnit4測(cè)試運(yùn)行g(shù)etByIdTest()方法后,控制臺(tái)的顯示如圖所示。圖1.10查詢結(jié)果分析:控制臺(tái)頭部出現(xiàn)了三行紅色警告信息,這是因?yàn)闆]有配置log4j導(dǎo)致的,這里可以不必理會(huì),接著出現(xiàn)了黑色的SQL語句信息,這是由于在hibernate.cfg.xml文件中配置了顯示SQL語句和格式化SQL的配置信息,這說明Hibernate發(fā)出了SQL語句,向數(shù)據(jù)庫查詢需要的數(shù)據(jù)。最后出現(xiàn)的是查詢結(jié)果。除了使用Session的get()方法查找指

13、定對(duì)象id的數(shù)據(jù)外,還有Session的load()方法也可實(shí)現(xiàn)同樣的功能,區(qū)別在于使用get()方法加載數(shù)據(jù)時(shí),如果要查找的記錄不存在,則返回null,不會(huì)報(bào)錯(cuò)。使用load()方法加載數(shù)據(jù)時(shí),如果要查找的記錄不存在,則會(huì)報(bào)出ObjectNotfoundException異常。1.3 第一個(gè)Hibernate項(xiàng)目 1.3.6 創(chuàng)建測(cè)試類進(jìn)行增刪改查操作 刪除數(shù)據(jù):在Main類中增加一個(gè)名稱為deleteByIdTest()的方法,使用Hibernate刪除一條記錄,這里刪除id為5的學(xué)生數(shù)據(jù),代碼如下所示。從圖1.11中可以看出,Student表中少了第5條,已被成功刪除了。首先通過get方

14、法獲得要?jiǎng)h除的對(duì)象,然后使用Session的delete方法將該對(duì)象作為參數(shù),從而在數(shù)據(jù)庫中將它刪除。1.3 映射文件詳解 Hibernate映射文件用于配置將POJO對(duì)象持久化到關(guān)系型數(shù)據(jù)庫中的相關(guān)信息,一個(gè)持久化類對(duì)應(yīng)一個(gè)映射文件,映射文件的基本結(jié)構(gòu)如下所示。1.3 映射文件詳解 節(jié)點(diǎn)用來聲明一個(gè)持久化類并且指定了Java持久化類與數(shù)據(jù)庫表之間的映射關(guān)系主要節(jié)點(diǎn)說明節(jié)點(diǎn)用來設(shè)定持久化類的OID(Object Identifier對(duì)象標(biāo)識(shí)符,唯一地標(biāo)識(shí)一個(gè)對(duì)象,類似表的主鍵)和數(shù)據(jù)庫表的主鍵的映射關(guān)系??蛇x的子節(jié)點(diǎn):結(jié)點(diǎn)用于指定了主鍵的生成方式,也稱為主鍵生成策略。主鍵既可以通過程序指定,也

15、可由數(shù)據(jù)庫自動(dòng)生成,但數(shù)據(jù)庫自動(dòng)生成的話因不同數(shù)據(jù)庫還是有所差別,比如MySQL的主鍵可以通過自增長實(shí)現(xiàn),SQL Server通過標(biāo)識(shí)列實(shí)現(xiàn),而Oracle的要通過序列才能實(shí)現(xiàn)。通過節(jié)點(diǎn),就可以指定這些不同的實(shí)現(xiàn)方式。1.3 映射文件詳解 主要節(jié)點(diǎn)說明Hibernate提供了幾個(gè)內(nèi)置的主鍵生成策略,如表所示。節(jié)點(diǎn)用來指定持久化類的普通屬性與數(shù)據(jù)庫表中的普通字段的映射關(guān)系。property節(jié)點(diǎn)的常用屬性有name、column和type三個(gè)。name用來指定持久化類中的屬性名,column用來指定數(shù)據(jù)庫表中的對(duì)應(yīng)字段名,type用來指定持久化類屬性的數(shù)據(jù)類型。1.5 配置文件詳解 1.5.1 基

16、本配置hibernate.cfg.xml配置文件使用property節(jié)點(diǎn)來配置Hibernate連接數(shù)據(jù)庫的一些重要信息,如數(shù)據(jù)庫的方言、驅(qū)動(dòng)、URL、用戶名和密碼等,并使用mapping節(jié)點(diǎn)來加載映射文件的信息。文件名稱固定為hibernate.cfg.xml,一般放置在src目錄下。hibernate.cfg.xml配置文件的常見配置請(qǐng)參見1.3.5。其常用屬性名稱及用途如表所示。1.5 配置文件詳解 1.5.2 配置c3p0連接池Hibernate中也可以使用c3p0連接池進(jìn)行連接以提高數(shù)據(jù)庫連接的性能與效率。在下載的Hibernate解壓縮包的lib目錄下的子目錄optional中找到

17、C3P0的jar包c(diǎn)3p0-0.9.1.jar,復(fù)制到項(xiàng)目ssh01的WebContent/WEB-INF/lib下,并添加到構(gòu)建路徑,然后在hibernate.cfg.xml中新添加如下代碼使用Junit4運(yùn)行測(cè)試類Main中的insertTest()方法。查看數(shù)據(jù)庫,插入數(shù)據(jù)成功,表明C3P0連接池的配置成功。1.6 Hibernate持久化對(duì)象的狀態(tài) 1.6.1 持久化對(duì)象的狀態(tài)持久化就是指將Java運(yùn)行時(shí)的對(duì)象數(shù)據(jù)永久存儲(chǔ)到關(guān)系型數(shù)據(jù)庫中。在Hibernate中,根據(jù)內(nèi)存中的對(duì)象與數(shù)據(jù)庫表中對(duì)應(yīng)記錄是否同步關(guān)聯(lián),持久化對(duì)象分為三種狀態(tài),分別是瞬時(shí)狀態(tài)、持久狀態(tài)和游離狀態(tài)。瞬時(shí)狀態(tài)(tr

18、ansient)瞬時(shí)狀態(tài)是指內(nèi)存中的對(duì)象剛剛創(chuàng)建(new)出來,還沒有與Session關(guān)聯(lián),與數(shù)據(jù)庫中的數(shù)據(jù)無任何關(guān)聯(lián),在數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄,在內(nèi)存中孤立存在著,若無其他操作或引用,最后將會(huì)被JVM垃圾回收。瞬時(shí)對(duì)象沒有持久化標(biāo)識(shí)OID。持久狀態(tài)(persistent)持久狀態(tài)的對(duì)象與session相關(guān)聯(lián),且相關(guān)聯(lián)的Session尚未關(guān)閉,在數(shù)據(jù)庫有對(duì)應(yīng)的記錄,持久狀態(tài)對(duì)象有持久化標(biāo)識(shí)OID。游離狀態(tài)(detached)當(dāng)持久化對(duì)象相關(guān)聯(lián)的session關(guān)閉時(shí)就變成了游離狀態(tài)。雖然此時(shí)對(duì)象仍有OID,并且數(shù)據(jù)庫中有對(duì)應(yīng)的記錄,但該對(duì)象沒有與session相關(guān)聯(lián),Hibernate已檢測(cè)不到

19、它的變化。1.6 Hibernate持久化對(duì)象的狀態(tài) 1.6.2 持久化對(duì)象狀態(tài)轉(zhuǎn)換Hibernate持久化對(duì)象的三種狀態(tài),是可以通過Session的一系列方法進(jìn)行轉(zhuǎn)換的 瞬時(shí)狀態(tài)轉(zhuǎn)換到其他狀態(tài) 剛剛創(chuàng)建new出來是處于瞬時(shí)狀態(tài)。 瞬時(shí)狀態(tài)轉(zhuǎn)換為持久狀態(tài):執(zhí)行Session的save()或saveOrUpdate()方法。 瞬時(shí)狀態(tài)轉(zhuǎn)換為游離狀態(tài):為瞬時(shí)狀態(tài)對(duì)象設(shè)置持久化標(biāo)識(shí)OID。 瞬時(shí)狀態(tài)和游離狀態(tài)都沒有Session的關(guān)聯(lián),它們的區(qū)別在于瞬時(shí)狀態(tài)沒有OID,游離狀態(tài)對(duì)象存在OID,1.6 Hibernate持久化對(duì)象的狀態(tài) 持久狀態(tài)對(duì)象轉(zhuǎn)換到其他狀態(tài) 持久化對(duì)象可以通過Session的g

20、et()、load()方法,或者Query查詢從數(shù)據(jù)庫獲得。 持久狀態(tài)轉(zhuǎn)換為瞬時(shí)狀態(tài):執(zhí)行Session的delete()方法,持久化對(duì)象被刪除后,雖然在內(nèi)存中仍然存在,但不建議再使用,由JVM自行回收。 持久狀態(tài)轉(zhuǎn)換為游離狀態(tài):執(zhí)行Session的evict()、close()或clear()方法。evict()方法用于清除一級(jí)緩存中某一對(duì)象。close()方法用于關(guān)閉Session,清除一級(jí)緩存。clear()方法用于清楚一級(jí)緩存的所有對(duì)象。 游離狀態(tài)對(duì)象轉(zhuǎn)換到其他狀態(tài) 游離狀態(tài)對(duì)象不能直接獲得,只能由其他狀態(tài)對(duì)象轉(zhuǎn)換而來的。 游離狀態(tài)轉(zhuǎn)換為持久狀態(tài):執(zhí)行Session的update()、

21、saveOrUpdate()或lock()方法。 游離狀態(tài)轉(zhuǎn)換為瞬時(shí)狀態(tài):將游離狀態(tài)的的持久化標(biāo)識(shí)OID設(shè)置為null。例如,在 BookTest.java中的session.close()操作后,加入代碼book.setId(null),當(dāng)程序執(zhí)行完book.setId(null)代碼后,book對(duì)象由游離態(tài)轉(zhuǎn)換為瞬時(shí)狀態(tài)。1.6 Hibernate持久化對(duì)象的狀態(tài) 持久化對(duì)象的狀態(tài)實(shí)例 在ssh01項(xiàng)目的包c(diǎn)om.seehope.test下新建TestState測(cè)試類上述代碼中,stu對(duì)象由new關(guān)鍵字創(chuàng)建,此時(shí)還未與Session進(jìn)行關(guān)聯(lián),它的狀態(tài)為瞬時(shí)狀態(tài),在執(zhí)行了session.sa

22、ve(stu)操作后,stu對(duì)象被納入了Session的管理范圍,這時(shí)的stu對(duì)象變成了持久狀態(tài),程序執(zhí)行完了commit()操作并關(guān)閉了Session后,stu對(duì)象與Session的關(guān)聯(lián)被關(guān)閉,此時(shí)stu對(duì)象就變成了游離狀態(tài)。最后游離狀態(tài)清除了OID,又變成了瞬時(shí)狀態(tài)。1.6 Hibernate持久化對(duì)象的狀態(tài) 持久化對(duì)象的狀態(tài)實(shí)例 使用JUnit4測(cè)試運(yùn)行,結(jié)果如下圖所示。從圖1.13可以看出執(zhí)行save()方法之前id值為null,這時(shí)它是屬于瞬時(shí)狀態(tài),執(zhí)行save()方法之后stu對(duì)象的id屬性有了值13(持久化標(biāo)識(shí)OID),表明stu對(duì)象變成了持久狀態(tài),這也證明了瞬時(shí)狀態(tài)對(duì)象和持久狀

23、態(tài)對(duì)象的區(qū)別是:持久狀態(tài)對(duì)象OID有值并且與Session進(jìn)行了關(guān)聯(lián)。當(dāng)程序繼續(xù)向下執(zhí)行至session.close()時(shí),stu對(duì)象脫離了session的管理,此時(shí)stu對(duì)象變成了游離狀態(tài),但stu對(duì)象的OID值依然存在,這也證明了游離狀態(tài)對(duì)象與持久狀態(tài)對(duì)象的相同點(diǎn)是都有OID值,不同點(diǎn)就是游離狀態(tài)對(duì)象沒有了Session關(guān)聯(lián)。1.7 Hibernate的核心接口簡介 在Hibernate中有Configuration、SessionFactory、Session、Transaction、Query、Critreia 共6個(gè)常用的核心接口。1.7.1 Configuration接口 Conf

24、iguration是最先用到的一個(gè)接口,使用Hibernate時(shí),首先要?jiǎng)?chuàng)建Configuration實(shí)例才能開啟其他一系列操作。 Configuration實(shí)例主要用于啟動(dòng)、加載和管理hibernate的配置文件。 Hibernate啟動(dòng)時(shí),Configuration實(shí)例會(huì)查找Hibernate配置文件hibernate.cfg.xml,讀取其相關(guān)配置,然后創(chuàng)建一個(gè)唯一的SessionFactory實(shí)例,創(chuàng)建完SessionFactory后,Configuration實(shí)例生命周期就此結(jié)束。Hibernate創(chuàng)建Configuration實(shí)例使用右述代碼這種方法默認(rèn)會(huì)去src下讀取hibern

25、ate.cfg.xml配置文件。如果配置文件不是放在src下也是可以的,但需要指定其實(shí)際位置。1.7 Hibernate的核心接口簡介 1.7.2 SessionFactory接口 SessionFactory實(shí)例通過Configuration實(shí)例獲取,用于Hibernate的初始化和建立Session對(duì)象,其獲取過程如下代碼所示。 由于SessionFactory是線程安全的,它的同一個(gè)實(shí)例能同時(shí)給多個(gè)線程共享,并且它是重量級(jí)的不能隨便創(chuàng)建和銷毀它的實(shí)例,所以一個(gè)項(xiàng)目中一般只需要一個(gè)SessionFactory實(shí)例就行了(除非一個(gè)項(xiàng)目有多個(gè)數(shù)據(jù)源才需要?jiǎng)?chuàng)建多個(gè)SessionFactory實(shí)例

26、)。通常會(huì)抽取一個(gè)命名為HibernateUtils的工具類,在該工具類中創(chuàng)建一個(gè)靜態(tài)的SessionFactory對(duì)象,供各個(gè)方法調(diào)用,這樣各個(gè)方法就能共用同一個(gè)SessionFactory實(shí)例,HibernateUtils工具類中還提供創(chuàng)建Session實(shí)例的方法。該工具類的具體使用參見1.7.3節(jié)。1.7 Hibernate的核心接口簡介 1.7.3 Session接口 Session接口是Hibernate向應(yīng)用程序提供的操作數(shù)據(jù)庫的接口,它提供了基本的保存,更新,刪除和查詢的方法。Session實(shí)例由SessionFactory實(shí)例的openSession()方法或getCurren

27、tSession方法獲得。區(qū)別是前者實(shí)例要手動(dòng)關(guān)閉,后者實(shí)例在提交或回滾時(shí)自動(dòng)關(guān)閉。 Session有以下特點(diǎn): 它不是線程安全的,因此在軟件設(shè)計(jì)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例。 Session實(shí)例是輕量級(jí)的,它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建和銷毀Session對(duì)象,例如可以為每個(gè)方法單獨(dú)分配一個(gè)Session實(shí)例。 Session還有一個(gè)緩存,稱為Hibernate的一級(jí)緩存,它存放被當(dāng)前工作單元加載的對(duì)象。每個(gè)Session實(shí)例都有自己的緩存,這個(gè)Sesion實(shí)例的緩存只能被當(dāng)前工作單元訪問。 Session主要提供下面幾種方法。 save

28、(): 添加對(duì)象,將瞬時(shí)狀態(tài)的對(duì)象數(shù)據(jù)存入數(shù)據(jù)庫并變?yōu)槌志脿顟B(tài)。它使用映射文件指定的主鍵生成器為持久化對(duì)象分配唯一的OID。 update():修改對(duì)象,將游離狀態(tài)的對(duì)象轉(zhuǎn)變?yōu)槌志脿顟B(tài)。1.7 Hibernate的核心接口簡介 Session主要提供下面幾種方法。 saveOrUpdate():同時(shí)包含了save()與update()方法的功能,如果傳入的參數(shù)是瞬時(shí)狀態(tài)對(duì)象,調(diào)用save方法,如果參入?yún)?shù)是游離狀態(tài)對(duì)象,調(diào)用update()方法,如果傳入的是持久化對(duì)象,直接返回。 load()/get(): 兩者都是根據(jù)給定的OID從數(shù)據(jù)庫中加載一個(gè)持久化對(duì)象,區(qū)別在于,當(dāng)數(shù)據(jù)庫中不存在與OI

29、D對(duì)應(yīng)的記錄時(shí),load()方法會(huì)拋出ObjectNotFoundException異常,而get()方法返回null. delete():用于從數(shù)據(jù)庫刪除一個(gè)Java對(duì)象,該方法傳入的參數(shù)既可以是持久狀態(tài)對(duì)象,也可以是游離狀態(tài)的對(duì)象。如果傳入的參數(shù)是游離狀態(tài)的對(duì)象,則會(huì)先使游離對(duì)象被當(dāng)前Session關(guān)聯(lián),轉(zhuǎn)化為持久狀態(tài)對(duì)象,如果傳入的參數(shù)是持久狀態(tài)對(duì)象則沒有這一步。然后執(zhí)行SQL的delete語句,在數(shù)據(jù)庫中刪除該對(duì)象對(duì)應(yīng)的記錄,最后將該對(duì)象從Session的緩存中刪除掉。 evict():從緩存中清除參數(shù)指定的持久狀態(tài)對(duì)象。 clear():清空緩存中所有持久化對(duì)象。1.7 Hibern

30、ate的核心接口簡介 使用下述案例中的HibernateUtils工具類可以完美地實(shí)現(xiàn)SessionFactory實(shí)例被多個(gè)方法(增刪改查操作各一個(gè)方法)共享,以及session實(shí)例則由各個(gè)方法獨(dú)立創(chuàng)建。并且大大簡化代碼量。項(xiàng)目案例:使用工具類簡化第一個(gè)項(xiàng)目(源碼請(qǐng)見本書配套資源:第1章/ssh01)。(1) src目錄新建包c(diǎn)om.seehope.util,包下新建類HibernateUtils.java,參考代碼如下所示。有了上述HibernateUtils工具類,其他類就可以直接通過HibernateUtils.getSession()的方法獲取Session對(duì)象,從而簡化操作。1.7

31、Hibernate的核心接口簡介 (2)下面對(duì)Main類中的4個(gè)方法進(jìn)行簡化。在包c(diǎn)om.seehope.test下新建測(cè)試類Main2,簡化原來Main類的4個(gè)方法如下。1.7 Hibernate的核心接口簡介 1.7.4 Transaction接口 Transaction接口是Hibernate的數(shù)據(jù)庫事務(wù)接口,它對(duì)底層事務(wù)接口進(jìn)行了封裝,底層事務(wù)接口包括:JDBC API、JTA(Java Transaction API)、CORBA(Common Object Requet Broker Architecture)APIHibernate應(yīng)用可通過一致的Transaction接口來聲明

32、事務(wù)邊界,雖然應(yīng)用也可以繞過Transaction接口,直接訪問底層的事務(wù)接口,但這種方法不值得推薦,因?yàn)樗焕趹?yīng)用在不同的環(huán)境移植。使用hibernate進(jìn)行增刪改操作時(shí),必須顯式的調(diào)用Transaction。 Transaction接口的事務(wù)對(duì)象通過Session對(duì)象開啟,其開啟方式如下面代碼所示。 在Transaction接口常用事務(wù)管理方法如下。commit()方法:提交事務(wù)。rollback()方法:撤銷事務(wù)操作。wasCommitted()方法:事務(wù)是否提交。Session進(jìn)行數(shù)據(jù)庫的增刪改操作后,還要使用Transaction接口的commit()方法進(jìn)行事務(wù)提交才能真正地將對(duì)

33、象數(shù)據(jù)同步到數(shù)據(jù)庫中。如果事務(wù)執(zhí)行過程中發(fā)生異常,就需要使用rollback()方法進(jìn)行事務(wù)回滾,以避免數(shù)據(jù)不一致。1.8上機(jī)練習(xí) 題目:在MySQL數(shù)據(jù)中創(chuàng)建productdb數(shù)據(jù)庫,創(chuàng)建如表1.6所示的商品數(shù)據(jù)表goods,請(qǐng)?jiān)趀clipse中創(chuàng)建一個(gè)hibernate項(xiàng)目。注意要使用工具類HibernateUtils。1.查詢出id為4的商品。2.添加一個(gè)新的商品。3.修改一條數(shù)據(jù)。4.刪除一條數(shù)據(jù)。第二章 HQL與Criteria查詢 掌握HQL查詢基本語法 學(xué)會(huì)在HQL中使用參數(shù)熟練掌握HQL的各種復(fù)雜查詢 了解criteria查詢40本章指引2.1 HQL查詢概述2.2 Crite

34、ria查詢2.3 上機(jī)實(shí)驗(yàn)412.1 HQL 查詢概述42Hibernate查詢語言(Hibernate Query Language)簡稱HQL,是一種面向?qū)ο蟮牟樵冋Z句,形式上跟SQL很相似,但注意它查詢不是數(shù)據(jù)庫表,而是類(對(duì)象),查詢的結(jié)果通常是對(duì)象或?qū)ο蟮募希鴤鹘y(tǒng)的SQL查詢結(jié)果則是結(jié)構(gòu)化的關(guān)系模型。2.1.1 HQL基本語法1.from子句用于查詢指定的對(duì)象集合。如:指的是查詢所有學(xué)生對(duì)象,也可用右述形式能更好地理解:上述對(duì)象用了全路徑類名,能一眼看出這是個(gè)類,而不會(huì)誤認(rèn)為是數(shù)據(jù)庫表,注意HQL語句本身不區(qū)分大小寫,但相關(guān)的java包,類,屬性要區(qū)分大小寫。from Stude

35、nt這個(gè)查詢語句中student省略了包名是允許的,但Student寫成student就不行。2.Select子句通常用來選取查詢目標(biāo)對(duì)象的部分屬性,如:表示查詢學(xué)生對(duì)象的姓名,年齡兩個(gè)屬性的值2.1 HQL 查詢概述433.where子句用于限定查詢條件,跟SQL類似,但where子句中用到的是對(duì)象的屬性而不是列名,注意區(qū)別,雖然很多時(shí)候?qū)傩悦忻?,如?.order by子句用于排序,升序用asc,降序用desc,默認(rèn)升序,其用法與SQL一樣。5.使用表達(dá)式表達(dá)式相當(dāng)于SQL中的各種函數(shù)。一般在where子句中使用表達(dá)式,例如查詢學(xué)生的姓名的大寫字母是TOM的學(xué)生:查詢出生年份是20

36、01年的學(xué)生:2.1 HQL 查詢概述442.1.2 HQL語句的執(zhí)行HQL語句的執(zhí)行流程是:首先構(gòu)建HQL語句,然后創(chuàng)建Query對(duì)象,最后使用Query對(duì)象的list()方法、iterate()方法,或者uniqueResult()方法執(zhí)行查詢,獲取執(zhí)行結(jié)果(返回值)。1.使用Query對(duì)象的list()方法執(zhí)行查詢并返回值項(xiàng)目案例:查詢所有學(xué)生的信息并將查詢結(jié)果輸出到控制臺(tái)。(源碼請(qǐng)見本書配套資源:第2章/ssh02)(1)將上一章的項(xiàng)目復(fù)制為ssh02,創(chuàng)建測(cè)試類HQLTest,添加下面的方法:(2)運(yùn)行結(jié)果如右 可見list方法可以執(zhí)行HQL語句并且返回List泛型集合。2.1 HQ

37、L 查詢概述453使用uniqueResult()方法執(zhí)行查詢返回唯一的一個(gè)對(duì)象項(xiàng)目案例:查詢姓名為李白的學(xué)生。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest類中添加以下方法。測(cè)試運(yùn)行,控制臺(tái)只顯示一個(gè)學(xué)生的信息。注意這種情況下只能使用返回單個(gè)對(duì)象的HQL語句,否則會(huì)報(bào)錯(cuò)。2使用Query對(duì)象的iterator()方法執(zhí)行HQL語句項(xiàng)目案例:查詢所有學(xué)生。(源碼請(qǐng)參見本書配套資源:第2章/hibernate02)在HQLTest類中添加一個(gè)方法。2.1 HQL 查詢概述463使用uniqueResult()方法執(zhí)行查詢返回唯一的一個(gè)對(duì)象項(xiàng)目案例:查詢姓名為李白的學(xué)生。(源碼請(qǐng)見本

38、書配套資源:第2章/ssh02)在HQLTest類中添加以下方法。測(cè)試運(yùn)行,控制臺(tái)只顯示一個(gè)學(xué)生的信息。注意這種情況下只能使用返回單個(gè)對(duì)象的HQL語句,否則會(huì)報(bào)錯(cuò)。2使用Query對(duì)象的iterator()方法執(zhí)行HQL語句項(xiàng)目案例:查詢所有學(xué)生。(源碼請(qǐng)參見本書配套資源:第2章/hibernate02)在HQLTest類中添加一個(gè)方法。2.1 HQL 查詢概述472.1.3 HQL查詢條件中使用參數(shù)1使用占位符“?”綁定參數(shù)HQL查詢條件往往需要用到外部傳入的值進(jìn)行查詢,可用參數(shù)的形式接收這些外部傳入的值。在HQL語句中可以使用一個(gè)或多個(gè)“?”占位符的方式來綁定參數(shù)。“?”占位符表示此處對(duì)應(yīng)

39、為一個(gè)輸入?yún)?shù),然后在執(zhí)行HQL語句之前要給這些參數(shù)賦值,使用Query對(duì)象的setXxx(參數(shù)索引,參數(shù)值)方法進(jìn)行賦值,其中XXX表示參數(shù)的數(shù)據(jù)類型,與屬性的java類型一致,常見的setXxx()方法如表2.1所示。setXxx(參數(shù)索引,參數(shù)值)方法里面的第一個(gè)參數(shù)表示HQL語句中的第幾個(gè)“?”占位符,從0算起,第二個(gè)參數(shù)表示給該“?”占位符賦值。2.1 HQL 查詢概述48項(xiàng)目案例:查詢年齡為XX歲性別為XX的學(xué)生。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest類中添加以下方法:上述代碼中,query.setInteger(0, 18);表示給第一個(gè)“?”占位符賦值18

40、,值的類型的是整型,query.setString(1, 男);的意思是給第二個(gè)“?”占位符賦值“男”,這樣原始的HQL語句from Student where age=? and gender=?,將會(huì)被構(gòu)建成from Student where age=18 and gender=男這樣的包含實(shí)際值的HQL語句再來執(zhí)行。2.1 HQL 查詢概述492.使用參數(shù)名稱進(jìn)行綁定使用多個(gè)“?”占位符有個(gè)不方便的地方就是分別賦值時(shí)要想一想算一算是第幾個(gè)占位符,不小心就會(huì)弄錯(cuò)。改用參數(shù)名稱綁定進(jìn)行賦值就不會(huì)有這個(gè)問題。HQL語句中參數(shù)名稱前用“:”號(hào)來標(biāo)明。賦值時(shí)使用setXxx(參數(shù)名稱,參數(shù)值)方

41、法。參數(shù)名稱的使用規(guī)則:在HQL語句中用“: ”號(hào)加參數(shù)名稱一一代替之前的“?”占位符。項(xiàng)目案例:查詢年齡為XX歲的性別為XX的學(xué)生,使用參數(shù)名稱綁定實(shí)現(xiàn)。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest類中添加以下方法。這里的HQL語句中分別用“ :age”和“ :gender”代替之前的“?”占位符。setXxx賦值時(shí)用參數(shù)名稱代替之前的索引數(shù)字。結(jié)果同上。2.1 HQL 查詢概述502.1.4 HQL給參數(shù)賦值的其他方法1.使用setParameter()方法給參數(shù)賦值給HQL中的各個(gè)參數(shù)賦值時(shí),需要一一判斷各個(gè)參數(shù)對(duì)應(yīng)的數(shù)據(jù)類型,從而調(diào)用相應(yīng)的setXxx方法進(jìn)行賦值,比較

42、麻煩一點(diǎn),而setParameter()方法則是通用型的,參數(shù)為任意數(shù)據(jù)類型均可使用,解決了選用哪個(gè)setXxx的煩惱。語法如下:setParameter(第幾個(gè)占位符或參數(shù)名稱,參數(shù)的值)項(xiàng)目案例:查詢年齡為XX性別為XX的學(xué)生。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest類中添加以下方法。上面代碼使用了setParameter()代替了setXxx,既適用于“?”占位符的情況(見上述findStudents3()代碼),也適用于使用參數(shù)名稱的情況。測(cè)試運(yùn)行輸出結(jié)果同前。2.1 HQL 查詢概述512使用setProperties()方法獲取對(duì)象的屬性值給HQL中的命名參數(shù)賦

43、值該方法需要先實(shí)例化一個(gè)對(duì)象,并且給對(duì)象中的全部或部分屬性賦值,然后調(diào)用Query的setProperties(實(shí)例化對(duì)象)方法,該方法會(huì)自動(dòng)提取實(shí)例化對(duì)象的各個(gè)屬性值賦給HQL中同名的對(duì)應(yīng)命名參數(shù)。注意HQL中的命名參數(shù)的名稱要與對(duì)象屬性名稱一致。項(xiàng)目案例:查詢年齡為XX性別為XX的學(xué)生。在HQLTest類中添加以下方法(源碼請(qǐng)見本書配套資源:第2章/ssh02)。上述代碼中,HQL語句中的兩個(gè)命名參數(shù),通過setProperties方法,分別由封裝好的Student對(duì)象的對(duì)應(yīng)名稱的屬性進(jìn)行了賦值。2.1 HQL 查詢概述522.1.5 HQL模糊查詢與動(dòng)態(tài)查詢動(dòng)態(tài)查詢適用于查詢條件的個(gè)數(shù)不

44、確定的情況,比如大家上網(wǎng)購物,每個(gè)人搜索商品的搜索條件數(shù)量都不相同。使用上面學(xué)習(xí)的setProperties()方法使得動(dòng)態(tài)查詢變得容易。首先實(shí)例化一個(gè)持久化類的對(duì)象,根據(jù)用戶輸入的條件數(shù)量給持久化類對(duì)象動(dòng)態(tài)賦值(用戶輸入多少個(gè)條件就給持久化類的多少個(gè)屬性賦值),同時(shí)動(dòng)態(tài)構(gòu)建HQL語句,用戶每輸入一個(gè)條件就增加一句HQL 命名參數(shù)查詢條件。最后用setProperties()給參數(shù)賦值并執(zhí)行即可。項(xiàng)目案例:搜索學(xué)生的條件不確定,進(jìn)行動(dòng)態(tài)查詢。(源碼請(qǐng)見本書配套資源:第2章/ssh02)運(yùn)行后,可以測(cè)試多種不同查詢條件的情況。上面查詢學(xué)生姓名時(shí)用到了模糊查詢,注意模糊查詢不要直接在HQL語句中使

45、用%符號(hào),而是在setXXX方法中使用%號(hào)。動(dòng)態(tài)查詢通過動(dòng)態(tài)構(gòu)建HQL語句同時(shí)動(dòng)態(tài)給對(duì)象賦值,并恰當(dāng)?shù)乩昧藄etProperies這個(gè)方法。2.1 HQL 查詢概述532.1.6 HQL投影查詢有時(shí)候并不需要查詢一個(gè)對(duì)象的所有信息(屬性),不需要返回完整的對(duì)象。只想查詢一部分信息(屬性),這時(shí)可用到HQL投影查詢。這時(shí)要用到上面提過的select子句。投影查詢執(zhí)行后的返回結(jié)果有三種情況。1.只查詢單個(gè)屬性查詢結(jié)果封裝為泛型集合項(xiàng)目案例:查詢所有學(xué)生的姓名。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest中添加方法findStudents7()方法如下。測(cè)試運(yùn)行,可發(fā)現(xiàn)所有學(xué)生姓名

46、都查出來了。這里只查詢studentName屬性,由于它是String 類型,所有返回值采用List類型,類似地如果只查詢age屬性,則返回結(jié)果采用List類型。2.1 HQL 查詢概述542查詢多個(gè)屬性的情況這時(shí)返回結(jié)果要用List類型來接收。項(xiàng)目案例:查詢所有學(xué)生的姓名與年齡。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在HQLTest中添加方法findStudents8()方法如下:2.1 HQL 查詢概述553將部分屬性封裝成對(duì)象首先要在類中添加一個(gè)構(gòu)造方法,比如我要查詢學(xué)生姓名和年齡,就在Student類中新增一個(gè)帶studenName和Age兩個(gè)參數(shù)的構(gòu)造方法,然后再按下述案例所示

47、的形式構(gòu)造HQL語句。項(xiàng)目案例:查詢所有學(xué)生的姓名與年齡。(源碼請(qǐng)見本書配套資源:第2章/ssh02)(1)持久化類Student中添加一個(gè)構(gòu)造方法(2)HQLTest類中添加方法findStudents9()2.1 HQL 查詢概述562.1.7 HQL分頁查詢分頁查詢主要用到了Query對(duì)象的setFirstResult方法和setMaxResult方法,它們的作用如下。setFirstResult:設(shè)置需要返回的第一條記錄的起始下標(biāo),下標(biāo)從0算起,有點(diǎn)類似MySQL中l(wèi)imit后的第一個(gè)參數(shù)。setMaxResult:設(shè)置最大返回結(jié)果條數(shù)。有點(diǎn)類似MySQL中l(wèi)imit后的第二個(gè)參數(shù)。這

48、兩個(gè)方法要用在Query對(duì)象的list()方法之前。分頁查詢一般還需要確定兩個(gè)變量,一個(gè)是想查詢第幾頁,這里(本項(xiàng)目)暫用變量名pageNo來表示,另一個(gè)變量就是確定一頁顯示幾條記錄,這里暫用變量名pageSize來表示。確定好變量后用表達(dá)式(pageNo-1)*pageSize作為setFirstResult()方法的參數(shù),用pageSize作為setMaxResult()方法的參數(shù)。下面示例對(duì)學(xué)生信息進(jìn)行分頁查詢。2.1 HQL 查詢概述572.1.8 HQL聚合函數(shù)在HQL語句中可以運(yùn)用聚合函數(shù),與SQL一致。聚合函數(shù)有count(),sum(),avg(),max(),min()五種。

49、注意由于只返回單個(gè)數(shù)據(jù),所以用Query的uniqueResult()方法來執(zhí)行HQL語句,另外整型返回結(jié)果必須是Long類型。下面示例查詢學(xué)生的人數(shù),在HQLTest類中添加方法findStudents11(),代碼如下。(源碼請(qǐng)見本書配套資源:第2章/ssh02)2.1 HQL 查詢概述582.1.9 HQL分組查詢HQL使用group by子句進(jìn)行分組查詢,與SQL一致。下面示例查詢男女生的人數(shù)。在HQLTest類中添加方法findStudents12(),代碼如下。(源碼請(qǐng)見本書配套資源:第2章/ssh02)運(yùn)行測(cè)試結(jié)果如下:2.1 HQL 查詢概述592.1.10 使用別名HQL語句

50、中也可以使用別名,跟SQL一樣,HQL中也是使用關(guān)鍵字as指定別名, as關(guān)鍵字也可以省略。在HQLTest類中創(chuàng)建一個(gè)名為aliasTest()的方法,該方法使用HQL別名的方式查詢數(shù)據(jù),如下所示。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在上述代碼中,s是Student類的別名,在where條件后,使用其別名查詢studentName=”李白”的對(duì)象。本章指引2.1 HQL查詢概述2.2 Criteria查詢2.3 上機(jī)實(shí)驗(yàn)602.2 Criteria查詢61Criteria接口是一個(gè)面向?qū)ο蟮模蓴U(kuò)展的條件查詢HibernateAPI,它跟HQL查詢的不同之處在于它不需要考慮數(shù)據(jù)庫底層

51、實(shí)現(xiàn),以及HQL語句如何編寫就能輕松實(shí)現(xiàn)各種查詢。Criteria實(shí)例化對(duì)象通過下列代碼實(shí)現(xiàn)??梢?,Criteria對(duì)象仍然是由session創(chuàng)建的。2.2.1 Criteria簡單查詢創(chuàng)建好Criteria對(duì)象后,再利用Criterion對(duì)象設(shè)定查詢條件,然后使用Criteria對(duì)象的add方法添加查詢條件,最后使用list()方法或uniqueResult()執(zhí)行查詢即可實(shí)現(xiàn)簡單查詢。設(shè)定Criterion查詢條件的和添加查詢條件如下代碼所示。上面提到的Criterion是Hibernate的一個(gè)面向?qū)ο蟛樵儣l件接口,Criterion對(duì)象的通過Restrictions類來創(chuàng)建。在Rest

52、rictions類中提供了大量的靜態(tài)方法來創(chuàng)建查詢條件,其常用的方法如表2.2所示。2.2 Criteria查詢622.2 Criteria查詢63項(xiàng)目案例:使用Criteria查詢姓名為李白的學(xué)生。(源碼請(qǐng)見本書配套資源:第2章/ssh02)在項(xiàng)目ssh02的com.seehope.test包中新建一個(gè)名稱為CriteriaTest的類,在類中添加一個(gè)CriteriaTest1()方法,代碼如下所示。使用JUnit4測(cè)試運(yùn)行,控制臺(tái)的顯示結(jié)果如圖2.1所示。2.2 Criteria查詢642.2.2 Criteria多條件查詢結(jié)合表2.2及下面案例學(xué)習(xí)多條件查詢。項(xiàng)目案例:查詢id=2或者s

53、tudentName=李白的學(xué)生。在類Criteriatest中建立一個(gè)名稱為criteriaTest2 ()的方法,如下所示。(源碼請(qǐng)見本書配套資源:第2章/ssh02)2.2 Criteria查詢652.2.2 Criteria多條件查詢結(jié)合表2.2及下面案例學(xué)習(xí)多條件查詢。項(xiàng)目案例:查詢id=2或者studentName=李白的學(xué)生。在類Criteriatest中建立一個(gè)名稱為criteriaTest2 ()的方法,如下所示。(源碼請(qǐng)見本書配套資源:第2章/ssh02)上述代碼Restrictions.or方法就相當(dāng)于SQL中的or關(guān)系,Restrictions.eq方法就相當(dāng)于SQL中

54、的等于。測(cè)試運(yùn)行,控制臺(tái)的輸出結(jié)果如圖2.2所示。2.2 Criteria查詢662.2.3 Criteria分頁查詢Criteria同樣可以實(shí)現(xiàn)分頁查詢,它通過Citeria對(duì)象的setFirstResult(int firstResult)和setMaxResult(intmaxResult)這兩個(gè)方法共同來實(shí)現(xiàn)。其中setFirstResult(int firstResult)方法用于指定從哪個(gè)對(duì)象開始檢索,序號(hào)從0算起,setMaxResult(int maxResult)方法用于指定一次最多檢索的對(duì)象數(shù),即每頁顯示幾條記錄。在測(cè)試類CriteriaTest中編寫criteriaTes

55、t3()方法,代碼如下所示。(源碼請(qǐng)見本書配套資源:第2章/ssh02)上述查詢的是第1頁,每頁顯示3條,假定頁碼用pageno變量,每頁大小用pageSize變量,則通用查詢代碼是:2.2 Criteria查詢67使用JUnit4測(cè)試運(yùn)行criteriaTest3()方法后,控制臺(tái)的輸出結(jié)果如圖2.3所示。上機(jī)練習(xí)題目:在上一章的商品數(shù)據(jù)庫基礎(chǔ)上實(shí)現(xiàn):1.查詢所有商品信息。2.查詢商品名稱包含“電”字的商品信息。3.查詢所有商品的名稱與價(jià)格。4.查詢商品的總數(shù)量。思考題1條件查詢中給參數(shù)賦值的方法有哪些?2說說HQL查詢與Criteria查詢的區(qū)別。2.3上機(jī)練習(xí) 題目:在上一章的商品數(shù)據(jù)庫

56、基礎(chǔ)上實(shí)現(xiàn):1.查詢所有商品信息。2.查詢商品名稱包含“電”字的商品信息。3.查詢所有商品的名稱與價(jià)格。4.查詢商品的總數(shù)量。第3章 Hibernate關(guān)聯(lián)映射掌握單向關(guān)聯(lián)與雙向關(guān)聯(lián)的概念掌握一對(duì)多關(guān)聯(lián)關(guān)系的使用掌握多對(duì)多關(guān)聯(lián)關(guān)系的使用掌握關(guān)聯(lián)關(guān)系中的反轉(zhuǎn)和級(jí)聯(lián)掌握延遲加載69本章指引3.1 實(shí)體對(duì)象的三種關(guān)聯(lián)關(guān)系3.2 關(guān)聯(lián)關(guān)系中的反轉(zhuǎn)與級(jí)聯(lián)3.3 延遲加載3.4 上機(jī)實(shí)驗(yàn)703.1 實(shí)體對(duì)象的三種關(guān)聯(lián)關(guān)系數(shù)據(jù)庫中表與表之間的關(guān)系有下列三種,數(shù)據(jù)庫表之間的關(guān)系是通過外鍵來實(shí)現(xiàn)的: 一對(duì)多:班級(jí)與學(xué)生,一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生。需要在多方,添加一方的主鍵作為外鍵。 多對(duì)多:例如教師與學(xué)生的關(guān)系,一

57、個(gè)教師可教多個(gè)學(xué)生,一個(gè)學(xué)生可被多個(gè)教師教。需要一張中間表,添加兩張表的主鍵作外鍵。 一對(duì)一:比如人與身份證的關(guān)系,一個(gè)人對(duì)應(yīng)一個(gè)身份證。在其中一方添加另一方的主鍵作外鍵。Hibernate中數(shù)據(jù)庫對(duì)應(yīng)的實(shí)體對(duì)象之間同樣有上述三種類型的關(guān)聯(lián)關(guān)系,設(shè)計(jì)持久化類時(shí),需要在類中進(jìn)行特別設(shè)置以體現(xiàn)它們之間的關(guān)聯(lián)關(guān)系,具體規(guī)則如下: 一對(duì)一:在其中一個(gè)類中定義對(duì)方類型的對(duì)象,如A類中定義B類類型的屬性b,B類中定義A類類型的屬性a。 一對(duì)多:假如是一個(gè)A類是一方,B類是多方,需要在A類以Set集合的方式引入B類型的對(duì)象,同時(shí)在B類中定義A類類型的屬性a。 多對(duì)多:在A類中定義B類類型的Set集合,在B類

58、中定義A類類型的Set集合,使用Set集合的是為了避免數(shù)據(jù)的重復(fù)(如果采用List集合則有可能有重復(fù))。實(shí)體對(duì)象之間的三種關(guān)聯(lián)關(guān)系,除了在類中進(jìn)行上述設(shè)置外,還要在映射文件中配置,具體看下面案例。注:一對(duì)一關(guān)聯(lián)關(guān)系的操作同一對(duì)多關(guān)聯(lián)關(guān)系,在此不單獨(dú)介紹。713.1 實(shí)體對(duì)象的三種關(guān)聯(lián)關(guān)系數(shù)據(jù)庫中表與表之間的關(guān)系有下列三種,數(shù)據(jù)庫表之間的關(guān)系是通過外鍵來實(shí)現(xiàn)的: 一對(duì)多:班級(jí)與學(xué)生,一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生。需要在多方,添加一方的主鍵作為外鍵。 多對(duì)多:例如教師與學(xué)生的關(guān)系,一個(gè)教師可教多個(gè)學(xué)生,一個(gè)學(xué)生可被多個(gè)教師教。需要一張中間表,添加兩張表的主鍵作外鍵。 一對(duì)一:比如人與身份證的關(guān)系,一個(gè)人對(duì)

59、應(yīng)一個(gè)身份證。在其中一方添加另一方的主鍵作外鍵。Hibernate中數(shù)據(jù)庫對(duì)應(yīng)的實(shí)體對(duì)象之間同樣有上述三種類型的關(guān)聯(lián)關(guān)系,設(shè)計(jì)持久化類時(shí),需要在類中進(jìn)行特別設(shè)置以體現(xiàn)它們之間的關(guān)聯(lián)關(guān)系,具體規(guī)則如下: 一對(duì)一:在其中一個(gè)類中定義對(duì)方類型的對(duì)象,如A類中定義B類類型的屬性b,B類中定義A類類型的屬性a。 一對(duì)多:假如是一個(gè)A類是一方,B類是多方,需要在A類以Set集合的方式引入B類型的對(duì)象,同時(shí)在B類中定義A類類型的屬性a。 多對(duì)多:在A類中定義B類類型的Set集合,在B類中定義A類類型的Set集合,使用Set集合的是為了避免數(shù)據(jù)的重復(fù)(如果采用List集合則有可能有重復(fù))。實(shí)體對(duì)象之間的三種關(guān)

60、聯(lián)關(guān)系,除了在類中進(jìn)行上述設(shè)置外,還要在映射文件中配置,具體看下面案例。注:一對(duì)一關(guān)聯(lián)關(guān)系的操作同一對(duì)多關(guān)聯(lián)關(guān)系,在此不單獨(dú)介紹。723.1 實(shí)體對(duì)象的三種關(guān)聯(lián)關(guān)系3.1.1 單向關(guān)聯(lián)與雙向關(guān)聯(lián)以一對(duì)多為例,一個(gè)班級(jí)對(duì)應(yīng)多個(gè)學(xué)生,這是典型的一對(duì)多關(guān)系,假設(shè)班級(jí)Classes類是“一方”,學(xué)生Student類是“多方”,如果“一方”Classes類中定義了“多方”Student類型的Set集合屬性,并且“多方”Student類中也定義了“一方”Classes類型的屬性,這就是雙向關(guān)聯(lián)。如果Classes類中定義了Student類型的Set集合屬性,但Student類中卻沒有定義了Classes類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論