




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 補(bǔ)充:補(bǔ)充: 連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫的橋梁連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫的橋梁- Hibernatel1.1.應(yīng)用程序的分層體系結(jié)構(gòu)和應(yīng)用程序的分層體系結(jié)構(gòu)和Hibernate的作用的作用l2 2 軟件的模型軟件的模型l3. 在在Java應(yīng)用中使用應(yīng)用中使用Hibernate的步驟的步驟l(1 1)創(chuàng)建)創(chuàng)建HibernateHibernate的配置文件的配置文件l(2 2)創(chuàng)建持久化類)創(chuàng)建持久化類l(3 3)創(chuàng)建數(shù)據(jù)庫)創(chuàng)建數(shù)據(jù)庫SchemaSchemal(4 4)創(chuàng)建對象)創(chuàng)建對象- -關(guān)系映射文件關(guān)系映射文件 (5)5)通過通過Hibernate APIHibernate API
2、操縱數(shù)據(jù)庫操縱數(shù)據(jù)庫Java對象持久化技術(shù)概述對象持久化技術(shù)概述l應(yīng)用程序的分層體系結(jié)構(gòu)應(yīng)用程序的分層體系結(jié)構(gòu)lJava應(yīng)用的持久化層應(yīng)用的持久化層l軟件的模型軟件的模型 概念模型 關(guān)系數(shù)據(jù)模型 域模型l域?qū)ο笥驅(qū)ο?域?qū)ο笾g的關(guān)系 域?qū)ο蟮某志没拍頻直接通過直接通過JDBC API來持久化實來持久化實體域?qū)ο篌w域?qū)ο髄ORM簡介簡介l實體域?qū)ο蟮钠渌志没J綄嶓w域?qū)ο蟮钠渌志没J?主動域?qū)ο竽J?JDO模式 CMP模式 1.應(yīng)用程序的分層體系結(jié)構(gòu)應(yīng)用程序的分層體系結(jié)構(gòu) 和和Hibernate的作用的作用 l雙層應(yīng)用雙層應(yīng)用 應(yīng)用程序?qū)?數(shù)據(jù)庫層l三層應(yīng)用三層應(yīng)用 表述層 業(yè)務(wù)邏輯層
3、 數(shù)據(jù)庫層l四層應(yīng)用四層應(yīng)用 表述層 業(yè)務(wù)邏輯層 持久化層 數(shù)據(jù)庫層lN層應(yīng)用層應(yīng)用 軟件層的特征軟件層的特征 l 層與層之間存在自上而下層與層之間存在自上而下的依賴關(guān)系,即上層組件會訪的依賴關(guān)系,即上層組件會訪問下層組件的問下層組件的API,而下層組件,而下層組件不應(yīng)該依賴上層組件。例如:不應(yīng)該依賴上層組件。例如:表述層依賴于業(yè)務(wù)邏輯層,而表述層依賴于業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層依賴于數(shù)據(jù)庫層。業(yè)務(wù)邏輯層依賴于數(shù)據(jù)庫層。l 每個層對上層公開每個層對上層公開API,但具體的實現(xiàn)細(xì)節(jié)對外透明。但具體的實現(xiàn)細(xì)節(jié)對外透明。當(dāng)某一層的實現(xiàn)發(fā)生變化,只當(dāng)某一層的實現(xiàn)發(fā)生變化,只要它的要它的API不變,不會影
4、響其他不變,不會影響其他層的實現(xiàn)。層的實現(xiàn)。 軟件分層的優(yōu)點軟件分層的優(yōu)點 l1伸縮性伸縮性 伸縮性指應(yīng)用程序是否能支持更多的用戶。應(yīng)用的層越少,可以伸縮性指應(yīng)用程序是否能支持更多的用戶。應(yīng)用的層越少,可以增加資源(如增加資源(如CPU和內(nèi)存)的地方就越少。層數(shù)越多,可以將每層分和內(nèi)存)的地方就越少。層數(shù)越多,可以將每層分布在不同的機(jī)器上布在不同的機(jī)器上l2可維護(hù)性可維護(hù)性 可維護(hù)性指的是當(dāng)發(fā)生需求變化,只需修改軟件的某一部分,不可維護(hù)性指的是當(dāng)發(fā)生需求變化,只需修改軟件的某一部分,不會影響其他部分的代碼。會影響其他部分的代碼。l3可擴(kuò)展性可擴(kuò)展性 可擴(kuò)展性指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程
5、度。層數(shù)越多,可擴(kuò)展性指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程度。層數(shù)越多,就可以在每個層中提供擴(kuò)展點,不會打破應(yīng)用的整體框架。就可以在每個層中提供擴(kuò)展點,不會打破應(yīng)用的整體框架。l 4可重用性可重用性 可重用性指的是程序代碼沒有冗余,同一個程序能滿足多種需求??芍赜眯灾傅氖浅绦虼a沒有冗余,同一個程序能滿足多種需求。例如,業(yè)務(wù)邏輯層可以被多種表述層共享。例如,業(yè)務(wù)邏輯層可以被多種表述層共享。l5可管理性可管理性 可管理性指的是管理系統(tǒng)的難易程度。將應(yīng)用程序分為多層后,可管理性指的是管理系統(tǒng)的難易程度。將應(yīng)用程序分為多層后,可以將工作分解給不同的開發(fā)小組,從而便于管理。應(yīng)用越復(fù)雜,規(guī)可以將工作分解
6、給不同的開發(fā)小組,從而便于管理。應(yīng)用越復(fù)雜,規(guī)模越大,需要的層就越多。模越大,需要的層就越多。 Java應(yīng)用的持久化層應(yīng)用的持久化層 封裝JDBC API MVC設(shè)計模式與四層應(yīng)用結(jié)構(gòu)的對應(yīng)關(guān)系設(shè)計模式與四層應(yīng)用結(jié)構(gòu)的對應(yīng)關(guān)系 Hibernate是持久化層的一種實現(xiàn)方式是持久化層的一種實現(xiàn)方式Hibernate不和特定的業(yè)務(wù)領(lǐng)域相關(guān),能夠把任意一個Java應(yīng)用與數(shù)據(jù)庫系統(tǒng)連接,它是一種中間件。 2. 軟件的模型軟件的模型l在軟件開發(fā)領(lǐng)域,模型用來表示真實世界的實體。在軟件開發(fā)領(lǐng)域,模型用來表示真實世界的實體。l在軟件開發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)建不同類在軟件開發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)
7、建不同類型的模型:型的模型: 在分析階段,需要創(chuàng)建概念模型。 在設(shè)計階段,需要創(chuàng)建域模型和數(shù)據(jù)模型。 模型之間的關(guān)系模型之間的關(guān)系 概念模型概念模型l概念模型用來模擬問題域中的真實實體。概念模型用來模擬問題域中的真實實體。l概念模型描述了每個實體的概念和屬性,以及實體之概念模型描述了每個實體的概念和屬性,以及實體之間的關(guān)系。間的關(guān)系。l概念模型并不描述實體的行為。概念模型并不描述實體的行為。l不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,他們可以很容易的提出模型中存在的問題,幫助系統(tǒng)他們可以很容易的提出模型中存在的問題,幫助系統(tǒng)分析人員及早對模
8、型進(jìn)行修改。分析人員及早對模型進(jìn)行修改。 購物網(wǎng)站應(yīng)用的概念模型購物網(wǎng)站應(yīng)用的概念模型 實體與實體之間存在三種關(guān)系實體與實體之間存在三種關(guān)系 lCustomer和Order實體: 一對多。一個客戶有多個訂單,而一個訂單只能屬于一個客戶。lCategory和Item實體:多對多。一個商品類別包含多個商品,而一個商品可以屬于多個商品類別。lOrder和Item實體:多對多。一個訂單包含多個商品,而一個商品可以屬于多個訂單。lCustomer和ShoppingCart實體:一對多。一個客戶有多個購物車,而一個購物車只能屬于一個客戶lShoppingCart和Item實體:多對多。一個購物車包含多個商
9、品,而一個商品可以屬于多個購物車。 關(guān)系數(shù)據(jù)模型關(guān)系數(shù)據(jù)模型l 關(guān)系數(shù)據(jù)模型是在概念模型的基礎(chǔ)上建立起來關(guān)系數(shù)據(jù)模型是在概念模型的基礎(chǔ)上建立起來的,用于描述這些關(guān)系數(shù)據(jù)的靜態(tài)結(jié)構(gòu),它由以的,用于描述這些關(guān)系數(shù)據(jù)的靜態(tài)結(jié)構(gòu),它由以下內(nèi)容組成:下內(nèi)容組成: 一個或多個表 表的所有索引 視圖 觸發(fā)器 表與表之間的參照完整性 表的主鍵表的主鍵l在關(guān)系數(shù)據(jù)庫表中,用主鍵來識別記錄并保證每條記錄的惟在關(guān)系數(shù)據(jù)庫表中,用主鍵來識別記錄并保證每條記錄的惟一性。作為主鍵的字段必須滿足以下條件:一性。作為主鍵的字段必須滿足以下條件: 不允許為null。 每條記錄具有惟一的主鍵值,不允許主鍵值重復(fù)。 每條記錄的主鍵
10、值永遠(yuǎn)不會改變。l使用代理主鍵機(jī)制,代理主鍵不具有業(yè)務(wù)含義,不會被改變。使用代理主鍵機(jī)制,代理主鍵不具有業(yè)務(wù)含義,不會被改變。create table CUSTOMER(ID bigint auto_increment primary key, NAME varchar(30);insert into CUSTOMERS(NAME) values(Tom);insert into CUSTOMERS(NAME) values(Jack);select * from CUSTOMER;查詢結(jié)果+-+-+| ID | NAME |+-+-+| 1 | Tom | 2 | Jack |+-+-+ 表
11、與表之間的參照完整性表與表之間的參照完整性 用連接表表示多對多關(guān)系用連接表表示多對多關(guān)系 域模型域模型 l域模型是面向?qū)ο蟮?。在面向?qū)ο笮g(shù)語中,域模型也域模型是面向?qū)ο蟮?。在面向?qū)ο笮g(shù)語中,域模型也可稱為設(shè)計模型。域模型由以下內(nèi)容組成:可稱為設(shè)計模型。域模型由以下內(nèi)容組成: 具有狀態(tài)和行為的域?qū)ο?域?qū)ο笾g的關(guān)系l關(guān)聯(lián)l依賴l聚集l一般化 域?qū)ο笥驅(qū)ο髄域?qū)ο罂梢源順I(yè)務(wù)領(lǐng)域中的人、地點、事物或概念。域?qū)ο罂梢源順I(yè)務(wù)領(lǐng)域中的人、地點、事物或概念。域?qū)ο蠓譃橐韵聨追N:域?qū)ο蠓譃橐韵聨追N: 實體域?qū)ο螅簶I(yè)務(wù)領(lǐng)域的名詞 過程域?qū)ο螅簶I(yè)務(wù)領(lǐng)域的動詞 事件域?qū)ο螅簶I(yè)務(wù)領(lǐng)域中的事件實體域?qū)ο髮嶓w域?qū)ο?/p>
12、l實體對象可以代表人、地點、事物或概念。例如客戶、訂實體對象可以代表人、地點、事物或概念。例如客戶、訂單、商品等作為實體域?qū)ο蟆巍⑸唐返茸鳛閷嶓w域?qū)ο蟆在在Java EE應(yīng)用中,這些名詞可以作為實體應(yīng)用中,這些名詞可以作為實體EJB。l對于普通的對于普通的Java應(yīng)用,這些名詞可以作為包含狀態(tài)和行為應(yīng)用,這些名詞可以作為包含狀態(tài)和行為的的JavaBean。采用。采用JavaBean形式的實體域?qū)ο笠卜Q為形式的實體域?qū)ο笠卜Q為POJO(Plain Old Java Object)。)。l為了使實體域?qū)ο笈c關(guān)系數(shù)據(jù)庫表中記錄對應(yīng),可以為每為了使實體域?qū)ο笈c關(guān)系數(shù)據(jù)庫表中記錄對應(yīng),可以為每個實體
13、域?qū)ο蠓峙湮┮坏膫€實體域?qū)ο蠓峙湮┮坏腛ID(Object Identifier,即對,即對象標(biāo)識符),象標(biāo)識符),OID是關(guān)系數(shù)據(jù)庫表中的主鍵(通常為代理是關(guān)系數(shù)據(jù)庫表中的主鍵(通常為代理主鍵)在實體域?qū)ο笾械牡葍r物。主鍵)在實體域?qū)ο笾械牡葍r物。 過程域?qū)ο筮^程域?qū)ο髄過程域?qū)ο蟠響?yīng)用中的業(yè)務(wù)邏輯或流程。它們通常依賴過程域?qū)ο蟠響?yīng)用中的業(yè)務(wù)邏輯或流程。它們通常依賴于實體域?qū)ο蟆S趯嶓w域?qū)ο?。l可以把業(yè)務(wù)領(lǐng)域中的動詞,例如客戶發(fā)出訂單、登入應(yīng)用可以把業(yè)務(wù)領(lǐng)域中的動詞,例如客戶發(fā)出訂單、登入應(yīng)用等作為過程域?qū)ο?。等作為過程域?qū)ο?。l在在Java EE應(yīng)用中,它們通常作為會話應(yīng)用中,它們通常
14、作為會話EJB或者消息驅(qū)動或者消息驅(qū)動EJB。l在非在非Java EE應(yīng)用中,它們可作為常規(guī)的應(yīng)用中,它們可作為常規(guī)的JavaBean,具,具有管理和控制應(yīng)用的行為。有管理和控制應(yīng)用的行為。l過程域?qū)ο笠部梢該碛袪顟B(tài),例如在過程域?qū)ο笠部梢該碛袪顟B(tài),例如在J2EE應(yīng)用中,會話應(yīng)用中,會話EJB可分為有狀態(tài)和無狀態(tài)兩種類型??煞譃橛袪顟B(tài)和無狀態(tài)兩種類型。 事件事件域?qū)ο笥驅(qū)ο髄事件域?qū)ο蟠響?yīng)用中的一些事件(如異常、警告或事件域?qū)ο蟠響?yīng)用中的一些事件(如異常、警告或超時)。這些事件通常由系統(tǒng)中的某種行為觸發(fā)。超時)。這些事件通常由系統(tǒng)中的某種行為觸發(fā)。l例如在多用戶環(huán)境中,當(dāng)一個客戶端程序更新
15、了某種例如在多用戶環(huán)境中,當(dāng)一個客戶端程序更新了某種實時數(shù)據(jù),服務(wù)器端程序會創(chuàng)建一個事件域?qū)ο?,其實時數(shù)據(jù),服務(wù)器端程序會創(chuàng)建一個事件域?qū)ο?,其他正在瀏覽相同數(shù)據(jù)的客戶端程序能夠接受到這一事他正在瀏覽相同數(shù)據(jù)的客戶端程序能夠接受到這一事件域?qū)ο螅S即同步刷新客戶界面。件域?qū)ο螅S即同步刷新客戶界面。 域?qū)ο笾g的關(guān)系域?qū)ο笾g的關(guān)系l關(guān)聯(lián)關(guān)聯(lián)(Association)l依賴依賴(Dependency)l聚集聚集(Aggregation)l一般化一般化(Generalization) 關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系private Customer customer;public Customer getCus
16、tomer();public void setCustomer(Customer c);private Customer customer;public Customer getCustomer();public void setCustomer(Customer c);private Set orders;public Set getOrders();public void setOrders(Set o);private Set orders;public Set getOrders();public void setOrders(Set o); 依賴關(guān)系依賴關(guān)系 在BusinessSer
17、vice類中訪問Customer類的方法,并且構(gòu)造Customer類的實例 聚集關(guān)系聚集關(guān)系l聚集指的是整體與部分之間的關(guān)系,在實體域?qū)ο笾奂傅氖钦w與部分之間的關(guān)系,在實體域?qū)ο笾g很常見。間很常見。 一般化關(guān)系一般化關(guān)系l一般化指的是類之間的繼承關(guān)系。一般化指的是類之間的繼承關(guān)系。 域?qū)ο蟮某志没拍钣驅(qū)ο蟮某志没拍?域?qū)ο蟮某志没拍钣驅(qū)ο蟮某志没拍頻狹義的理解,狹義的理解,“持久化持久化”僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)庫中庫中l(wèi)廣義的理解,廣義的理解,“持久化持久化”包括和數(shù)據(jù)庫相關(guān)的各種操作:包括和數(shù)據(jù)庫相關(guān)的各種操作: 保存:把域?qū)ο笥谰帽4娴綌?shù)據(jù)
18、庫中。 更新:更新數(shù)據(jù)庫中域?qū)ο蟮臓顟B(tài)。 刪除:從數(shù)據(jù)庫中刪除一個域?qū)ο蟆?加載:根據(jù)特定的OID,把一個域?qū)ο髲臄?shù)據(jù)庫加載到內(nèi)存中。 查詢:根據(jù)特定的查詢條件,把符合查詢條件的一個或多個域?qū)ο髲臄?shù)據(jù)庫加載到內(nèi)存中。 通過通過JDBC API來持久化實體域?qū)ο髞沓志没瘜嶓w域?qū)ο?lJava應(yīng)用訪問數(shù)據(jù)庫的最直接的方式就是直接訪問應(yīng)用訪問數(shù)據(jù)庫的最直接的方式就是直接訪問JDBC API,JDBC是是Java Database Connectivity的縮寫。的縮寫。ljava.sql包提供了包提供了JDBC API。在。在java.sql包中常用的接口包中常用的接口和類包括和類包括: Drive
19、rManager:驅(qū)動程序管理器,負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫連接。 Connection:代表數(shù)據(jù)庫連接。 Statement:負(fù)責(zé)執(zhí)行SQL語句。 PreparedStatement:負(fù)責(zé)執(zhí)行SQL語句,具有預(yù)定義SQL語句的功能。 ResultSet:代表SQL查詢語句的查詢結(jié)果集。 JDBC驅(qū)動程序驅(qū)動程序lJava應(yīng)用必須通過應(yīng)用必須通過JDBC驅(qū)動程序來和特定的數(shù)據(jù)庫系統(tǒng)驅(qū)動程序來和特定的數(shù)據(jù)庫系統(tǒng)連接。連接。 lJDBC驅(qū)動程序由數(shù)據(jù)庫廠商或第三方提供。驅(qū)動程序由數(shù)據(jù)庫廠商或第三方提供。 JDBC API負(fù)責(zé)持久化負(fù)責(zé)持久化Customer對象的對象的BusinessServicelsaveC
20、ustomer():把:把Customer域?qū)ο笥谰帽4娴綌?shù)據(jù)庫域?qū)ο笥谰帽4娴綌?shù)據(jù)庫中。中。lupdateCustomer():更新數(shù)據(jù)庫中:更新數(shù)據(jù)庫中Customer域?qū)ο蟮臓钣驅(qū)ο蟮臓顟B(tài)。態(tài)。ldeleteCustomer():從數(shù)據(jù)庫中刪除一個:從數(shù)據(jù)庫中刪除一個Customer域?qū)τ驅(qū)ο?。象。lloadCustomer():根據(jù)特定的:根據(jù)特定的OID,把一個,把一個Customer域域?qū)ο髲臄?shù)據(jù)庫加載到內(nèi)存中。對象從數(shù)據(jù)庫加載到內(nèi)存中。lfindCustomerByName():根據(jù)特定的客戶姓名,把符合:根據(jù)特定的客戶姓名,把符合查詢條件的查詢條件的Customer域?qū)ο髲臄?shù)據(jù)
21、庫加載到內(nèi)存中。域?qū)ο髲臄?shù)據(jù)庫加載到內(nèi)存中。業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的saveCustomer()方法方法 con=getConnection(); /獲得數(shù)據(jù)庫連接 /開始一個數(shù)據(jù)庫事務(wù) con.setAutoCommit(false); /以下是業(yè)務(wù)邏輯代碼,檢查客戶姓名是否為空 if(customer.getName()=null) throw new BusinessException(客戶姓名不允許為空); /以下是數(shù)據(jù)訪問代碼,持久化Customer對象 /為新的CUSTOMERS記錄分配惟一的ID long customerId=getNex
22、tId(con,CUSTOMERS); /把Customer對象映射為面向關(guān)系的SQL語句 stmt=con.prepareStatement(insert into CUSTOMERS(ID,NAME,AGE) values(?,?,?); stmt.setLong(1,customerId); stmt.setString(2,customer.getName(); stmt.setInt(3,customer.getAge(); stmt.execute(); 業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的saveCustomer()方法方法 Iterator iter
23、ator =customer.getOrders().iterator(); while (iterator.hasNext() ) /以下是業(yè)務(wù)邏輯代碼,檢查訂單編號是否為空 Order order=(Order)iterator.next(); if(order.getOrderNumber()=null) throw new BusinessException(訂單編號不允許為空); /以下是數(shù)據(jù)訪問代碼,級聯(lián)持久化Order對象 /為新的ORDERS記錄分配惟一的ID long orderId=getNextId(con,ORDERS); /把Order對象映射為面向關(guān)系的SQL語句
24、stmt=con.prepareStatement(insert into ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID)values(?,?,?,?); stmt.setLong(1,orderId); stmt.setString(2,order.getOrderNumber(); stmt.setDouble(3,order.getPrice(); stmt.setLong(4,customerId); stmt.execute(); /提交數(shù)據(jù)庫事務(wù) mit(); JDBC編程的缺點編程的缺點l實現(xiàn)業(yè)務(wù)邏輯的代碼和數(shù)據(jù)庫訪問代碼摻雜在一起,使程實現(xiàn)業(yè)
25、務(wù)邏輯的代碼和數(shù)據(jù)庫訪問代碼摻雜在一起,使程序結(jié)構(gòu)不清晰,可讀性差。序結(jié)構(gòu)不清晰,可讀性差。l在程序代碼中嵌入面向關(guān)系的在程序代碼中嵌入面向關(guān)系的SQL語句,使開發(fā)人員不能語句,使開發(fā)人員不能完全運用面向?qū)ο蟮乃季S來編寫程序。完全運用面向?qū)ο蟮乃季S來編寫程序。l業(yè)務(wù)邏輯和關(guān)系數(shù)據(jù)模型綁定,如果關(guān)系數(shù)據(jù)模型發(fā)生變業(yè)務(wù)邏輯和關(guān)系數(shù)據(jù)模型綁定,如果關(guān)系數(shù)據(jù)模型發(fā)生變化,例如修改了化,例如修改了CUSTOMERS表的結(jié)構(gòu),那么必須手工表的結(jié)構(gòu),那么必須手工修改程序代碼中所有相關(guān)的修改程序代碼中所有相關(guān)的SQL語句,這增加了維護(hù)軟件語句,這增加了維護(hù)軟件的難度。的難度。l如果程序代碼中的如果程序代碼中的
26、SQL語句包含語法錯誤,在編譯時不能語句包含語法錯誤,在編譯時不能檢查這種錯誤,只有在運行時才能發(fā)現(xiàn)這種錯誤,這增加檢查這種錯誤,只有在運行時才能發(fā)現(xiàn)這種錯誤,這增加了調(diào)試程序的難度。了調(diào)試程序的難度。 數(shù)據(jù)訪問模式數(shù)據(jù)訪問模式l業(yè)務(wù)邏輯和數(shù)據(jù)訪問耦合業(yè)務(wù)邏輯和數(shù)據(jù)訪問耦合lORM模式模式:在單個組件中負(fù)責(zé)所有實體域?qū)ο蟮某志没?,:在單個組件中負(fù)責(zé)所有實體域?qū)ο蟮某志没庋b數(shù)據(jù)訪問細(xì)節(jié)。封裝數(shù)據(jù)訪問細(xì)節(jié)。 l主動域?qū)ο竽J街鲃佑驅(qū)ο竽J剑河蓪嶓w域?qū)ο蟊旧碡?fù)責(zé)管理自己的持久:由實體域?qū)ο蟊旧碡?fù)責(zé)管理自己的持久化化lJDO模式模式: SUN公司制定的描述對象持久化語義的標(biāo)準(zhǔn)公司制定的描述對象持久
27、化語義的標(biāo)準(zhǔn)API lCMP模式模式:由容器負(fù)責(zé)管理持久化:由容器負(fù)責(zé)管理持久化 ORM模式模式對象對象-關(guān)系映射關(guān)系映射(Object-Relation Mapping)的概念的概念 lORM解決的主要問題就是對象解決的主要問題就是對象-關(guān)系的映射。域模型和關(guān)關(guān)系的映射。域模型和關(guān)系模型都分別建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο的P投挤謩e建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο蟮模P(guān)系數(shù)據(jù)模型是面向關(guān)系的象的,而關(guān)系數(shù)據(jù)模型是面向關(guān)系的.l一般情況下,一個持久化類和一個表對應(yīng),類的每個實例一般情況下,一個持久化類和一個表對應(yīng),類的每個實例對應(yīng)表中的一條記錄。對應(yīng)表中的一條記錄。l域模型
28、與關(guān)系模型之間存在許多不匹配之處。域模型與關(guān)系模型之間存在許多不匹配之處。 域模型與關(guān)系模型之間存在許多不匹配之處域模型與關(guān)系模型之間存在許多不匹配之處l域模型中有繼承關(guān)系,關(guān)系模型不能直接表示繼承關(guān)系域模型中有繼承關(guān)系,關(guān)系模型不能直接表示繼承關(guān)系l域模型中有多對多關(guān)聯(lián)關(guān)系,關(guān)系模型通過連接表來表示域模型中有多對多關(guān)聯(lián)關(guān)系,關(guān)系模型通過連接表來表示多對多關(guān)聯(lián)關(guān)系多對多關(guān)聯(lián)關(guān)系l域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型只有單向參照關(guān)系,域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型只有單向參照關(guān)系,而且總是而且總是many方參照方參照one方。方。l域模型提倡精粒度模型,而關(guān)系模型提倡粗粒度模型域模型提倡精粒度模型
29、,而關(guān)系模型提倡粗粒度模型Category類Item類域模型與關(guān)系模型之間的不匹配舉例域模型與關(guān)系模型之間的不匹配舉例l如果類的粒度比較大,不利于代碼的可重用如果類的粒度比較大,不利于代碼的可重用.Customer類homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcodeEmployee類homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcode增加Room信息Customer類homeRoomcomR
30、oomEmployee類homeRoomcomRoom 域模型與關(guān)系模型之間的不匹配舉例域模型與關(guān)系模型之間的不匹配舉例精粒度域模型和粗粒度關(guān)系模型private Address homeAddress;private Address comAddress; 3.在在Java應(yīng)用中使用應(yīng)用中使用Hibernate的步驟的步驟l在在Java應(yīng)用中使用應(yīng)用中使用Hibernate的步驟需要以下步驟:的步驟需要以下步驟:l(1)創(chuàng)建)創(chuàng)建Hibernate的配置文件的配置文件l(2)創(chuàng)建持久化類)創(chuàng)建持久化類l(3) 創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫Schema l(4)創(chuàng)建對象)創(chuàng)建對象-關(guān)系映射文件關(guān)系映射
31、文件l(5)通過)通過Hibernate API編寫訪問數(shù)據(jù)庫的代碼編寫訪問數(shù)據(jù)庫的代碼Helloapp應(yīng)用的結(jié)構(gòu)應(yīng)用的結(jié)構(gòu)(1)Hibernate的配置文件的配置文件(perties) hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql:/localhost:3306/SAMPLEDB hibernate.connection.user
32、name=roothibernate.connection.password=1234hibernate.show_sql=true Hibernate配置文件的屬性配置文件的屬性 (2)創(chuàng)建持久化類)創(chuàng)建持久化類Customerl持久化類符合持久化類符合JavaBean的規(guī)范,的規(guī)范,包含一些屬性,以及與之對應(yīng)的包含一些屬性,以及與之對應(yīng)的getXXX()和和setXXX()方法。方法。 l持久化類有一個持久化類有一個id屬性,用來惟一屬性,用來惟一標(biāo)識標(biāo)識Customer類的每個對象。在類的每個對象。在面向?qū)ο笮g(shù)語中,這個面向?qū)ο笮g(shù)語中,這個id屬性被稱屬性被稱為對象標(biāo)識符(為對象標(biāo)識符(
33、OID,Object Identifier),通常它都用整數(shù)表),通常它都用整數(shù)表示示 lHibernate要求持久化類必須提供要求持久化類必須提供一個不帶參數(shù)的默認(rèn)構(gòu)造方法一個不帶參數(shù)的默認(rèn)構(gòu)造方法 (3) 創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫Schema create table CUSTOMERS ( ID bigint not null primary key, NAME varchar(15) not null, EMAIL varchar(128) not null, PASSWORD varchar(8) not null, PHONE int , ADDRESS varchar(255), S
34、EX char(1) , IS_MARRIED bit, DESCRIPTION text, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp);blob (二進(jìn)制大數(shù)據(jù))binary large object (4)創(chuàng)建對象)創(chuàng)建對象-關(guān)系映射文件關(guān)系映射文件 Customer.hbm.xml 元素映射元素映射OIDl子元素用來設(shè)定標(biāo)識符生成器。子元素用來設(shè)定標(biāo)識符生成器。Hibernate提供了提供了多種提供了提供了多種內(nèi)置的實現(xiàn)。內(nèi)置的實現(xiàn)。 MySQL中:ID bigint auto_increment primary key 元
35、素映射值類型屬性元素映射值類型屬性lname屬性:屬性:指定持久化類的屬性的名字。指定持久化類的屬性的名字。lcolumn屬性:屬性:指定與類的屬性映射的表的字段名。指定與類的屬性映射的表的字段名。ltype屬性:屬性:指定指定Hibernate映射類型。映射類型。Hibernate映射類型是映射類型是Java類型與類型與SQL類型的橋梁。類型的橋梁。lJava類型:StringSQL類型:varcharHibernate類型:string Java類型、類型、Hibernate映射類型映射類型 以及以及SQL類型之間的對應(yīng)關(guān)系類型之間的對應(yīng)關(guān)系 Customer.hbm.xml配置的對象配置
36、的對象-關(guān)系映射關(guān)系映射 采用采用XML文件來配置對象文件來配置對象-關(guān)系映射的優(yōu)點關(guān)系映射的優(yōu)點lHibernate既不會滲透到上層域模型中,也不會滲透既不會滲透到上層域模型中,也不會滲透到下層數(shù)據(jù)模型中。到下層數(shù)據(jù)模型中。l軟件開發(fā)人員可以獨立設(shè)計域模型,不必強(qiáng)迫遵守任軟件開發(fā)人員可以獨立設(shè)計域模型,不必強(qiáng)迫遵守任何規(guī)范。何規(guī)范。l數(shù)據(jù)庫設(shè)計人員可以獨立設(shè)計數(shù)據(jù)模型,不必強(qiáng)迫遵數(shù)據(jù)庫設(shè)計人員可以獨立設(shè)計數(shù)據(jù)模型,不必強(qiáng)迫遵守任何規(guī)范。守任何規(guī)范。l對象對象-關(guān)系映射不依賴于任何程序代碼,如果需要修改關(guān)系映射不依賴于任何程序代碼,如果需要修改對象對象-關(guān)系映射,只需修改關(guān)系映射,只需修改XM
37、L文件,不需要修改任何文件,不需要修改任何程序,提高了軟件的靈活性,并且使維護(hù)更加方便。程序,提高了軟件的靈活性,并且使維護(hù)更加方便。 (5)通過)通過Hibernate API操縱數(shù)據(jù)庫操縱數(shù)據(jù)庫 創(chuàng)建創(chuàng)建BusinessService類類 l初始化初始化Hibernatel通過通過Hibernate的的Session接口操縱數(shù)據(jù)庫接口操縱數(shù)據(jù)庫: 保存Customer對象 更新Customer對象 加載Customer對象 刪除Customer對象 檢索Customer對象 Hibernate的初始化的初始化 static try / 根據(jù)默認(rèn)位置的根據(jù)默認(rèn)位置的Hibernate配置文件
38、的配置信息,創(chuàng)建一個配置文件的配置信息,創(chuàng)建一個 /Configuration實例實例 Configuration config = new Configuration(); config.addClass(Customer.class); / 創(chuàng)建創(chuàng)建SessionFactory實例實例 */ sessionFactory = config.buildSessionFactory(); catch(Exception e)e.printStackTrace(); Hibernate的初始化的初始化 l(1)創(chuàng)建一個)創(chuàng)建一個Configuration類的實例,類的實例,Configurati
39、on類的構(gòu)造方類的構(gòu)造方法把默認(rèn)文件路徑下的法把默認(rèn)文件路徑下的perties配置文件中的配置信息配置文件中的配置信息讀入到內(nèi)存:讀入到內(nèi)存: Configuration config = new Configuration();l(2)調(diào)用)調(diào)用Configuration類的類的addClass(Customer.class)方法:方法: config.addClass(Customer.class); 該方法把默認(rèn)文件路徑下的該方法把默認(rèn)文件路徑下的Customer.hbm.xml文件中的映射信息文件中的映射信息讀入到內(nèi)存中。讀入到內(nèi)存中。l(3)調(diào)用)調(diào)用Con
40、figuration類的類的buildSessionFactory()方法:方法: sessionFactory = config.buildSessionFactory(); SessionFactory接口接口 l一個一個SessionFactory實例對應(yīng)一個數(shù)據(jù)存儲源,應(yīng)用從實例對應(yīng)一個數(shù)據(jù)存儲源,應(yīng)用從SessionFactory中獲得中獲得Session實例。實例。SessionFactory有以下特點:有以下特點: 它是線程安全的,這意味著它的同一個實例可以被應(yīng)用的多個線程共享。 它是重量級的,這意味著不能隨意創(chuàng)建或銷毀它的實例。如果應(yīng)用只訪問一個數(shù)據(jù)庫,只需要創(chuàng)建一個Sessi
41、onFactory實例,在應(yīng)用初始化的時候創(chuàng)建該實例。如果應(yīng)用同時訪問多個數(shù)據(jù)庫,則需要為每個數(shù)據(jù)庫創(chuàng)建一個單獨的SessionFactory實例。 Session接口接口 lSession接口是接口是Hibernate應(yīng)用使用最廣泛的接口。應(yīng)用使用最廣泛的接口。lSession也被稱為持久化管理器,它提供了和持久化相關(guān)也被稱為持久化管理器,它提供了和持久化相關(guān)的操作,如添加、更新、刪除、加載和查詢對象。的操作,如添加、更新、刪除、加載和查詢對象。lSession有以下特點:有以下特點: 不是線程安全的,因此在設(shè)計軟件架構(gòu)時,應(yīng)該避免多個線程共享同一個Session實例。 Session實例是
42、輕量級的,所謂輕量級是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建或銷毀Session對象,例如為每個客戶請求分配單獨的Session實例,或者為每個工作單元分配單獨的Session實例。 Session接口操縱數(shù)據(jù)庫的方法接口操縱數(shù)據(jù)庫的方法lSession接口提供了操縱數(shù)據(jù)庫的各種方法,如:接口提供了操縱數(shù)據(jù)庫的各種方法,如: save()方法:把Java對象保存數(shù)據(jù)庫中。 update()方法:更新數(shù)據(jù)庫中的Java對象。 delete()方法:把Java對象從數(shù)據(jù)庫中刪除。 load()或get()方法:從數(shù)據(jù)庫中加載Java對象。 find()方法:從數(shù)據(jù)庫中查
43、詢Java對象。在 Hibernate3中,該方法已經(jīng)被廢棄。 Hibernate提供了專門的Query查詢接口。 用用Session來執(zhí)行事務(wù)的流程來執(zhí)行事務(wù)的流程 Session session = factory.openSession(); Transaction tx; try /開始一個事務(wù)開始一個事務(wù) tx = session.beginTransaction(); /執(zhí)行事務(wù)執(zhí)行事務(wù) . /提交事務(wù)提交事務(wù) mit(); catch (Exception e) /如果出現(xiàn)異常,就撤銷事務(wù)如果出現(xiàn)異常,就撤銷事務(wù) if (tx!=null) tx.rollback(); thro
44、w e; finally /不管事務(wù)執(zhí)行成功與否,最后都關(guān)閉不管事務(wù)執(zhí)行成功與否,最后都關(guān)閉Session session.close(); 正常執(zhí)行數(shù)據(jù)庫事務(wù)的流程正常執(zhí)行數(shù)據(jù)庫事務(wù)的流程 saveCustomer()方法方法l該方法調(diào)用該方法調(diào)用Session的的save()方法,把方法,把Customer對象持久化到數(shù)據(jù)庫中。對象持久化到數(shù)據(jù)庫中。 tx = session.beginTransaction(); session.save(customer); mit();l當(dāng)運行當(dāng)運行session.save()方法時,方法時,Hibernate執(zhí)行以下執(zhí)行以下SQL語句:語句: in
45、sert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED,DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME) values(1,Tom,1234,55556666,Shanghai,M,0,I am very honest., ,1980-05-06,null)l在在test()方法中并沒有設(shè)置方法中并沒有設(shè)置Customer對象的對象的id屬性,屬性,Hibernate會根據(jù)映射文件的會根據(jù)映射文件的配置,采用配置,采用increment標(biāo)識符生成器
46、自動以遞增的方式為標(biāo)識符生成器自動以遞增的方式為OID賦值。在賦值。在Customer.hbm.xml文件中相關(guān)的映射代碼如下:文件中相關(guān)的映射代碼如下: findAllCustomers()方法方法l該方法通過該方法通過Query接口查詢所有的接口查詢所有的Customer對象。對象。 tx = session.beginTransaction(); /開始一個事務(wù)開始一個事務(wù)Query query=session.createQuery(from Customer as c order by asc);List customers=query.list();for (Iter
47、ator it = customers.iterator(); it.hasNext();) printCustomer(context,out,(Customer) it.next();mit(); /提交事務(wù)提交事務(wù)lSession的的createQuery()方法的參數(shù)方法的參數(shù)“from Customer as c order by asc”使用的是使用的是Hibernate查詢語言。運行查詢語言。運行Query.list()方法時,方法時, Hibernate執(zhí)行以下執(zhí)行以下SQL語句:語句: select * from CUSTOMERS order by NAME
48、asc;HQL查詢語句Hibernate Query Language loadAndUpdateCustomer ()方法方法l該方法調(diào)用該方法調(diào)用Session的的get()方法,加載方法,加載Customer對象,然后再修改對象,然后再修改Customer對象的屬性。對象的屬性。 tx = session.beginTransaction(); Customer c=(Customer)session.get(Customer.class,customer_id); c.setAddress(address); /修改內(nèi)存中修改內(nèi)存中Customer對象的對象的address屬性屬性 m
49、it();l以上代碼先調(diào)用以上代碼先調(diào)用Session的的get()方法,它按照參數(shù)指定的方法,它按照參數(shù)指定的OID從數(shù)據(jù)庫中檢從數(shù)據(jù)庫中檢索出匹配的索出匹配的Customer對象,對象,Hibernate會執(zhí)行以下會執(zhí)行以下SQL語句:語句: select * from CUSTOMERS where ID=1;lloadAndUpdateCustomer()方法接著修改方法接著修改Customer對象的對象的address屬性屬性。那么,。那么,Hibernate會不會同步更新數(shù)據(jù)庫中相應(yīng)的會不會同步更新數(shù)據(jù)庫中相應(yīng)的CUSTOMERS表的記表的記錄呢?答案是肯定的。錄呢?答案是肯定的。Hibernate采用臟檢查機(jī)制,按照內(nèi)存中的采用臟檢查機(jī)制,按照內(nèi)存中的Customer對象的狀態(tài)的變化,來同步更新數(shù)據(jù)庫中相關(guān)的數(shù)據(jù),對象的狀態(tài)的變化,來同步更新數(shù)據(jù)庫中相關(guān)的數(shù)據(jù),Hibernate會執(zhí)行以下會執(zhí)行以下SQL語句:語句: update CUSTOMERS set NAME=Tom,EMAIL=TADDRESS=Beijing where ID=1;
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同和技術(shù)承包
- 個人勞務(wù)分包合同簡本
- 綠化護(hù)坡施工方案
- 產(chǎn)品測評表-產(chǎn)品用戶反饋收集
- 生物化學(xué)分析實驗技術(shù)練習(xí)題集
- 商場餐飲經(jīng)營商鋪租賃合同
- 農(nóng)民宅基地轉(zhuǎn)讓合同
- 臨汾低溫冷庫施工方案
- 杭州室內(nèi)球場施工方案
- 鋁合金飛廊及蓋板施工方案
- 高中通用技術(shù)人教高二下冊目錄新型抽紙盒-
- 畜牧場經(jīng)營管理
- 課程思政示范課程申報書(測繪基礎(chǔ))
- ALeader 阿立得 ALD515使用手冊
- 神華陜西國華錦界電廠三期工程環(huán)評報告
- 飛行員航空知識手冊
- GB/Z 19848-2005液壓元件從制造到安裝達(dá)到和控制清潔度的指南
- GB/T 34936-2017光伏發(fā)電站匯流箱技術(shù)要求
- GB/T 12618.4-2006開口型平圓頭抽芯鉚釘51級
- 紅金大氣商務(wù)風(fēng)領(lǐng)導(dǎo)歡迎會PPT通用模板
- 學(xué)前教育學(xué)00383-歷年真題-試卷
評論
0/150
提交評論