版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Hibernate課JDBC強。靈活性比較強,可以寫很復雜的SQL語句。JDBC因為JAVA是面象的,JDBC沒有做到使數據能夠面象的編程,使程序員的思考仍停留在SQL語句上。操作比較繁瑣,很多代碼需要重復寫很多次如果遇到批量操作,頻繁與數據庫進行交互,容易造成效率的下降JDBC的程序操作可以封裝一些什么內容?又不可以封裝哪些內容Hibernate實現了面象的數據庫編Hibernate比起JDBC來,在代碼的書寫上比較簡單化了Hibernate提出了緩存機制,這樣可以使數據的效率提高很大第一個Hibernate例子包括的內容項目所需要的LIB配置文件持久化 文 結論:通過這個例子可以看到利用面象的技術也可以操作數據庫。Hibernate就是一個面象操作數據庫的框JDBC開發(fā)的。配置文件Hibernate.connection.url表示要的數據庫地址 mysql數據 oracle數據 SQLServer數據validate:加載hibernate時驗證創(chuàng)建表結update:加載hibernate時自動更新數據庫結構,如果表存在不用創(chuàng)建,如果不create:每一次加載hibernate時都創(chuàng)建表結create-drop:加載hibernate時創(chuàng)建,退出時刪持久化類文件客戶端查詢例子刪除例子更新例子保存例子Cnfiguration類負責管理Hibernate的配置信息。包括如下內容Hibernate運行的底層信息:數據庫的URL、用戶名、、JDBC驅動類,數據庫Dialect,數據庫連接池等(對應hibernate.cfg.xml文件)持久化類與數據表的關系(*.hbm.xml文件創(chuàng)建Configuration的兩種方屬性文件Configurationcfg=newXml文件Configurationcfg=new第二種創(chuàng)建方式較為常見。Hibernate.cfg.xml文件默認 為系統(tǒng)的 (展示源代碼以得到證實也可以利用config.config方法來指定配置文件所在 Configuration對象根據當前的配置信息生成SessionFactory對象。SessionFactory對象一旦構造完畢,即被賦予特定的配置信息(SessionFactory對象中保存了當前的數據庫配置信息和所有關系以及預定義的SQL語句。同時,SessionFactory還負責Hibernate的二級緩存)。Configurationcfg=newSessionFactorysf=是線程安全的SessionFactory是生成Session的工廠Sessionsession=構造SessionFactory很消耗資源,一般情況下一個應用中只初始化一SessionFactory對象在Hibernate中,Transactiontx=session.beginTransaction()相當于給數據庫 Hibernate的整個運行過程如下1、應用程序先調用Configuration類,該類Hibernate配置文件及文件2、并用這些信息生成一個SessionFactory對象3、然后從SessionFactory對象生成一個Session對象4、并用Session對象生成Transaction對象A、可通過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進行加載、保存、更新、刪除、等操作;B、在查詢的情況下,可通過Session對象生成一個Query對象,然后利用ORM框 開源的持久層框架ORM(Object/RelationalMap )工具,建立面象的域模型和關系數據模型之間的.連接java應用和數據庫的中間件對JDBC進行封裝,負責java對象的持久化Hibernate的優(yōu)點1、Hibernate對JDBC數據庫的代碼做了封裝,大大簡化2、Hibernate是一個基于jdbc的主流持久化框架,是一個優(yōu)的orm實現,它很大程度的簡化了dao層編碼工作3、Hibernate使用java的反射機制,而不是字節(jié)碼增強程序類實透明4、Hibernate的性能非常好,因為它是一個輕量級框架。的5、Hibernate使數據庫的操作完全面象。而不是從前的面向關系進行操作ORM應用Hibernate意味著程序員將不直接操作SQL語句,也就是說以前對SQL的直接操作現在要用面象實現。實際上ORM到JDBC是緊密相連的。于此帶來了一一對多、多對一的關系在面象中是怎么樣去實現面象是怎么樣由面象的操作到對SQL的操描描由hibernate自動以遞增的方式生成表識符,每次增量為由底層數據庫生成表識符。條件是數據庫支持自動增長數據類型Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列Hibernate采用128位的UUID算法來生成標識符。該算如果主鍵用字符類型,并且不代表任何含義適用于自然主鍵。由java程序負責生成標識符。不能把setID()方法聲Private的。盡量避免使用自然主鍵increment標識符increment標識符由Hibernate以遞增的方式為主鍵賦Hibernate會先NEWS表中的主鍵的最大值,而接下來向NEWS表中記錄時,就在max(id)的基礎上遞增,增量為1.(帶走+1)適用范圍由于increment生存標識符機制不依賴于底層數據庫系統(tǒng)因此它適合適用于只有單個Hibernate應用進程同一個數據庫的場OID必須為longint或short類型如果把OID定義為byte類型在identity標識符identity標識符由底層數據庫來負責生成標識符,它要求底層數據庫把主鍵定義為自動增長字段類型(加1帶走)適用范圍由于identity生成標識符的機制依賴于底層數據庫系統(tǒng)因此要求底層數據庫系統(tǒng)必須支持自動增長字段類型.支持自動增長字段類型的數據庫包括:DB2,Mysql,MSSQLServer,Sybase等OID必須為longint或short類型如果把OID定義為byte類型在sequence標識符sequence標識符利用底層數據庫提供的序列來生成標識符Hibernate在持久化一個News對象時先從底層數據庫的news_seq序列中獲得一個唯一的標識號,再把它作為主鍵值適用范圍由于sequence生成標識符的機制依賴于底層數據庫系統(tǒng)的序列因此,要求底層數據庫系統(tǒng)必須支持序列.支持序列的數據庫包括:DB2Oracle等OID必須為longint或short類型如果把OID定義為byte類型在native標識符native標識符依據底層數據庫對自動生成標識符的支持能力,來選擇使用identity,sequence或hilo標識符.適用范圍由于native能根據底層數據庫系統(tǒng)的類型自動選擇合適的標識符生成器,因此很適合于跨數據庫平臺開發(fā)OID必須為longint或short類型如果把OID定義為byte類型在assigned標識符適用范圍主鍵有一定的含義,需要根據業(yè)務產生的情況Uuid標識符使用范圍主鍵是字符串,而且必須是唯Myeclipse開發(fā)1 新建一個JavaProject工 利用hibernate自帶的工具自動生成持久化類和文件。5 建立客戶端進行編HibernateSessionFactory利用ThreadLocal類保證了Session的線程安全。具體內容看代碼是怎么樣形成的持久化對象有3種狀態(tài):游離狀Session的特定方法能使對象從一個狀態(tài)轉換到另一個狀在使用主鍵的情況下,OID通常為不處于Session的緩存在數據庫中沒有對應的記OID不為位于Session緩存持久化對象和數據庫中的相關記錄對Session在清理緩存時會根據持久化對象的屬性變化來同步更新數據在同一個Session實例的緩存中數據庫表中的每條記錄只對應唯一的OID不為不再處于Session的緩存一般情況需下游離對象是由持久化對象轉變過來的因此在數據庫中Session使用以下方法可以使持久化對象轉變成游離對象hibernate程序代生命周狀tx=session.beginTransaction();Customerc=newCustomer);臨時狀Long處于生命處于持久c=期狀Customerc2處于游離c2=Sessionsave方法使一個臨時對象轉變?yōu)槌志没瘜essionsave方法完成以下操作News對象加入到Session緩存中使它進入持久化狀選用文件指定的標識符,為持久化對象分配唯一的OID.在使用主鍵的情況下,setId()方法為News對象設置OID使無效的.計劃執(zhí)行一條insert語句,把Customer對象當前的屬性值組裝到insert語句Hibernate通過持久化對象的OID來維持它和數據庫相關記錄的對應關系News對象處于持久化狀態(tài)時不允許程序隨意修改它的Sessionupdate()方法使一個游離對象轉變?yōu)槌志没瘜ο蟛⑶矣媱潏?zhí)行一條update語句.該方法同時包含saveupdate方法,如果參數是臨時對象就用save方法,如果是游離對象就用update方法,如果是持久化對象就直接返回。如果參數是臨時對象就用save方如果是游離對象就用update方如果是持久化對象就直接返回,不執(zhí)行操6.一對多關聯關僅僅建立從Order到Customer的多對一關聯,即僅僅在Order類中定義customer屬性。或者僅僅建立從CustomerOrder的一對多關聯,即僅僅Customer類中定義orders集合。單向n-1關聯只需從n的一端可以1的一域模型OrderCustomer的多對一單向關聯需要在Order類中定義一Customer屬性Customer類中無需定義存放Order對象的集合屬關系數據模型:ORDERS表中的CUSTOMER_ID參照CUSTOMER表的主Hibernate使用<many-to-one>元素來多對一關聯關實驗1先保存訂單,再保存客從這里可以看出執(zhí)行了兩條insert語句,一條update語句可以看出這種情況程序是執(zhí)行了兩條insert語句,而沒有執(zhí)行update語句。先保存客戶,再保存訂單,在下面的代碼中注釋掉session.save(c),會有什么果級存和更hibernate持久化一個臨時對象時,在默認情況下,他不會自動持久化所關聯的其他臨時對象,會拋出TransientObjectException.如果設定many-to-one元素的cascade屬性為save-update的話,可實現自動持久化所關聯的對象。雙向1-n向n-1是完全相同的兩種情雙向1-n需要在1的一端可以n的一端,反之依然域模型OrderCustomer的多對一單向關聯需要在Order類中定義一Customer屬性Customer類中需定義存放Order對象的集合屬ORDERS表中的CUSTOMER_IDCUSTOMER表的主Hibernate使用set元素來一對多關聯關在下面的代碼中注釋掉session.save(order1),會有什級存和更hibernate持久化一個臨時對象時,在默認情況下,他不會自動持久化所關聯的其他臨時對象,會拋出TransientObjectException.如果設定set元素的cascade屬性為save-update的話,可實現自動持久化所關聯的對象。保存訂單時會發(fā)出兩條insertHibernate:selectmax(id)fromHibernate:insertintocustomers(name,id)values(?,Hibernate:insertintoorders(order_number,price,customer_id)values(?,?,?)Hibernate:selectmax(id)fromHibernate:insertintocustomers(name,id)values(?,?)Hibernate:insertintoorders(order_number,price,customer_id)values(?,?,?)Hibernate:updateorderssetcustomer_id=?where上述例子產生了兩條update語句Hibernate:updateorderssetorder_number=?,price=?,customer_id=?whereid=?Hibernate:updateorderssetcustomer_id=?where庫,因此執(zhí)行了上述的兩條更新語句所以會產生兩條update語句Inverse來源在hibernate中通過對inverse屬性的值決定是由雙向關聯的哪一方來表和表之間的關系.inverse=false的為主動方,inverse=true的為方,由主動方Inverse設在沒有設置inverse=true的情況下,父子兩邊都父子關Inverse設值原1-n關系中,將n方設為主控方將有助于性能改善(如果要國家元首記住1-N關系中,若將1方設為主控方額外多出update語在一的一方設值inverse為TRUE表明一的一方不其關系,這樣就會發(fā)出一update語句,這樣效率也就提高了Inverse結在一對多的雙向關聯關系時,應該在one方把inverse屬性設為true,在建立兩個對象的關聯時,應該同時修改關聯兩端的相應屬性不受Hibernate實現類的影響。同理,當刪除雙向關聯的關系時,也應該修改解除某個訂單與某個客戶的關這樣在order表中,ID為6的相應的外鍵為3的那行的外鍵會置為cascade<set>元素有一個order-by屬性如果設置了該屬性當Hibernate通過select語句到數據庫中檢索集合對象時,利用orderby子句進行排序7.多對多關聯關sessionSession接口是Hibernate向應用程序提供的對數據庫的最主要的接口,它提供了基本的保存,更新,刪除和加載Java對象的方法.session在Session接口的實現中包含一系列的Java集合,這些Java集合構成了Session緩存Session實例沒有結束生命周期存放在它緩存中的對象也 sessionsave()方法持久化一個對象時,該對象被載入緩存,以后即使程序中不再該對象,只要緩存不清空,該對象仍然處于生命周期中。當試load()對象時,會判斷緩存中是否存在該對象,有則返回。沒有在查詢數據sessionSession具有一個緩存位于緩存中的對象稱為持久化對象它和數據庫中的相關記錄對應Session能夠在某些時間點按照緩存中對象的變化來執(zhí)行相關的SQL語句,來同步更新數據庫,這一過程被稱為清理緩存(flush)默認情況下Session在以下時間點清理緩存當應用程序調用Transaction的commit()方法的時,該方法先清理 顯式調用Sessionflush()方法區(qū)別flush:進行清理緩存(此時緩存中的數據并不丟失)的操作,讓緩存和數據庫同步行一些列sql語句,但不提交事務,;commit:先調用flush()方法,然后提交事務則意味著提交事務意味著對數據庫操reresh:刷新,讓session和數據庫同步,執(zhí)行查詢,把數據庫的信息顯示出來,更clear:清空緩存,等價于利用Session緩存持久化對象的數Customerc=newCustomer(“TOM”,newsession.save(c);//customer對象被持久化,并且加入到session的緩存Longid=c=null;//c變量不再customer對//從session緩存中customer對象,使c2變量customer對Customerc2=(Customer)session.load(Customer.clamit();//緩存中的對象和數據庫同session.close();session清空緩System.out.println(c2.getName());//customer對C2=null;//C2對象不再customer對象,customer對象結束生命周緩存的作用1。減少數據庫的頻率2。保證緩存中的對象與數據庫中的相關記錄保持同步Session可以寫一個for循環(huán),Session可以批量上萬條數據。如下面的代碼For(inti=0;i<10000;i++){}做加大了內存的壓力。所以應該定期清理session的緩存,也就是flush一下,這樣內場合二:當用戶要取數據庫的一張表的一個字段的值,而這個值很可能是blob類兩種場合的取數據的方法一樣嗎?是用load還是用get方法lazytrue或者為 extra為更進一步的延遲加載策略當調用getStudents()時不會加載hql語句,當加載student的屬性的時候才會發(fā)出SQL語句調用getStudents().size()方法的時候,會觸發(fā)類似于:Hibernate:selectcount(id)fromT_Studentwherecla =?這樣的SQL查詢語句(這是一種很聰明的做法,如果lazy=”true”,getStudents().size()將會使得hibernate加載所有集合的調用getStudents().contains()方法的時候(即判斷是否包含某個對象),會觸發(fā)類似于:select1fromT_Studentwherecla =?andid=?這樣的SQL查詢語 no-proxy:當前對象的単值相關對象只有在調用它的主鍵外的其他屬性的get方法時默認的檢索策略是立即檢索。在Hibernate文件中,通過在<class>上配置lazy屬性來確定檢索策略。對于Session的檢索方式,類級別檢索策略僅適用于load方法;也就說,對于get、qurey檢索,持久化對象都會被立即加載而不管lazy是false還是true.一般來說,檢索對象就是要它,因此立即檢索是通常的選擇。由于load方法在檢索不到對象時會拋出異常(立即檢索的情況下),因此我個人并不建議使用load檢索;而由于<class>中的lazy屬性還影響到多對一及一對一的檢索策略,因此使用load方法就更沒必要了。(默認值是策采用迫切左外聯接檢索采用迫切左外聯接檢索采用迫切左外聯接檢索采用立即檢采用延遲檢采用延遲檢c.getOrders().size()執(zhí)行selectcount(id)fromorderswherecustomer_id=?for(Ordero:set){o.getOrderNumber();}將selectcustomer_idid,order_number,pricefromorderswhere也分為3中情嵌套子查詢(檢索多個customer對象時Lazy屬selectcustomer_id,order_number,pricefromorders
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度綠色蔬菜種植菜園大棚租賃合作協議3篇
- 教育機構中的酒水采購與供應策略
- 創(chuàng)新能力的提升與跨學科教育的關系
- 教育機構空間改造與教育環(huán)境優(yōu)化
- 2025年度住宅小區(qū)窗簾安裝與社區(qū)美化合同4篇
- 2025版貨車承包新能源推廣合同3篇
- 2025年校園更夫崗位職責與夜間巡邏保障合同3篇
- 木枋購銷合同(二零二五年度版)2篇
- 二零二五版智能樓頂廣告信息發(fā)布系統(tǒng)建設合同4篇
- 2025版智能交通系統(tǒng)關鍵零配件集成設計與采購合同4篇
- 2025年溫州市城發(fā)集團招聘筆試參考題庫含答案解析
- 2025版高考物理復習知識清單
- 2024年度工作總結與計劃標準版本(2篇)
- 全球半導體測試探針行業(yè)市場研究報告2024
- 2024年注冊計量師-一級注冊計量師考試近5年真題附答案
- 2023-2024學年深圳市高一年級下冊英語期末考試題(含答案)
- 工程管理重大風險應對方案
- 直播帶貨助農現狀及發(fā)展對策研究-以抖音直播為例(開題)
- 《光伏發(fā)電工程工程量清單計價規(guī)范》
- (完整版)保證藥品信息來源合法、真實、安全的管理措施、情況說明及相關證明
- 營銷專員績效考核指標
評論
0/150
提交評論