第11講連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁---Hibernate_第1頁(yè)
第11講連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁---Hibernate_第2頁(yè)
第11講連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁---Hibernate_第3頁(yè)
第11講連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁---Hibernate_第4頁(yè)
第11講連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁---Hibernate_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 補(bǔ)充:補(bǔ)充: 連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁- 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ù)庫(kù))創(chuàng)建數(shù)據(jù)庫(kù)SchemaSchemal(4 4)創(chuàng)建對(duì)象)創(chuàng)建對(duì)象- -關(guān)系映射文件關(guān)系映射文件 (5)5)通過(guò)通過(guò)Hibernate APIHibernate API

2、操縱數(shù)據(jù)庫(kù)操縱數(shù)據(jù)庫(kù)Java對(duì)象持久化技術(shù)概述對(duì)象持久化技術(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ū)ο蟮某志没拍頻直接通過(guò)直接通過(guò)JDBC API來(lái)持久化實(shí)來(lái)持久化實(shí)體域?qū)ο篌w域?qū)ο髄ORM簡(jiǎn)介簡(jiǎn)介l實(shí)體域?qū)ο蟮钠渌志没J綄?shí)體域?qū)ο蟮钠渌志没J?主動(dòng)域?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ù)庫(kù)層l三層應(yīng)用三層應(yīng)用 表述層 業(yè)務(wù)邏輯層

3、 數(shù)據(jù)庫(kù)層l四層應(yīng)用四層應(yīng)用 表述層 業(yè)務(wù)邏輯層 持久化層 數(shù)據(jù)庫(kù)層lN層應(yīng)用層應(yīng)用 軟件層的特征軟件層的特征 l 層與層之間存在自上而下層與層之間存在自上而下的依賴關(guān)系,即上層組件會(huì)訪的依賴關(guān)系,即上層組件會(huì)訪問下層組件的問下層組件的API,而下層組件,而下層組件不應(yīng)該依賴上層組件。例如:不應(yīng)該依賴上層組件。例如:表述層依賴于業(yè)務(wù)邏輯層,而表述層依賴于業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層依賴于數(shù)據(jù)庫(kù)層。業(yè)務(wù)邏輯層依賴于數(shù)據(jù)庫(kù)層。l 每個(gè)層對(duì)上層公開每個(gè)層對(duì)上層公開API,但具體的實(shí)現(xiàn)細(xì)節(jié)對(duì)外透明。但具體的實(shí)現(xiàn)細(xì)節(jié)對(duì)外透明。當(dāng)某一層的實(shí)現(xiàn)發(fā)生變化,只當(dāng)某一層的實(shí)現(xiàn)發(fā)生變化,只要它的要它的API不變,不會(huì)影

4、響其他不變,不會(huì)影響其他層的實(shí)現(xiàn)。層的實(shí)現(xiàn)。 軟件分層的優(yōu)點(diǎn)軟件分層的優(yōu)點(diǎn) 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ā)生需求變化,只需修改軟件的某一部分,不會(huì)影響其他部分的代碼。會(huì)影響其他部分的代碼。l3可擴(kuò)展性可擴(kuò)展性 可擴(kuò)展性指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程

5、度。層數(shù)越多,可擴(kuò)展性指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程度。層數(shù)越多,就可以在每個(gè)層中提供擴(kuò)展點(diǎn),不會(huì)打破應(yīng)用的整體框架。就可以在每個(gè)層中提供擴(kuò)展點(diǎn),不會(huì)打破應(yīng)用的整體框架。l 4可重用性可重用性 可重用性指的是程序代碼沒有冗余,同一個(gè)程序能滿足多種需求。可重用性指的是程序代碼沒有冗余,同一個(gè)程序能滿足多種需求。例如,業(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è)計(jì)模式與四層應(yīng)用結(jié)構(gòu)的對(duì)應(yīng)關(guān)系設(shè)計(jì)模式與四層應(yīng)用結(jié)構(gòu)的對(duì)應(yīng)關(guān)系 Hibernate是持久化層的一種實(shí)現(xiàn)方式是持久化層的一種實(shí)現(xiàn)方式Hibernate不和特定的業(yè)務(wù)領(lǐng)域相關(guān),能夠把任意一個(gè)Java應(yīng)用與數(shù)據(jù)庫(kù)系統(tǒng)連接,它是一種中間件。 2. 軟件的模型軟件的模型l在軟件開發(fā)領(lǐng)域,模型用來(lái)表示真實(shí)世界的實(shí)體。在軟件開發(fā)領(lǐng)域,模型用來(lái)表示真實(shí)世界的實(shí)體。l在軟件開發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)建不同類在軟件開發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)

7、建不同類型的模型:型的模型: 在分析階段,需要?jiǎng)?chuàng)建概念模型。 在設(shè)計(jì)階段,需要?jiǎng)?chuàng)建域模型和數(shù)據(jù)模型。 模型之間的關(guān)系模型之間的關(guān)系 概念模型概念模型l概念模型用來(lái)模擬問題域中的真實(shí)實(shí)體。概念模型用來(lái)模擬問題域中的真實(shí)實(shí)體。l概念模型描述了每個(gè)實(shí)體的概念和屬性,以及實(shí)體之概念模型描述了每個(gè)實(shí)體的概念和屬性,以及實(shí)體之間的關(guān)系。間的關(guān)系。l概念模型并不描述實(shí)體的行為。概念模型并不描述實(shí)體的行為。l不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,他們可以很容易的提出模型中存在的問題,幫助系統(tǒng)他們可以很容易的提出模型中存在的問題,幫助系統(tǒng)分析人員及早對(duì)模

8、型進(jìn)行修改。分析人員及早對(duì)模型進(jìn)行修改。 購(gòu)物網(wǎng)站應(yīng)用的概念模型購(gòu)物網(wǎng)站應(yīng)用的概念模型 實(shí)體與實(shí)體之間存在三種關(guān)系實(shí)體與實(shí)體之間存在三種關(guān)系 lCustomer和Order實(shí)體: 一對(duì)多。一個(gè)客戶有多個(gè)訂單,而一個(gè)訂單只能屬于一個(gè)客戶。lCategory和Item實(shí)體:多對(duì)多。一個(gè)商品類別包含多個(gè)商品,而一個(gè)商品可以屬于多個(gè)商品類別。lOrder和Item實(shí)體:多對(duì)多。一個(gè)訂單包含多個(gè)商品,而一個(gè)商品可以屬于多個(gè)訂單。lCustomer和ShoppingCart實(shí)體:一對(duì)多。一個(gè)客戶有多個(gè)購(gòu)物車,而一個(gè)購(gòu)物車只能屬于一個(gè)客戶lShoppingCart和Item實(shí)體:多對(duì)多。一個(gè)購(gòu)物車包含多個(gè)商

9、品,而一個(gè)商品可以屬于多個(gè)購(gòu)物車。 關(guān)系數(shù)據(jù)模型關(guān)系數(shù)據(jù)模型l 關(guān)系數(shù)據(jù)模型是在概念模型的基礎(chǔ)上建立起來(lái)關(guān)系數(shù)據(jù)模型是在概念模型的基礎(chǔ)上建立起來(lái)的,用于描述這些關(guān)系數(shù)據(jù)的靜態(tài)結(jié)構(gòu),它由以的,用于描述這些關(guān)系數(shù)據(jù)的靜態(tài)結(jié)構(gòu),它由以下內(nèi)容組成:下內(nèi)容組成: 一個(gè)或多個(gè)表 表的所有索引 視圖 觸發(fā)器 表與表之間的參照完整性 表的主鍵表的主鍵l在關(guān)系數(shù)據(jù)庫(kù)表中,用主鍵來(lái)識(shí)別記錄并保證每條記錄的惟在關(guān)系數(shù)據(jù)庫(kù)表中,用主鍵來(lái)識(shí)別記錄并保證每條記錄的惟一性。作為主鍵的字段必須滿足以下條件:一性。作為主鍵的字段必須滿足以下條件: 不允許為null。 每條記錄具有惟一的主鍵值,不允許主鍵值重復(fù)。 每條記錄的主鍵

10、值永遠(yuǎn)不會(huì)改變。l使用代理主鍵機(jī)制,代理主鍵不具有業(yè)務(wù)含義,不會(huì)被改變。使用代理主鍵機(jī)制,代理主鍵不具有業(yè)務(wù)含義,不會(huì)被改變。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、與表之間的參照完整性表與表之間的參照完整性 用連接表表示多對(duì)多關(guān)系用連接表表示多對(duì)多關(guān)系 域模型域模型 l域模型是面向?qū)ο蟮?。在面向?qū)ο笮g(shù)語(yǔ)中,域模型也域模型是面向?qū)ο蟮摹T诿嫦驅(qū)ο笮g(shù)語(yǔ)中,域模型也可稱為設(shè)計(jì)模型。域模型由以下內(nèi)容組成:可稱為設(shè)計(jì)模型。域模型由以下內(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)域中的人、地點(diǎn)、事物或概念。域?qū)ο罂梢源順I(yè)務(wù)領(lǐng)域中的人、地點(diǎn)、事物或概念。域?qū)ο蠓譃橐韵聨追N:域?qū)ο蠓譃橐韵聨追N: 實(shí)體域?qū)ο螅簶I(yè)務(wù)領(lǐng)域的名詞 過(guò)程域?qū)ο螅簶I(yè)務(wù)領(lǐng)域的動(dòng)詞 事件域?qū)ο螅簶I(yè)務(wù)領(lǐng)域中的事件實(shí)體域?qū)ο髮?shí)體域?qū)ο?/p>

12、l實(shí)體對(duì)象可以代表人、地點(diǎn)、事物或概念。例如客戶、訂實(shí)體對(duì)象可以代表人、地點(diǎn)、事物或概念。例如客戶、訂單、商品等作為實(shí)體域?qū)ο?。單、商品等作為?shí)體域?qū)ο蟆在在Java EE應(yīng)用中,這些名詞可以作為實(shí)體應(yīng)用中,這些名詞可以作為實(shí)體EJB。l對(duì)于普通的對(duì)于普通的Java應(yīng)用,這些名詞可以作為包含狀態(tài)和行為應(yīng)用,這些名詞可以作為包含狀態(tài)和行為的的JavaBean。采用。采用JavaBean形式的實(shí)體域?qū)ο笠卜Q為形式的實(shí)體域?qū)ο笠卜Q為POJO(Plain Old Java Object)。)。l為了使實(shí)體域?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)表中記錄對(duì)應(yīng),可以為每為了使實(shí)體域?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)表中記錄對(duì)應(yīng),可以為每個(gè)實(shí)體

13、域?qū)ο蠓峙湮┮坏膫€(gè)實(shí)體域?qū)ο蠓峙湮┮坏腛ID(Object Identifier,即對(duì),即對(duì)象標(biāo)識(shí)符),象標(biāo)識(shí)符),OID是關(guān)系數(shù)據(jù)庫(kù)表中的主鍵(通常為代理是關(guān)系數(shù)據(jù)庫(kù)表中的主鍵(通常為代理主鍵)在實(shí)體域?qū)ο笾械牡葍r(jià)物。主鍵)在實(shí)體域?qū)ο笾械牡葍r(jià)物。 過(guò)程域?qū)ο筮^(guò)程域?qū)ο髄過(guò)程域?qū)ο蟠響?yīng)用中的業(yè)務(wù)邏輯或流程。它們通常依賴過(guò)程域?qū)ο蟠響?yīng)用中的業(yè)務(wù)邏輯或流程。它們通常依賴于實(shí)體域?qū)ο蟆S趯?shí)體域?qū)ο?。l可以把業(yè)務(wù)領(lǐng)域中的動(dòng)詞,例如客戶發(fā)出訂單、登入應(yīng)用可以把業(yè)務(wù)領(lǐng)域中的動(dòng)詞,例如客戶發(fā)出訂單、登入應(yīng)用等作為過(guò)程域?qū)ο?。等作為過(guò)程域?qū)ο?。l在在Java EE應(yīng)用中,它們通常作為會(huì)話應(yīng)用中,它們通常

14、作為會(huì)話EJB或者消息驅(qū)動(dòng)或者消息驅(qū)動(dòng)EJB。l在非在非Java EE應(yīng)用中,它們可作為常規(guī)的應(yīng)用中,它們可作為常規(guī)的JavaBean,具,具有管理和控制應(yīng)用的行為。有管理和控制應(yīng)用的行為。l過(guò)程域?qū)ο笠部梢該碛袪顟B(tài),例如在過(guò)程域?qū)ο笠部梢該碛袪顟B(tài),例如在J2EE應(yīng)用中,會(huì)話應(yīng)用中,會(huì)話EJB可分為有狀態(tài)和無(wú)狀態(tài)兩種類型??煞譃橛袪顟B(tài)和無(wú)狀態(tài)兩種類型。 事件事件域?qū)ο笥驅(qū)ο髄事件域?qū)ο蟠響?yīng)用中的一些事件(如異常、警告或事件域?qū)ο蟠響?yīng)用中的一些事件(如異常、警告或超時(shí))。這些事件通常由系統(tǒng)中的某種行為觸發(fā)。超時(shí))。這些事件通常由系統(tǒng)中的某種行為觸發(fā)。l例如在多用戶環(huán)境中,當(dāng)一個(gè)客戶端程序更新

15、了某種例如在多用戶環(huán)境中,當(dāng)一個(gè)客戶端程序更新了某種實(shí)時(shí)數(shù)據(jù),服務(wù)器端程序會(huì)創(chuàng)建一個(gè)事件域?qū)ο螅鋵?shí)時(shí)數(shù)據(jù),服務(wù)器端程序會(huì)創(chuàng)建一個(gè)事件域?qū)ο螅渌跒g覽相同數(shù)據(jù)的客戶端程序能夠接受到這一事他正在瀏覽相同數(shù)據(jù)的客戶端程序能夠接受到這一事件域?qū)ο?,隨即同步刷新客戶界面。件域?qū)ο?,隨即同步刷新客戶界面。 域?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類的實(shí)例 聚集關(guān)系聚集關(guān)系l聚集指的是整體與部分之間的關(guān)系,在實(shí)體域?qū)ο笾奂傅氖钦w與部分之間的關(guān)系,在實(shí)體域?qū)ο笾g很常見。間很常見。 一般化關(guān)系一般化關(guān)系l一般化指的是類之間的繼承關(guān)系。一般化指的是類之間的繼承關(guān)系。 域?qū)ο蟮某志没拍钣驅(qū)ο蟮某志没拍?域?qū)ο蟮某志没拍钣驅(qū)ο蟮某志没拍頻狹義的理解,狹義的理解,“持久化持久化”僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)中庫(kù)中l(wèi)廣義的理解,廣義的理解,“持久化持久化”包括和數(shù)據(jù)庫(kù)相關(guān)的各種操作:包括和數(shù)據(jù)庫(kù)相關(guān)的各種操作: 保存:把域?qū)ο笥谰帽4娴綌?shù)據(jù)

18、庫(kù)中。 更新:更新數(shù)據(jù)庫(kù)中域?qū)ο蟮臓顟B(tài)。 刪除:從數(shù)據(jù)庫(kù)中刪除一個(gè)域?qū)ο蟆?加載:根據(jù)特定的OID,把一個(gè)域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。 查詢:根據(jù)特定的查詢條件,把符合查詢條件的一個(gè)或多個(gè)域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。 通過(guò)通過(guò)JDBC API來(lái)持久化實(shí)體域?qū)ο髞?lái)持久化實(shí)體域?qū)ο?lJava應(yīng)用訪問數(shù)據(jù)庫(kù)的最直接的方式就是直接訪問應(yīng)用訪問數(shù)據(jù)庫(kù)的最直接的方式就是直接訪問JDBC API,JDBC是是Java Database Connectivity的縮寫。的縮寫。ljava.sql包提供了包提供了JDBC API。在。在java.sql包中常用的接口包中常用的接口和類包括和類包括: Drive

19、rManager:驅(qū)動(dòng)程序管理器,負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫(kù)連接。 Connection:代表數(shù)據(jù)庫(kù)連接。 Statement:負(fù)責(zé)執(zhí)行SQL語(yǔ)句。 PreparedStatement:負(fù)責(zé)執(zhí)行SQL語(yǔ)句,具有預(yù)定義SQL語(yǔ)句的功能。 ResultSet:代表SQL查詢語(yǔ)句的查詢結(jié)果集。 JDBC驅(qū)動(dòng)程序驅(qū)動(dòng)程序lJava應(yīng)用必須通過(guò)應(yīng)用必須通過(guò)JDBC驅(qū)動(dòng)程序來(lái)和特定的數(shù)據(jù)庫(kù)系統(tǒng)驅(qū)動(dòng)程序來(lái)和特定的數(shù)據(jù)庫(kù)系統(tǒng)連接。連接。 lJDBC驅(qū)動(dòng)程序由數(shù)據(jù)庫(kù)廠商或第三方提供。驅(qū)動(dòng)程序由數(shù)據(jù)庫(kù)廠商或第三方提供。 JDBC API負(fù)責(zé)持久化負(fù)責(zé)持久化Customer對(duì)象的對(duì)象的BusinessServicelsaveC

20、ustomer():把:把Customer域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)中。中。lupdateCustomer():更新數(shù)據(jù)庫(kù)中:更新數(shù)據(jù)庫(kù)中Customer域?qū)ο蟮臓钣驅(qū)ο蟮臓顟B(tài)。態(tài)。ldeleteCustomer():從數(shù)據(jù)庫(kù)中刪除一個(gè):從數(shù)據(jù)庫(kù)中刪除一個(gè)Customer域?qū)τ驅(qū)ο?。象。lloadCustomer():根據(jù)特定的:根據(jù)特定的OID,把一個(gè),把一個(gè)Customer域域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中。lfindCustomerByName():根據(jù)特定的客戶姓名,把符合:根據(jù)特定的客戶姓名,把符合查詢條件的查詢條件的Customer域?qū)ο髲臄?shù)據(jù)

21、庫(kù)加載到內(nèi)存中。域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問代碼耦合的saveCustomer()方法方法 con=getConnection(); /獲得數(shù)據(jù)庫(kù)連接 /開始一個(gè)數(shù)據(jù)庫(kù)事務(wù) con.setAutoCommit(false); /以下是業(yè)務(wù)邏輯代碼,檢查客戶姓名是否為空 if(customer.getName()=null) throw new BusinessException(客戶姓名不允許為空); /以下是數(shù)據(jù)訪問代碼,持久化Customer對(duì)象 /為新的CUSTOMERS記錄分配惟一的ID long customerId=getNex

22、tId(con,CUSTOMERS); /把Customer對(duì)象映射為面向關(guān)系的SQL語(yǔ)句 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ù)邏輯代碼,檢查訂單編號(hào)是否為空 Order order=(Order)iterator.next(); if(order.getOrderNumber()=null) throw new BusinessException(訂單編號(hào)不允許為空); /以下是數(shù)據(jù)訪問代碼,級(jí)聯(lián)持久化Order對(duì)象 /為新的ORDERS記錄分配惟一的ID long orderId=getNextId(con,ORDERS); /把Order對(duì)象映射為面向關(guān)系的SQL語(yǔ)句

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ù)庫(kù)事務(wù) mit(); JDBC編程的缺點(diǎn)編程的缺點(diǎn)l實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼和數(shù)據(jù)庫(kù)訪問代碼摻雜在一起,使程實(shí)現(xiàn)業(yè)

25、務(wù)邏輯的代碼和數(shù)據(jù)庫(kù)訪問代碼摻雜在一起,使程序結(jié)構(gòu)不清晰,可讀性差。序結(jié)構(gòu)不清晰,可讀性差。l在程序代碼中嵌入面向關(guān)系的在程序代碼中嵌入面向關(guān)系的SQL語(yǔ)句,使開發(fā)人員不能語(yǔ)句,使開發(fā)人員不能完全運(yùn)用面向?qū)ο蟮乃季S來(lái)編寫程序。完全運(yùn)用面向?qū)ο蟮乃季S來(lái)編寫程序。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語(yǔ)句,這增加了維護(hù)軟件語(yǔ)句,這增加了維護(hù)軟件的難度。的難度。l如果程序代碼中的如果程序代碼中的

26、SQL語(yǔ)句包含語(yǔ)法錯(cuò)誤,在編譯時(shí)不能語(yǔ)句包含語(yǔ)法錯(cuò)誤,在編譯時(shí)不能檢查這種錯(cuò)誤,只有在運(yùn)行時(shí)才能發(fā)現(xiàn)這種錯(cuò)誤,這增加檢查這種錯(cuò)誤,只有在運(yùn)行時(shí)才能發(fā)現(xiàn)這種錯(cuò)誤,這增加了調(diào)試程序的難度。了調(diào)試程序的難度。 數(shù)據(jù)訪問模式數(shù)據(jù)訪問模式l業(yè)務(wù)邏輯和數(shù)據(jù)訪問耦合業(yè)務(wù)邏輯和數(shù)據(jù)訪問耦合lORM模式模式:在單個(gè)組件中負(fù)責(zé)所有實(shí)體域?qū)ο蟮某志没涸趩蝹€(gè)組件中負(fù)責(zé)所有實(shí)體域?qū)ο蟮某志没?,封裝數(shù)據(jù)訪問細(xì)節(jié)。封裝數(shù)據(jù)訪問細(xì)節(jié)。 l主動(dòng)域?qū)ο竽J街鲃?dòng)域?qū)ο竽J剑河蓪?shí)體域?qū)ο蟊旧碡?fù)責(zé)管理自己的持久:由實(shí)體域?qū)ο蟊旧碡?fù)責(zé)管理自己的持久化化lJDO模式模式: SUN公司制定的描述對(duì)象持久化語(yǔ)義的標(biāo)準(zhǔn)公司制定的描述對(duì)象持久

27、化語(yǔ)義的標(biāo)準(zhǔn)API lCMP模式模式:由容器負(fù)責(zé)管理持久化:由容器負(fù)責(zé)管理持久化 ORM模式模式對(duì)象對(duì)象-關(guān)系映射關(guān)系映射(Object-Relation Mapping)的概念的概念 lORM解決的主要問題就是對(duì)象解決的主要問題就是對(duì)象-關(guān)系的映射。域模型和關(guān)關(guān)系的映射。域模型和關(guān)系模型都分別建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο的P投挤謩e建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο蟮?,而關(guān)系數(shù)據(jù)模型是面向關(guān)系的象的,而關(guān)系數(shù)據(jù)模型是面向關(guān)系的.l一般情況下,一個(gè)持久化類和一個(gè)表對(duì)應(yīng),類的每個(gè)實(shí)例一般情況下,一個(gè)持久化類和一個(gè)表對(duì)應(yīng),類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄。對(duì)應(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域模型中有多對(duì)多關(guān)聯(lián)關(guān)系,關(guān)系模型通過(guò)連接表來(lái)表示域模型中有多對(duì)多關(guān)聯(lián)關(guān)系,關(guān)系模型通過(guò)連接表來(lái)表示多對(duì)多關(guān)聯(lián)關(guān)系多對(duì)多關(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ù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)Schema l(4)創(chuàng)建對(duì)象創(chuàng)建對(duì)象-關(guān)系映射文件關(guān)系映射文件l

31、(5)通過(guò)通過(guò)Hibernate API編寫訪問數(shù)據(jù)庫(kù)的代碼編寫訪問數(shù)據(jù)庫(kù)的代碼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.username

32、=roothibernate.connection.password=1234hibernate.show_sql=true Hibernate配置文件的屬性配置文件的屬性 (2)創(chuàng)建持久化類)創(chuàng)建持久化類Customerl持久化類符合持久化類符合JavaBean的規(guī)范,的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的包含一些屬性,以及與之對(duì)應(yīng)的getXXX()和和setXXX()方法。方法。 l持久化類有一個(gè)持久化類有一個(gè)id屬性,用來(lái)惟一屬性,用來(lái)惟一標(biāo)識(shí)標(biāo)識(shí)Customer類的每個(gè)對(duì)象類的每個(gè)對(duì)象。在。在面向?qū)ο笮g(shù)語(yǔ)中,這個(gè)面向?qū)ο笮g(shù)語(yǔ)中,這個(gè)id屬性被稱屬性被稱為對(duì)象標(biāo)識(shí)符(為對(duì)象標(biāo)識(shí)符(OID,

33、Object Identifier),通常它都用整數(shù)表),通常它都用整數(shù)表示示 lHibernate要求持久化類必須提供要求持久化類必須提供一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造方法一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造方法 (3) 創(chuàng)建數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù)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), SEX c

34、har(1) , IS_MARRIED bit, DESCRIPTION text, IMAGE blob, BIRTHDAY date, REGISTERED_TIME timestamp);blob (二進(jìn)制大數(shù)據(jù))binary large object (4)創(chuàng)建對(duì)象)創(chuàng)建對(duì)象-關(guān)系映射文件關(guān)系映射文件 Customer.hbm.xml 元素映射元素映射OIDl子元素用來(lái)設(shè)定標(biāo)識(shí)符生成器。子元素用來(lái)設(shè)定標(biāo)識(shí)符生成器。Hibernate提供了提供了多種提供了提供了多種內(nèi)置的實(shí)現(xiàn)。內(nèi)置的實(shí)現(xiàn)。 MySQL中:ID bigint auto_increment primary key 元素映射值

35、類型屬性元素映射值類型屬性lname屬性:屬性:指定持久化類的屬性的名字。指定持久化類的屬性的名字。lcolumn屬性:屬性:指定與類的屬性映射的表的字段名。指定與類的屬性映射的表的字段名。ltype屬性:屬性:指定指定Hibernate映射類型。映射類型。Hibernate映射類型是映射類型是Java類型與類型與SQL類型的橋梁。類型的橋梁。lJava類型:StringSQL類型:varcharHibernate類型:string Java類型、類型、Hibernate映射類型映射類型 以及以及SQL類型之間的對(duì)應(yīng)關(guān)系類型之間的對(duì)應(yīng)關(guān)系 Customer.hbm.xml配置的對(duì)象配置的對(duì)象-

36、關(guān)系映射關(guān)系映射 采用采用XML文件來(lái)配置對(duì)象文件來(lái)配置對(duì)象-關(guān)系映射的優(yōu)點(diǎn)關(guān)系映射的優(yōu)點(diǎn)lHibernate既不會(huì)滲透到上層域模型中,也不會(huì)滲透既不會(huì)滲透到上層域模型中,也不會(huì)滲透到下層數(shù)據(jù)模型中。到下層數(shù)據(jù)模型中。l軟件開發(fā)人員可以獨(dú)立設(shè)計(jì)域模型,不必強(qiáng)迫遵守任軟件開發(fā)人員可以獨(dú)立設(shè)計(jì)域模型,不必強(qiáng)迫遵守任何規(guī)范。何規(guī)范。l數(shù)據(jù)庫(kù)設(shè)計(jì)人員可以獨(dú)立設(shè)計(jì)數(shù)據(jù)模型,不必強(qiáng)迫遵數(shù)據(jù)庫(kù)設(shè)計(jì)人員可以獨(dú)立設(shè)計(jì)數(shù)據(jù)模型,不必強(qiáng)迫遵守任何規(guī)范。守任何規(guī)范。l對(duì)象對(duì)象-關(guān)系映射不依賴于任何程序代碼,如果需要修改關(guān)系映射不依賴于任何程序代碼,如果需要修改對(duì)象對(duì)象-關(guān)系映射,只需修改關(guān)系映射,只需修改XML文件,

37、不需要修改任何文件,不需要修改任何程序,提高了軟件的靈活性,并且使維護(hù)更加方便。程序,提高了軟件的靈活性,并且使維護(hù)更加方便。 (5)通過(guò))通過(guò)Hibernate API操縱數(shù)據(jù)庫(kù)操縱數(shù)據(jù)庫(kù) 創(chuàng)建創(chuàng)建BusinessService類類 l初始化初始化Hibernatel通過(guò)通過(guò)Hibernate的的Session接口操縱數(shù)據(jù)庫(kù)接口操縱數(shù)據(jù)庫(kù): 保存Customer對(duì)象 更新Customer對(duì)象 加載Customer對(duì)象 刪除Customer對(duì)象 檢索Customer對(duì)象 Hibernate的初始化的初始化 static try / 根據(jù)默認(rèn)位置的根據(jù)默認(rèn)位置的Hibernate配置文件的配置信

38、息,創(chuàng)建一個(gè)配置文件的配置信息,創(chuàng)建一個(gè) /Configuration實(shí)例實(shí)例 Configuration config = new Configuration(); config.addClass(Customer.class); / 創(chuàng)建創(chuàng)建SessionFactory實(shí)例實(shí)例 */ sessionFactory = config.buildSessionFactory(); catch(Exception e)e.printStackTrace(); Hibernate的初始化的初始化 l(1)創(chuàng)建一個(gè))創(chuàng)建一個(gè)Configuration類的實(shí)例,類的實(shí)例,Configuration類的

39、構(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)用Configu

40、ration類的類的buildSessionFactory()方法:方法: sessionFactory = config.buildSessionFactory(); SessionFactory接口接口 l一個(gè)一個(gè)SessionFactory實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源,應(yīng)用從實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源,應(yīng)用從SessionFactory中獲得中獲得Session實(shí)例。實(shí)例。SessionFactory有以下特點(diǎn):有以下特點(diǎn): 它是線程安全的,這意味著它的同一個(gè)實(shí)例可以被應(yīng)用的多個(gè)線程共享。 它是重量級(jí)的,這意味著不能隨意創(chuàng)建或銷毀它的實(shí)例。如果應(yīng)用只訪問一個(gè)數(shù)據(jù)庫(kù),只需要?jiǎng)?chuàng)建一個(gè)SessionFa

41、ctory實(shí)例,在應(yīng)用初始化的時(shí)候創(chuàng)建該實(shí)例。如果應(yīng)用同時(shí)訪問多個(gè)數(shù)據(jù)庫(kù),則需要為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)單獨(dú)的SessionFactory實(shí)例。 Session接口接口 lSession接口是接口是Hibernate應(yīng)用使用最廣泛的接口。應(yīng)用使用最廣泛的接口。lSession也被稱為持久化管理器,它提供了和持久化相關(guān)也被稱為持久化管理器,它提供了和持久化相關(guān)的操作,如添加、更新、刪除、加載和查詢對(duì)象。的操作,如添加、更新、刪除、加載和查詢對(duì)象。lSession有以下特點(diǎn):有以下特點(diǎn): 不是線程安全的,因此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例。 Session實(shí)例是輕量級(jí)的

42、,所謂輕量級(jí)是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建或銷毀Session對(duì)象,例如為每個(gè)客戶請(qǐng)求分配單獨(dú)的Session實(shí)例,或者為每個(gè)工作單元分配單獨(dú)的Session實(shí)例。 Session接口操縱數(shù)據(jù)庫(kù)的方法接口操縱數(shù)據(jù)庫(kù)的方法lSession接口提供了操縱數(shù)據(jù)庫(kù)的各種方法,如:接口提供了操縱數(shù)據(jù)庫(kù)的各種方法,如: save()方法:把Java對(duì)象保存數(shù)據(jù)庫(kù)中。 update()方法:更新數(shù)據(jù)庫(kù)中的Java對(duì)象。 delete()方法:把Java對(duì)象從數(shù)據(jù)庫(kù)中刪除。 load()或get()方法:從數(shù)據(jù)庫(kù)中加載Java對(duì)象。 find()方法:從數(shù)據(jù)庫(kù)中查詢Jav

43、a對(duì)象。在 Hibernate3中,該方法已經(jīng)被廢棄。 Hibernate提供了專門的Query查詢接口。 用用Session來(lái)執(zhí)行事務(wù)的流程來(lái)執(zhí)行事務(wù)的流程 Session session = factory.openSession(); Transaction tx; try /開始一個(gè)事務(wù)開始一個(gè)事務(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(); throw e;

44、 finally /不管事務(wù)執(zhí)行成功與否,最后都關(guān)閉不管事務(wù)執(zhí)行成功與否,最后都關(guān)閉Session session.close(); 正常執(zhí)行數(shù)據(jù)庫(kù)事務(wù)的流程正常執(zhí)行數(shù)據(jù)庫(kù)事務(wù)的流程 saveCustomer()方法方法l該方法調(diào)用該方法調(diào)用Session的的save()方法,把方法,把Customer對(duì)象持久化到數(shù)據(jù)庫(kù)中。對(duì)象持久化到數(shù)據(jù)庫(kù)中。 tx = session.beginTransaction(); session.save(customer); mit();l當(dāng)運(yùn)行當(dāng)運(yùn)行session.save()方法時(shí),方法時(shí),Hibernate執(zhí)行以下執(zhí)行以下SQL語(yǔ)句:語(yǔ)句: insert

45、 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對(duì)象的對(duì)象的id屬性,屬性,Hibernate會(huì)根據(jù)映射文件的會(huì)根據(jù)映射文件的配置,采用配置,采用increment標(biāo)識(shí)符生成器自動(dòng)以遞

46、增的方式為標(biāo)識(shí)符生成器自動(dòng)以遞增的方式為OID賦值。在賦值。在Customer.hbm.xml文件中相關(guān)的映射代碼如下:文件中相關(guān)的映射代碼如下: findAllCustomers()方法方法l該方法通過(guò)該方法通過(guò)Query接口查詢所有的接口查詢所有的Customer對(duì)象。對(duì)象。 tx = session.beginTransaction(); /開始一個(gè)事務(wù)開始一個(gè)事務(wù)Query query=session.createQuery(from Customer as c order by asc);List customers=query.list();for (Iterator

47、 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查詢語(yǔ)言。運(yùn)行查詢語(yǔ)言。運(yùn)行Query.list()方法時(shí),方法時(shí), Hibernate執(zhí)行以下執(zhí)行以下SQL語(yǔ)句:語(yǔ)句: select * from CUSTOMERS order by NAME asc;

48、HQL查詢語(yǔ)句Hibernate Query Language loadAndUpdateCustomer ()方法方法l該方法調(diào)用該方法調(diào)用Session的的get()方法,加載方法,加載Customer對(duì)象,然后再修改對(duì)象,然后再修改Customer對(duì)象的屬性。對(duì)象的屬性。 tx = session.beginTransaction(); Customer c=(Customer)session.get(Customer.class,customer_id); c.setAddress(address); /修改內(nèi)存中修改內(nèi)存中Customer對(duì)象的對(duì)象的address屬性屬性 mit()

49、;l以上代碼先調(diào)用以上代碼先調(diào)用Session的的get()方法,它按照參數(shù)指定的方法,它按照參數(shù)指定的OID從數(shù)據(jù)庫(kù)中檢從數(shù)據(jù)庫(kù)中檢索出匹配的索出匹配的Customer對(duì)象,對(duì)象,Hibernate會(huì)執(zhí)行以下會(huì)執(zhí)行以下SQL語(yǔ)句:語(yǔ)句: select * from CUSTOMERS where ID=1;lloadAndUpdateCustomer()方法接著修改方法接著修改Customer對(duì)象的對(duì)象的address屬性屬性。那么,。那么,Hibernate會(huì)不會(huì)同步更新數(shù)據(jù)庫(kù)中相應(yīng)的會(huì)不會(huì)同步更新數(shù)據(jù)庫(kù)中相應(yīng)的CUSTOMERS表的記表的記錄呢?答案是肯定的。錄呢?答案是肯定的。Hibernate采用臟檢查機(jī)制,按照內(nèi)存中的采用臟檢查機(jī)制,按照內(nèi)存中的Customer對(duì)象的狀態(tài)的變化,來(lái)同步更新數(shù)據(jù)庫(kù)中相關(guān)的數(shù)據(jù),對(duì)象的狀態(tài)的變化,來(lái)同步更新數(shù)據(jù)庫(kù)中相關(guān)的數(shù)據(jù),Hibernate會(huì)執(zhí)行以下會(huì)執(zhí)行以下SQL語(yǔ)句:語(yǔ)句: update CUSTOMERS set NAME=Tom,EMAIL=TADDRESS=Beijing where ID=1;l

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論