hibernate課程1.JDBC優(yōu)點(diǎn)和缺點(diǎn)_第1頁
hibernate課程1.JDBC優(yōu)點(diǎn)和缺點(diǎn)_第2頁
hibernate課程1.JDBC優(yōu)點(diǎn)和缺點(diǎn)_第3頁
hibernate課程1.JDBC優(yōu)點(diǎn)和缺點(diǎn)_第4頁
hibernate課程1.JDBC優(yōu)點(diǎn)和缺點(diǎn)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余45頁可下載查看

下載本文檔

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

文檔簡介

Hibernate課JDBC強(qiáng)。靈活性比較強(qiáng),可以寫很復(fù)雜的SQL語句。JDBC因?yàn)镴AVA是面象的,JDBC沒有做到使數(shù)據(jù)能夠面象的編程,使程序員的思考仍停留在SQL語句上。操作比較繁瑣,很多代碼需要重復(fù)寫很多次如果遇到批量操作,頻繁與數(shù)據(jù)庫進(jìn)行交互,容易造成效率的下降JDBC的程序操作可以封裝一些什么內(nèi)容?又不可以封裝哪些內(nèi)容Hibernate實(shí)現(xiàn)了面象的數(shù)據(jù)庫編Hibernate比起JDBC來,在代碼的書寫上比較簡單化了Hibernate提出了緩存機(jī)制,這樣可以使數(shù)據(jù)的效率提高很大第一個Hibernate例子包括的內(nèi)容項(xiàng)目所需要的LIB配置文件持久化 文 結(jié)論:通過這個例子可以看到利用面象的技術(shù)也可以操作數(shù)據(jù)庫。Hibernate就是一個面象操作數(shù)據(jù)庫的框JDBC開發(fā)的。配置文件Hibernate.connection.url表示要的數(shù)據(jù)庫地址 mysql數(shù)據(jù) oracle數(shù)據(jù) SQLServer數(shù)據(jù)validate:加載hibernate時驗(yàn)證創(chuàng)建表結(jié)update:加載hibernate時自動更新數(shù)據(jù)庫結(jié)構(gòu),如果表存在不用創(chuàng)建,如果不create:每一次加載hibernate時都創(chuàng)建表結(jié)create-drop:加載hibernate時創(chuàng)建,退出時刪持久化類文件客戶端查詢例子刪除例子更新例子保存例子Cnfiguration類負(fù)責(zé)管理Hibernate的配置信息。包括如下內(nèi)容Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫的URL、用戶名、、JDBC驅(qū)動類,數(shù)據(jù)庫Dialect,數(shù)據(jù)庫連接池等(對應(yīng)hibernate.cfg.xml文件)持久化類與數(shù)據(jù)表的關(guān)系(*.hbm.xml文件創(chuàng)建Configuration的兩種方屬性文件Configurationcfg=newXml文件Configurationcfg=new第二種創(chuàng)建方式較為常見。Hibernate.cfg.xml文件默認(rèn) 為系統(tǒng)的 (展示源代碼以得到證實(shí)也可以利用config.config方法來指定配置文件所在 Configuration對象根據(jù)當(dāng)前的配置信息生成SessionFactory對象。SessionFactory對象一旦構(gòu)造完畢,即被賦予特定的配置信息(SessionFactory對象中保存了當(dāng)前的數(shù)據(jù)庫配置信息和所有關(guān)系以及預(yù)定義的SQL語句。同時,SessionFactory還負(fù)責(zé)Hibernate的二級緩存)。Configurationcfg=newSessionFactorysf=是線程安全的SessionFactory是生成Session的工廠Sessionsession=構(gòu)造SessionFactory很消耗資源,一般情況下一個應(yīng)用中只初始化一SessionFactory對象在Hibernate中,Transactiontx=session.beginTransaction()相當(dāng)于給數(shù)據(jù)庫 Hibernate的整個運(yùn)行過程如下1、應(yīng)用程序先調(diào)用Configuration類,該類Hibernate配置文件及文件2、并用這些信息生成一個SessionFactory對象3、然后從SessionFactory對象生成一個Session對象4、并用Session對象生成Transaction對象A、可通過Session對象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法對PO進(jìn)行加載、保存、更新、刪除、等操作;B、在查詢的情況下,可通過Session對象生成一個Query對象,然后利用ORM框 開源的持久層框架ORM(Object/RelationalMap )工具,建立面象的域模型和關(guān)系數(shù)據(jù)模型之間的.連接java應(yīng)用和數(shù)據(jù)庫的中間件對JDBC進(jìn)行封裝,負(fù)責(zé)java對象的持久化Hibernate的優(yōu)點(diǎn)1、Hibernate對JDBC數(shù)據(jù)庫的代碼做了封裝,大大簡化2、Hibernate是一個基于jdbc的主流持久化框架,是一個優(yōu)的orm實(shí)現(xiàn),它很大程度的簡化了dao層編碼工作3、Hibernate使用java的反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序類實(shí)透明4、Hibernate的性能非常好,因?yàn)樗且粋€輕量級框架。的5、Hibernate使數(shù)據(jù)庫的操作完全面象。而不是從前的面向關(guān)系進(jìn)行操作ORM應(yīng)用Hibernate意味著程序員將不直接操作SQL語句,也就是說以前對SQL的直接操作現(xiàn)在要用面象實(shí)現(xiàn)。實(shí)際上ORM到JDBC是緊密相連的。于此帶來了一一對多、多對一的關(guān)系在面象中是怎么樣去實(shí)現(xiàn)面象是怎么樣由面象的操作到對SQL的操描描由hibernate自動以遞增的方式生成表識符,每次增量為由底層數(shù)據(jù)庫生成表識符。條件是數(shù)據(jù)庫支持自動增長數(shù)據(jù)類型Hibernate根據(jù)底層數(shù)據(jù)庫序列生成標(biāo)識符。條件是數(shù)據(jù)庫支持序列Hibernate采用128位的UUID算法來生成標(biāo)識符。該算如果主鍵用字符類型,并且不代表任何含義適用于自然主鍵。由java程序負(fù)責(zé)生成標(biāo)識符。不能把setID()方法聲Private的。盡量避免使用自然主鍵increment標(biāo)識符increment標(biāo)識符由Hibernate以遞增的方式為主鍵賦Hibernate會先NEWS表中的主鍵的最大值,而接下來向NEWS表中記錄時,就在max(id)的基礎(chǔ)上遞增,增量為1.(帶走+1)適用范圍由于increment生存標(biāo)識符機(jī)制不依賴于底層數(shù)據(jù)庫系統(tǒng)因此它適合適用于只有單個Hibernate應(yīng)用進(jìn)程同一個數(shù)據(jù)庫的場OID必須為longint或short類型如果把OID定義為byte類型在identity標(biāo)識符identity標(biāo)識符由底層數(shù)據(jù)庫來負(fù)責(zé)生成標(biāo)識符,它要求底層數(shù)據(jù)庫把主鍵定義為自動增長字段類型(加1帶走)適用范圍由于identity生成標(biāo)識符的機(jī)制依賴于底層數(shù)據(jù)庫系統(tǒng)因此要求底層數(shù)據(jù)庫系統(tǒng)必須支持自動增長字段類型.支持自動增長字段類型的數(shù)據(jù)庫包括:DB2,Mysql,MSSQLServer,Sybase等OID必須為longint或short類型如果把OID定義為byte類型在sequence標(biāo)識符sequence標(biāo)識符利用底層數(shù)據(jù)庫提供的序列來生成標(biāo)識符Hibernate在持久化一個News對象時先從底層數(shù)據(jù)庫的news_seq序列中獲得一個唯一的標(biāo)識號,再把它作為主鍵值適用范圍由于sequence生成標(biāo)識符的機(jī)制依賴于底層數(shù)據(jù)庫系統(tǒng)的序列因此,要求底層數(shù)據(jù)庫系統(tǒng)必須支持序列.支持序列的數(shù)據(jù)庫包括:DB2Oracle等OID必須為longint或short類型如果把OID定義為byte類型在native標(biāo)識符native標(biāo)識符依據(jù)底層數(shù)據(jù)庫對自動生成標(biāo)識符的支持能力,來選擇使用identity,sequence或hilo標(biāo)識符.適用范圍由于native能根據(jù)底層數(shù)據(jù)庫系統(tǒng)的類型自動選擇合適的標(biāo)識符生成器,因此很適合于跨數(shù)據(jù)庫平臺開發(fā)OID必須為longint或short類型如果把OID定義為byte類型在assigned標(biāo)識符適用范圍主鍵有一定的含義,需要根據(jù)業(yè)務(wù)產(chǎn)生的情況Uuid標(biāo)識符使用范圍主鍵是字符串,而且必須是唯Myeclipse開發(fā)1 新建一個JavaProject工 利用hibernate自帶的工具自動生成持久化類和文件。5 建立客戶端進(jìn)行編HibernateSessionFactory利用ThreadLocal類保證了Session的線程安全。具體內(nèi)容看代碼是怎么樣形成的持久化對象有3種狀態(tài):游離狀Session的特定方法能使對象從一個狀態(tài)轉(zhuǎn)換到另一個狀在使用主鍵的情況下,OID通常為不處于Session的緩存在數(shù)據(jù)庫中沒有對應(yīng)的記OID不為位于Session緩存持久化對象和數(shù)據(jù)庫中的相關(guān)記錄對Session在清理緩存時會根據(jù)持久化對象的屬性變化來同步更新數(shù)據(jù)在同一個Session實(shí)例的緩存中數(shù)據(jù)庫表中的每條記錄只對應(yīng)唯一的OID不為不再處于Session的緩存一般情況需下游離對象是由持久化對象轉(zhuǎn)變過來的因此在數(shù)據(jù)庫中Session使用以下方法可以使持久化對象轉(zhuǎn)變成游離對象hibernate程序代生命周狀tx=session.beginTransaction();Customerc=newCustomer);臨時狀Long處于生命處于持久c=期狀Customerc2處于游離c2=Sessionsave方法使一個臨時對象轉(zhuǎn)變?yōu)槌志没瘜essionsave方法完成以下操作News對象加入到Session緩存中使它進(jìn)入持久化狀選用文件指定的標(biāo)識符,為持久化對象分配唯一的OID.在使用主鍵的情況下,setId()方法為News對象設(shè)置OID使無效的.計(jì)劃執(zhí)行一條insert語句,把Customer對象當(dāng)前的屬性值組裝到insert語句Hibernate通過持久化對象的OID來維持它和數(shù)據(jù)庫相關(guān)記錄的對應(yīng)關(guān)系News對象處于持久化狀態(tài)時不允許程序隨意修改它的Sessionupdate()方法使一個游離對象轉(zhuǎn)變?yōu)槌志没瘜ο蟛⑶矣?jì)劃執(zhí)行一條update語句.該方法同時包含saveupdate方法,如果參數(shù)是臨時對象就用save方法,如果是游離對象就用update方法,如果是持久化對象就直接返回。如果參數(shù)是臨時對象就用save方如果是游離對象就用update方如果是持久化對象就直接返回,不執(zhí)行操6.一對多關(guān)聯(lián)關(guān)僅僅建立從Order到Customer的多對一關(guān)聯(lián),即僅僅在Order類中定義customer屬性?;蛘邇H僅建立從CustomerOrder的一對多關(guān)聯(lián),即僅僅Customer類中定義orders集合。單向n-1關(guān)聯(lián)只需從n的一端可以1的一域模型OrderCustomer的多對一單向關(guān)聯(lián)需要在Order類中定義一Customer屬性Customer類中無需定義存放Order對象的集合屬關(guān)系數(shù)據(jù)模型:ORDERS表中的CUSTOMER_ID參照CUSTOMER表的主Hibernate使用<many-to-one>元素來多對一關(guān)聯(lián)關(guān)實(shí)驗(yàn)1先保存訂單,再保存客從這里可以看出執(zhí)行了兩條insert語句,一條update語句可以看出這種情況程序是執(zhí)行了兩條insert語句,而沒有執(zhí)行update語句。先保存客戶,再保存訂單,在下面的代碼中注釋掉session.save(c),會有什么果級存和更hibernate持久化一個臨時對象時,在默認(rèn)情況下,他不會自動持久化所關(guān)聯(lián)的其他臨時對象,會拋出TransientObjectException.如果設(shè)定many-to-one元素的cascade屬性為save-update的話,可實(shí)現(xiàn)自動持久化所關(guān)聯(lián)的對象。雙向1-n向n-1是完全相同的兩種情雙向1-n需要在1的一端可以n的一端,反之依然域模型OrderCustomer的多對一單向關(guān)聯(lián)需要在Order類中定義一Customer屬性Customer類中需定義存放Order對象的集合屬ORDERS表中的CUSTOMER_IDCUSTOMER表的主Hibernate使用set元素來一對多關(guān)聯(lián)關(guān)在下面的代碼中注釋掉session.save(order1),會有什級存和更hibernate持久化一個臨時對象時,在默認(rèn)情況下,他不會自動持久化所關(guān)聯(lián)的其他臨時對象,會拋出TransientObjectException.如果設(shè)定set元素的cascade屬性為save-update的話,可實(shí)現(xiàn)自動持久化所關(guān)聯(lián)的對象。保存訂單時會發(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上述例子產(chǎn)生了兩條update語句Hibernate:updateorderssetorder_number=?,price=?,customer_id=?whereid=?Hibernate:updateorderssetcustomer_id=?where庫,因此執(zhí)行了上述的兩條更新語句所以會產(chǎn)生兩條update語句Inverse來源在hibernate中通過對inverse屬性的值決定是由雙向關(guān)聯(lián)的哪一方來表和表之間的關(guān)系.inverse=false的為主動方,inverse=true的為方,由主動方Inverse設(shè)在沒有設(shè)置inverse=true的情況下,父子兩邊都父子關(guān)Inverse設(shè)值原1-n關(guān)系中,將n方設(shè)為主控方將有助于性能改善(如果要國家元首記住1-N關(guān)系中,若將1方設(shè)為主控方額外多出update語在一的一方設(shè)值inverse為TRUE表明一的一方不其關(guān)系,這樣就會發(fā)出一update語句,這樣效率也就提高了Inverse結(jié)在一對多的雙向關(guān)聯(lián)關(guān)系時,應(yīng)該在one方把inverse屬性設(shè)為true,在建立兩個對象的關(guān)聯(lián)時,應(yīng)該同時修改關(guān)聯(lián)兩端的相應(yīng)屬性不受Hibernate實(shí)現(xiàn)類的影響。同理,當(dāng)刪除雙向關(guān)聯(lián)的關(guān)系時,也應(yīng)該修改解除某個訂單與某個客戶的關(guān)這樣在order表中,ID為6的相應(yīng)的外鍵為3的那行的外鍵會置為cascade<set>元素有一個order-by屬性如果設(shè)置了該屬性當(dāng)Hibernate通過select語句到數(shù)據(jù)庫中檢索集合對象時,利用orderby子句進(jìn)行排序7.多對多關(guān)聯(lián)關(guān)sessionSession接口是Hibernate向應(yīng)用程序提供的對數(shù)據(jù)庫的最主要的接口,它提供了基本的保存,更新,刪除和加載Java對象的方法.session在Session接口的實(shí)現(xiàn)中包含一系列的Java集合,這些Java集合構(gòu)成了Session緩存Session實(shí)例沒有結(jié)束生命周期存放在它緩存中的對象也 sessionsave()方法持久化一個對象時,該對象被載入緩存,以后即使程序中不再該對象,只要緩存不清空,該對象仍然處于生命周期中。當(dāng)試load()對象時,會判斷緩存中是否存在該對象,有則返回。沒有在查詢數(shù)據(jù)sessionSession具有一個緩存位于緩存中的對象稱為持久化對象它和數(shù)據(jù)庫中的相關(guān)記錄對應(yīng)Session能夠在某些時間點(diǎn)按照緩存中對象的變化來執(zhí)行相關(guān)的SQL語句,來同步更新數(shù)據(jù)庫,這一過程被稱為清理緩存(flush)默認(rèn)情況下Session在以下時間點(diǎn)清理緩存當(dāng)應(yīng)用程序調(diào)用Transaction的commit()方法的時,該方法先清理 顯式調(diào)用Sessionflush()方法區(qū)別flush:進(jìn)行清理緩存(此時緩存中的數(shù)據(jù)并不丟失)的操作,讓緩存和數(shù)據(jù)庫同步行一些列sql語句,但不提交事務(wù),;commit:先調(diào)用flush()方法,然后提交事務(wù)則意味著提交事務(wù)意味著對數(shù)據(jù)庫操reresh:刷新,讓session和數(shù)據(jù)庫同步,執(zhí)行查詢,把數(shù)據(jù)庫的信息顯示出來,更c(diǎn)lear:清空緩存,等價(jià)于利用Session緩存持久化對象的數(shù)Customerc=newCustomer(“TOM”,newsession.save(c);//customer對象被持久化,并且加入到session的緩存Longid=c=null;//c變量不再customer對//從session緩存中customer對象,使c2變量customer對Customerc2=(Customer)session.load(Customer.clamit();//緩存中的對象和數(shù)據(jù)庫同session.close();session清空緩System.out.println(c2.getName());//customer對C2=null;//C2對象不再customer對象,customer對象結(jié)束生命周緩存的作用1。減少數(shù)據(jù)庫的頻率2。保證緩存中的對象與數(shù)據(jù)庫中的相關(guān)記錄保持同步Session可以寫一個for循環(huán),Session可以批量上萬條數(shù)據(jù)。如下面的代碼For(inti=0;i<10000;i++){}做加大了內(nèi)存的壓力。所以應(yīng)該定期清理session的緩存,也就是flush一下,這樣內(nèi)場合二:當(dāng)用戶要取數(shù)據(jù)庫的一張表的一個字段的值,而這個值很可能是blob類兩種場合的取數(shù)據(jù)的方法一樣嗎?是用load還是用get方法lazytrue或者為 extra為更進(jìn)一步的延遲加載策略當(dāng)調(diào)用getStudents()時不會加載hql語句,當(dāng)加載student的屬性的時候才會發(fā)出SQL語句調(diào)用getStudents().size()方法的時候,會觸發(fā)類似于:Hibernate:selectcount(id)fromT_Studentwherecla =?這樣的SQL查詢語句(這是一種很聰明的做法,如果lazy=”true”,getStudents().size()將會使得hibernate加載所有集合的調(diào)用getStudents().contains()方法的時候(即判斷是否包含某個對象),會觸發(fā)類似于:select1fromT_Studentwherecla =?andid=?這樣的SQL查詢語 no-proxy:當(dāng)前對象的単值相關(guān)對象只有在調(diào)用它的主鍵外的其他屬性的get方法時默認(rèn)的檢索策略是立即檢索。在Hibernate文件中,通過在<class>上配置lazy屬性來確定檢索策略。對于Session的檢索方式,類級別檢索策略僅適用于load方法;也就說,對于get、qurey檢索,持久化對象都會被立即加載而不管lazy是false還是true.一般來說,檢索對象就是要它,因此立即檢索是通常的選擇。由于load方法在檢索不到對象時會拋出異常(立即檢索的情況下),因此我個人并不建議使用load檢索;而由于<class>中的lazy屬性還影響到多對一及一對一的檢索策略,因此使用load方法就更沒必要了。(默認(rèn)值是策采用迫切左外聯(lián)接檢索采用迫切左外聯(lián)接檢索采用迫切左外聯(lián)接檢索采用立即檢采用延遲檢采用延遲檢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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論