版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Hibernate,倉(cāng) J建Configuration 類(lèi)的實(shí)例首先定位映射文檔位置、讀取配置,然后倉(cāng)建SessionFactory對(duì)象語(yǔ)言和操作數(shù)據(jù)庫(kù)不匹配:模型不匹配(阻抗不匹配) .可以使用JDBC手動(dòng)轉(zhuǎn)換;sql參數(shù)和jdbc中用對(duì)象賦值 .使用 ORM(Object Relation Mapping對(duì)象關(guān)系映射)框架:hibernate二. Hibernate 安裝配置 .配置文件 Hibernate.cfg.xml 禾口 Hperties.映射文件xxx.hbm.xml:對(duì)象模型和關(guān)系模型的映射 三.開(kāi)發(fā)流程1. 由 Domain Object ->
2、mapping -> db2. 有 DB 開(kāi)始,用工具生成 mapping 和 Domain Object3. 由配置文件開(kāi)始四. Domain Object 限制1.默認(rèn)的構(gòu)造方法(必須的) 2.有無(wú)意義的標(biāo)示符id(主鍵)可選 3.非 final 的,對(duì)懶加載有影響 可選Configuration SessionFactory Session Transaction QueryCriteriaConfiguration 類(lèi) Configuration 類(lèi)負(fù)責(zé)配置并啟動(dòng)SessionFactory對(duì)象。在Hibernate的啟動(dòng)的過(guò)程中,對(duì)象。SessionFactory接 口Sess
3、io nFactory 接口負(fù)責(zé)初始化 Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)Sessio nFactory就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。Session接口 Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作 (CRUD 的任務(wù)是完成與數(shù)據(jù)庫(kù)的交流,包含了很多常見(jiàn)的 SQL 語(yǔ) 句。)。但需要注意的是Session對(duì)象是非線程安全的。同時(shí),Hibernate 的session不同于JSP應(yīng)用
4、中的HttpSession。這里當(dāng)使用session這個(gè) 術(shù)語(yǔ)時(shí),其實(shí)指的是 Hibernate中的session,而以后會(huì)將HttpSession對(duì)象稱為用戶 session。Transaction 接口Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作。它是可選的,開(kāi)發(fā)人員也可以設(shè)計(jì)編寫(xiě)自己的底層事務(wù)處理代碼Query 和 Criteria 接口Query和Criteria接口負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫(kù)查詢。它可以使用HQL語(yǔ)句或 SQL 語(yǔ)句兩種表達(dá)方式。1get和load方法的區(qū)別 load/get方法均可以根據(jù)指定的實(shí)體類(lèi)和id從數(shù)據(jù)庫(kù)中讀取記錄,并返回與之對(duì)應(yīng)的實(shí)體對(duì)象 。load返回的是代理對(duì)
5、象,不會(huì)返回空值;get方法返回實(shí)體類(lèi);load方法可以充分利用內(nèi)部緩存和二級(jí)緩存中現(xiàn)有的數(shù)據(jù),而get方法僅僅在內(nèi)部緩存中進(jìn)行數(shù)據(jù)查找, 如沒(méi)有發(fā)現(xiàn)對(duì)應(yīng)的數(shù)據(jù)將越過(guò)二級(jí)緩存,直接調(diào)用sql完成數(shù)據(jù)讀取。2save方法和persist的區(qū)別save方法在保存的時(shí)候如果不開(kāi)啟事務(wù),數(shù)據(jù)會(huì)插入數(shù)據(jù)庫(kù),然后事 務(wù)回滾;persist方法在保存時(shí)如果不開(kāi)啟事務(wù),不會(huì)插入數(shù)據(jù)庫(kù)數(shù)據(jù);3對(duì)象狀態(tài):通過(guò)與session和數(shù)據(jù)庫(kù)的關(guān)系判斷狀態(tài).瞬時(shí)(transient): new出來(lái)的對(duì)象,跟session和數(shù)據(jù)庫(kù)沒(méi)有關(guān)系,垃圾回收器會(huì)自動(dòng)回收。持久(Persistent): session內(nèi)部對(duì)象,與數(shù)據(jù)庫(kù)
6、對(duì)應(yīng),數(shù)據(jù)庫(kù)中的數(shù)據(jù)發(fā)生變化session會(huì)知道。.脫管(detached):不在session內(nèi)部,與數(shù)據(jù)庫(kù)中有對(duì)應(yīng),數(shù)據(jù)發(fā)生變化session不會(huì)知道。脫管狀態(tài)下的數(shù)據(jù)想更新數(shù)據(jù)必須調(diào)用up date語(yǔ)句更新數(shù)據(jù)庫(kù)。處于持久態(tài)的對(duì)象也稱為 P0(Persistenee Object)瞬時(shí)對(duì)象和脫管對(duì)象也稱為 VO( Value Object)。saveOrU pdate是根據(jù) un save-value的設(shè)定,判定是要 save還是 up date操作1)當(dāng)不知道對(duì)象處于什么狀態(tài)時(shí),到底是保存還是更新,可以使用方法 saveOrUpdate;2)原理: hiber nate根據(jù)id判斷,如
7、果數(shù)據(jù)庫(kù)有值調(diào)用up date沒(méi)有數(shù)據(jù)調(diào)用save;2)saveOrUpdate與merge的區(qū)別:調(diào)用saveOrUpdate對(duì)象變成持久對(duì)象;調(diào)用merge對(duì)象還是脫管的Users.hbm.xmI中的id可以判斷什么時(shí)候是瞬時(shí)狀態(tài):主鍵判斷:unsaved-value="-1'可以設(shè)置主鍵是-1時(shí)候的對(duì)象是瞬時(shí)的;保存時(shí):判斷unsaved-value的值與保存的id的值,如果兩個(gè)值相等 就表示沒(méi)保存過(guò),調(diào)用保存數(shù)據(jù);(一般不更改此屬性int:0代表是瞬時(shí)對(duì)象String: null代表是瞬時(shí)對(duì)象 evict()清理一集緩存1).查詢?nèi)孔侄蔚那闆r下,如"fro
8、m實(shí)體類(lèi)",list中封裝的對(duì)象為實(shí)體類(lèi)本身,各屬性都將得到填充。2).只查詢一個(gè)字段,默認(rèn)情況下,list中封裝的是Object對(duì)象。3).查詢兩個(gè)或兩個(gè)以上的字段,默認(rèn)情況下,list中封裝的是Object,長(zhǎng)度與所查詢的字段數(shù)一致。對(duì)于后兩種情況,用標(biāo)簽遍歷時(shí)不太方便,因?yàn)闊o(wú)法直接轉(zhuǎn)換成實(shí)體 類(lèi)的對(duì)象。比較簡(jiǎn)單的解決方法是:在hql中使用select new包名.類(lèi)名(屬性1,屬性2)from 實(shí)體類(lèi), 同時(shí)在實(shí)體類(lèi)中添加帶參的構(gòu)造方法, 參數(shù)的個(gè)數(shù)和順序與(屬性1, 屬性2)保持一致,這樣我們得到的list中存放的依然是實(shí)體類(lèi) 的對(duì)象,所查詢到的屬性得到了填充,使用起來(lái)更為方
9、便。4、一級(jí)緩存的管理當(dāng)應(yīng)用程序調(diào)用 Session的 save() update()、saveOrUpdate() get()或load(),以及調(diào)用查詢接口的list()、iterate()或 filter()方法時(shí),如果在Session緩存中還不存在相應(yīng)的對(duì)象,Hibernate就會(huì)把該對(duì)象加入到第一級(jí)緩存中。當(dāng)清理緩存時(shí),Hibernate會(huì)根據(jù)緩存中對(duì)象的狀態(tài)變化來(lái)同步更新數(shù)據(jù)庫(kù)。Sessi on為應(yīng)用程序提供了兩個(gè)管理緩存的方法:evict(Object obj):從緩存中清除參數(shù)指定的持久化對(duì)象。clear():清空緩存中所有持久化對(duì)象。二級(jí)緩存的管理3.1. Hibernate
10、的二級(jí)緩存策略的一般過(guò)程如下:1)條件查詢的時(shí)候,總是發(fā)出一條 select * from table_name where.(選擇所有字段)這樣的SQL語(yǔ)句查詢數(shù)據(jù)庫(kù),一次獲得 所有的數(shù)據(jù)對(duì)象。2) 把獲得的所有數(shù)據(jù)對(duì)象根據(jù) ID 放入到第二級(jí)緩存中。3)當(dāng)Hibernate根據(jù)ID訪問(wèn)數(shù)據(jù)對(duì)象的時(shí)候,首先從Session級(jí)緩存中查;查不到,如果配置了二級(jí)緩存,那么從二級(jí)緩存中查; 查不到,再查詢數(shù)據(jù)庫(kù),把結(jié)果按照 ID 放入到緩存。4) 刪除、更新、增加數(shù)據(jù)的時(shí)候,同時(shí)更新緩存。Hibernate的二級(jí)緩存策略,是針對(duì)于ID查詢的緩存策略,對(duì)于條件查詢則毫無(wú)作用。為此,Hibernate提
11、供了針對(duì)條件查詢的 QueryCache。HQL (Hibernate Query Language):查詢的是對(duì)象而不是表,支持多態(tài),對(duì)象名是區(qū)分大小寫(xiě), java 類(lèi)和屬性。Query接口處理查詢語(yǔ)句;兩種方法:query.listO :查詢?nèi)拷Y(jié)果集query.uniqueResult()查詢唯一結(jié)果集賦值語(yǔ)句有兩種: 通過(guò) ?號(hào)傳遞參數(shù),條件:賦值必須與 ?的位置一致 "from Users as users where =?" query.setString(0, name);.通過(guò):Param賦值,好處是如果hql語(yǔ)句中有多個(gè)名字作為參數(shù)是需
12、要賦值一次就可以了"from Users as users where =:name "query.setString("name" , name);Oracle 中的關(guān)鍵字不能作為表名字: 兩種方法:table二” userS'或者用反引號(hào)將關(guān)鍵字改為字符串 table二”'user'”字段名處理方式與表名相同。/hql 的分頁(yè)查詢,好處是此種方式跨數(shù)據(jù)庫(kù),可以移植的,hibernate會(huì)根據(jù)配置方言調(diào)用那種數(shù)據(jù)庫(kù)/ 第一條的分頁(yè)語(yǔ)句,如: oracle 用rownu m.query.setFirstResu
13、lt(0);記錄從 0開(kāi)始query.setMaxResults(10);/ 取 10 條條件查詢: Criteria接口調(diào)用 ,對(duì)象查詢語(yǔ)句,可以添加約束條件Restrictions:限制、約束類(lèi),提供一系列的靜態(tài)方法關(guān)聯(lián)關(guān)系:1、表關(guān)聯(lián)關(guān)系 2、對(duì)象關(guān)聯(lián)關(guān)系Hibernate的多對(duì)一映射時(shí),many-to-one時(shí)指定的column默認(rèn)是映射到關(guān)聯(lián)表的主鍵上(缺省),體現(xiàn)了無(wú)意義的id,實(shí)現(xiàn)主外鍵關(guān)聯(lián);此標(biāo)簽的column可以不指定,默認(rèn)為和name相同的字段。prop erty-ref:可以指定映射的外鍵是哪個(gè)列我們只需要理解對(duì)象關(guān)系模型,hibernate會(huì)自動(dòng)處理表之間的關(guān)聯(lián)關(guān) 系。
14、Hibernate的主鍵生成策略 in creme nt:由hibernate自動(dòng)以遞增的方式生成主鍵;identity :由底層數(shù)據(jù)庫(kù)生成標(biāo)識(shí);sequenee Hibernate根據(jù)底層數(shù)據(jù)庫(kù)的序列生成標(biāo)示符,要求底層數(shù)據(jù)庫(kù)支持序列;hilo : Hibernate根據(jù)high/low算法生成標(biāo)示符;seqhio:使用一個(gè)高/低位算法高效的生成long、short或者int類(lèi)型的標(biāo)示符;native:根據(jù)底層數(shù)據(jù)庫(kù)自動(dòng)生成標(biāo)識(shí)符的方式,自動(dòng)選擇in creme nt、 identity 或者 hilo;uuid.hex: Hibernate采用128位的UUID算法生成標(biāo)示符;uuid.string: UUID被編碼成一個(gè)16字符長(zhǎng)的字符串;assigned自然主鍵,由Java應(yīng)用程序負(fù)責(zé)生成標(biāo)示符;foreign :使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)示符;注:映射Set集合屬性時(shí),如果element元素包括not-null= ”true”屬性,則集合屬性表
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 賓館員工勞務(wù)合同范本
- 《合同編 司法解釋》 執(zhí)行
- 2024熱水器環(huán)保節(jié)能標(biāo)準(zhǔn)執(zhí)行合同樣本3篇
- 二零二五年度寶鋼集團(tuán)員工勞動(dòng)爭(zhēng)議調(diào)解與和解服務(wù)合同2篇
- 二零二五年度智能機(jī)床定制研發(fā)合同2篇
- 二零二五年度數(shù)據(jù)中心個(gè)人機(jī)柜租賃及數(shù)據(jù)備份合同3篇
- 2024校企合作電子商務(wù)數(shù)據(jù)分析與營(yíng)銷(xiāo)策略咨詢合同3篇
- 二零二五年度房地產(chǎn)銷(xiāo)售臺(tái)賬制作與市場(chǎng)推廣合同2篇
- 2024版智慧旅游服務(wù)平臺(tái)設(shè)計(jì)與實(shí)施合同
- 二零二五年度新能源發(fā)電項(xiàng)目生態(tài)保護(hù)合同3篇
- GB/T 44351-2024退化林修復(fù)技術(shù)規(guī)程
- 反邪教課件大學(xué)
- 2024年-2025年全民“科學(xué)素養(yǎng)提升行動(dòng)”競(jìng)賽考試題庫(kù)(含各題型)
- 實(shí)習(xí)護(hù)士匯報(bào)
- 4R危機(jī)管理理論
- FANUC機(jī)器人培訓(xùn)教程(完成版)
- 中醫(yī)診療技術(shù)操作規(guī)程
- 樂(lè)理知識(shí)考試題庫(kù)130題(含答案)
- 2024年《多媒體技術(shù)與應(yīng)用》 考試題庫(kù)及答案
- (完整)北京版小學(xué)英語(yǔ)1至6年級(jí)詞匯(帶音標(biāo))
- 終止合同告知函 委婉
評(píng)論
0/150
提交評(píng)論