




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 補(bǔ)充: 連接面向?qū)ο缶幊毯完P(guān)系數(shù)據(jù)庫(kù)的橋梁- Hibernate1.應(yīng)用程序的分層體系結(jié)構(gòu)和Hibernate的作用2 軟件的模型3. 在Java應(yīng)用中使用Hibernate的步驟(1)創(chuàng)建Hibernate的配置文件(2)創(chuàng)建持久化類(3)創(chuàng)建數(shù)據(jù)庫(kù)Schema(4)創(chuàng)建對(duì)象-關(guān)系映射文件 (5)通過(guò)Hibernate API操縱數(shù)據(jù)庫(kù)Java對(duì)象持久化技術(shù)概述應(yīng)用程序的分層體系結(jié)構(gòu)Java應(yīng)用的持久化層軟件的模型概念模型關(guān)系數(shù)據(jù)模型域模型域?qū)ο笥驅(qū)ο笾g的關(guān)系域?qū)ο蟮某志没拍钪苯油ㄟ^(guò)JDBC API來(lái)持久化實(shí)體域?qū)ο驩RM簡(jiǎn)介實(shí)體域?qū)ο蟮钠渌志没J街鲃?dòng)域?qū)ο竽J絁DO模式CMP模式
2、 1.應(yīng)用程序的分層體系結(jié)構(gòu) 和Hibernate的作用 雙層應(yīng)用 應(yīng)用程序?qū)訑?shù)據(jù)庫(kù)層三層應(yīng)用表述層業(yè)務(wù)邏輯層數(shù)據(jù)庫(kù)層四層應(yīng)用表述層業(yè)務(wù)邏輯層持久化層數(shù)據(jù)庫(kù)層N層應(yīng)用 軟件層的特征 層與層之間存在自上而下的依賴關(guān)系,即上層組件會(huì)訪問(wèn)下層組件的API,而下層組件不應(yīng)該依賴上層組件。例如:表述層依賴于業(yè)務(wù)邏輯層,而業(yè)務(wù)邏輯層依賴于數(shù)據(jù)庫(kù)層。 每個(gè)層對(duì)上層公開(kāi)API,但具體的實(shí)現(xiàn)細(xì)節(jié)對(duì)外透明。當(dāng)某一層的實(shí)現(xiàn)發(fā)生變化,只要它的API不變,不會(huì)影響其他層的實(shí)現(xiàn)。 軟件分層的優(yōu)點(diǎn) 1伸縮性 伸縮性指應(yīng)用程序是否能支持更多的用戶。應(yīng)用的層越少,可以增加資源(如CPU和內(nèi)存)的地方就越少。層數(shù)越多,可以將每層
3、分布在不同的機(jī)器上2可維護(hù)性 可維護(hù)性指的是當(dāng)發(fā)生需求變化,只需修改軟件的某一部分,不會(huì)影響其他部分的代碼。3可擴(kuò)展性 可擴(kuò)展性指的是在現(xiàn)有系統(tǒng)中增加新功能的難易程度。層數(shù)越多,就可以在每個(gè)層中提供擴(kuò)展點(diǎn),不會(huì)打破應(yīng)用的整體框架。 4可重用性 可重用性指的是程序代碼沒(méi)有冗余,同一個(gè)程序能滿足多種需求。例如,業(yè)務(wù)邏輯層可以被多種表述層共享。5可管理性 可管理性指的是管理系統(tǒng)的難易程度。將應(yīng)用程序分為多層后,可以將工作分解給不同的開(kāi)發(fā)小組,從而便于管理。應(yīng)用越復(fù)雜,規(guī)模越大,需要的層就越多。 Java應(yīng)用的持久化層 封裝JDBC API MVC設(shè)計(jì)模式與四層應(yīng)用結(jié)構(gòu)的對(duì)應(yīng)關(guān)系 Hibernate是
4、持久化層的一種實(shí)現(xiàn)方式Hibernate不和特定的業(yè)務(wù)領(lǐng)域相關(guān),能夠把任意一個(gè)Java應(yīng)用與數(shù)據(jù)庫(kù)系統(tǒng)連接,它是一種中間件。 2. 軟件的模型在軟件開(kāi)發(fā)領(lǐng)域,模型用來(lái)表示真實(shí)世界的實(shí)體。在軟件開(kāi)發(fā)的不同階段,需要為目標(biāo)系統(tǒng)創(chuàng)建不同類型的模型:在分析階段,需要?jiǎng)?chuàng)建概念模型。在設(shè)計(jì)階段,需要?jiǎng)?chuàng)建域模型和數(shù)據(jù)模型。 模型之間的關(guān)系 概念模型概念模型用來(lái)模擬問(wèn)題域中的真實(shí)實(shí)體。概念模型描述了每個(gè)實(shí)體的概念和屬性,以及實(shí)體之間的關(guān)系。概念模型并不描述實(shí)體的行為。不管是技術(shù)人員還是非技術(shù)人員都能看得懂概念模型,他們可以很容易的提出模型中存在的問(wèn)題,幫助系統(tǒng)分析人員及早對(duì)模型進(jìn)行修改。 購(gòu)物網(wǎng)站應(yīng)用的概念模
5、型 實(shí)體與實(shí)體之間存在三種關(guān)系 Customer和Order實(shí)體: 一對(duì)多。一個(gè)客戶有多個(gè)訂單,而一個(gè)訂單只能屬于一個(gè)客戶。Category和Item實(shí)體:多對(duì)多。一個(gè)商品類別包含多個(gè)商品,而一個(gè)商品可以屬于多個(gè)商品類別。Order和Item實(shí)體:多對(duì)多。一個(gè)訂單包含多個(gè)商品,而一個(gè)商品可以屬于多個(gè)訂單。Customer和ShoppingCart實(shí)體:一對(duì)多。一個(gè)客戶有多個(gè)購(gòu)物車,而一個(gè)購(gòu)物車只能屬于一個(gè)客戶ShoppingCart和Item實(shí)體:多對(duì)多。一個(gè)購(gòu)物車包含多個(gè)商品,而一個(gè)商品可以屬于多個(gè)購(gòu)物車。 關(guān)系數(shù)據(jù)模型 關(guān)系數(shù)據(jù)模型是在概念模型的基礎(chǔ)上建立起來(lái)的,用于描述這些關(guān)系數(shù)據(jù)的靜態(tài)
6、結(jié)構(gòu),它由以下內(nèi)容組成:一個(gè)或多個(gè)表表的所有索引視圖觸發(fā)器表與表之間的參照完整性 表的主鍵在關(guān)系數(shù)據(jù)庫(kù)表中,用主鍵來(lái)識(shí)別記錄并保證每條記錄的惟一性。作為主鍵的字段必須滿足以下條件:不允許為null。每條記錄具有惟一的主鍵值,不允許主鍵值重復(fù)。每條記錄的主鍵值永遠(yuǎn)不會(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 CUSTOMER
7、S(NAME) values(Jack);select * from CUSTOMER;查詢結(jié)果+-+-+| ID | NAME |+-+-+| 1 | Tom | 2 | Jack |+-+-+ 表與表之間的參照完整性 用連接表表示多對(duì)多關(guān)系 域模型 域模型是面向?qū)ο蟮?。在面向?qū)ο笮g(shù)語(yǔ)中,域模型也可稱為設(shè)計(jì)模型。域模型由以下內(nèi)容組成:具有狀態(tài)和行為的域?qū)ο笥驅(qū)ο笾g的關(guān)系關(guān)聯(lián)依賴聚集一般化 域?qū)ο笥驅(qū)ο罂梢源順I(yè)務(wù)領(lǐng)域中的人、地點(diǎ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í)體對(duì)象可以代表人、地點(diǎn)、事物或概念。例
8、如客戶、訂單、商品等作為實(shí)體域?qū)ο?。在Java EE應(yīng)用中,這些名詞可以作為實(shí)體EJB。對(duì)于普通的Java應(yīng)用,這些名詞可以作為包含狀態(tài)和行為的JavaBean。采用JavaBean形式的實(shí)體域?qū)ο笠卜Q為POJO(Plain Old Java Object)。為了使實(shí)體域?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)表中記錄對(duì)應(yīng),可以為每個(gè)實(shí)體域?qū)ο蠓峙湮┮坏腛ID(Object Identifier,即對(duì)象標(biāo)識(shí)符),OID是關(guān)系數(shù)據(jù)庫(kù)表中的主鍵(通常為代理主鍵)在實(shí)體域?qū)ο笾械牡葍r(jià)物。 過(guò)程域?qū)ο筮^(guò)程域?qū)ο蟠響?yīng)用中的業(yè)務(wù)邏輯或流程。它們通常依賴于實(shí)體域?qū)ο???梢园褬I(yè)務(wù)領(lǐng)域中的動(dòng)詞,例如客戶發(fā)出訂單、登入應(yīng)用等作為過(guò)程域
9、對(duì)象。在Java EE應(yīng)用中,它們通常作為會(huì)話EJB或者消息驅(qū)動(dòng)EJB。在非Java EE應(yīng)用中,它們可作為常規(guī)的JavaBean,具有管理和控制應(yīng)用的行為。過(guò)程域?qū)ο笠部梢該碛袪顟B(tài),例如在J2EE應(yīng)用中,會(huì)話EJB可分為有狀態(tài)和無(wú)狀態(tài)兩種類型。 事件域?qū)ο笫录驅(qū)ο蟠響?yīng)用中的一些事件(如異常、警告或超時(shí))。這些事件通常由系統(tǒng)中的某種行為觸發(fā)。例如在多用戶環(huán)境中,當(dāng)一個(gè)客戶端程序更新了某種實(shí)時(shí)數(shù)據(jù),服務(wù)器端程序會(huì)創(chuàng)建一個(gè)事件域?qū)ο?,其他正在瀏覽相同數(shù)據(jù)的客戶端程序能夠接受到這一事件域?qū)ο螅S即同步刷新客戶界面。 域?qū)ο笾g的關(guān)系關(guān)聯(lián)(Association)依賴(Dependency)聚集(
10、Aggregation)一般化(Generalization) 關(guān)聯(lián)關(guān)系private Customer customer;public Customer getCustomer();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 S
11、et orders;public Set getOrders();public void setOrders(Set o); 依賴關(guān)系 在BusinessService類中訪問(wèn)Customer類的方法,并且構(gòu)造Customer類的實(shí)例 聚集關(guān)系聚集指的是整體與部分之間的關(guān)系,在實(shí)體域?qū)ο笾g很常見(jiàn)。 一般化關(guān)系一般化指的是類之間的繼承關(guān)系。 域?qū)ο蟮某志没拍?域?qū)ο蟮某志没拍瞠M義的理解,“持久化”僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)中廣義的理解,“持久化”包括和數(shù)據(jù)庫(kù)相關(guān)的各種操作:保存:把域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)中。更新:更新數(shù)據(jù)庫(kù)中域?qū)ο蟮臓顟B(tài)。刪除:從數(shù)據(jù)庫(kù)中刪除一個(gè)域?qū)ο?。加載:根據(jù)特定的
12、OID,把一個(gè)域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。查詢:根據(jù)特定的查詢條件,把符合查詢條件的一個(gè)或多個(gè)域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。 通過(guò)JDBC API來(lái)持久化實(shí)體域?qū)ο?Java應(yīng)用訪問(wèn)數(shù)據(jù)庫(kù)的最直接的方式就是直接訪問(wèn)JDBC API,JDBC是Java Database Connectivity的縮寫(xiě)。java.sql包提供了JDBC API。在java.sql包中常用的接口和類包括:DriverManager:驅(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ǔ)
13、句的功能。ResultSet:代表SQL查詢語(yǔ)句的查詢結(jié)果集。 JDBC驅(qū)動(dòng)程序Java應(yīng)用必須通過(guò)JDBC驅(qū)動(dòng)程序來(lái)和特定的數(shù)據(jù)庫(kù)系統(tǒng)連接。 JDBC驅(qū)動(dòng)程序由數(shù)據(jù)庫(kù)廠商或第三方提供。 JDBC API負(fù)責(zé)持久化Customer對(duì)象的BusinessServicesaveCustomer():把Customer域?qū)ο笥谰帽4娴綌?shù)據(jù)庫(kù)中。updateCustomer():更新數(shù)據(jù)庫(kù)中Customer域?qū)ο蟮臓顟B(tài)。deleteCustomer():從數(shù)據(jù)庫(kù)中刪除一個(gè)Customer域?qū)ο?。loadCustomer():根據(jù)特定的OID,把一個(gè)Customer域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。findC
14、ustomerByName():根據(jù)特定的客戶姓名,把符合查詢條件的Customer域?qū)ο髲臄?shù)據(jù)庫(kù)加載到內(nèi)存中。業(yè)務(wù)邏輯代碼與數(shù)據(jù)訪問(wèn)代碼耦合的saveCustomer()方法 con=getConnection(); /獲得數(shù)據(jù)庫(kù)連接 /開(kāi)始一個(gè)數(shù)據(jù)庫(kù)事務(wù) con.setAutoCommit(false); /以下是業(yè)務(wù)邏輯代碼,檢查客戶姓名是否為空 if(customer.getName()=null) throw new BusinessException(客戶姓名不允許為空); /以下是數(shù)據(jù)訪問(wèn)代碼,持久化Customer對(duì)象 /為新的CUSTOMERS記錄分配惟一的ID long c
15、ustomerId=getNextId(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ù)訪問(wèn)代碼耦合的saveCustomer()方法 Iterator iterat
16、or =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ù)訪問(wèn)代碼,級(jí)聯(lián)持久化Order對(duì)象 /為新的ORDERS記錄分配惟一的ID long orderId=getNextId(con,ORDERS); /把Order對(duì)象映射為面向關(guān)系的SQL語(yǔ)句 st
17、mt=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)實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼和數(shù)據(jù)庫(kù)訪問(wèn)代碼摻雜在一起,使程序結(jié)構(gòu)不清晰,可讀性差
18、。在程序代碼中嵌入面向關(guān)系的SQL語(yǔ)句,使開(kāi)發(fā)人員不能完全運(yùn)用面向?qū)ο蟮乃季S來(lái)編寫(xiě)程序。業(yè)務(wù)邏輯和關(guān)系數(shù)據(jù)模型綁定,如果關(guān)系數(shù)據(jù)模型發(fā)生變化,例如修改了CUSTOMERS表的結(jié)構(gòu),那么必須手工修改程序代碼中所有相關(guān)的SQL語(yǔ)句,這增加了維護(hù)軟件的難度。如果程序代碼中的SQL語(yǔ)句包含語(yǔ)法錯(cuò)誤,在編譯時(shí)不能檢查這種錯(cuò)誤,只有在運(yùn)行時(shí)才能發(fā)現(xiàn)這種錯(cuò)誤,這增加了調(diào)試程序的難度。 數(shù)據(jù)訪問(wèn)模式業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn)耦合ORM模式:在單個(gè)組件中負(fù)責(zé)所有實(shí)體域?qū)ο蟮某志没庋b數(shù)據(jù)訪問(wèn)細(xì)節(jié)。 主動(dòng)域?qū)ο竽J剑河蓪?shí)體域?qū)ο蟊旧碡?fù)責(zé)管理自己的持久化JDO模式: SUN公司制定的描述對(duì)象持久化語(yǔ)義的標(biāo)準(zhǔn)API CMP
19、模式:由容器負(fù)責(zé)管理持久化 ORM模式對(duì)象-關(guān)系映射(Object-Relation Mapping)的概念 ORM解決的主要問(wèn)題就是對(duì)象-關(guān)系的映射。域模型和關(guān)系模型都分別建立在概念模型的基礎(chǔ)上。域模型是面向?qū)ο蟮?,而關(guān)系數(shù)據(jù)模型是面向關(guān)系的.一般情況下,一個(gè)持久化類和一個(gè)表對(duì)應(yīng),類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄。域模型與關(guān)系模型之間存在許多不匹配之處。 域模型與關(guān)系模型之間存在許多不匹配之處域模型中有繼承關(guān)系,關(guān)系模型不能直接表示繼承關(guān)系域模型中有多對(duì)多關(guān)聯(lián)關(guān)系,關(guān)系模型通過(guò)連接表來(lái)表示多對(duì)多關(guān)聯(lián)關(guān)系域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型只有單向參照關(guān)系,而且總是many方參照one方。域模型提倡
20、精粒度模型,而關(guān)系模型提倡粗粒度模型Category類Item類域模型與關(guān)系模型之間的不匹配舉例如果類的粒度比較大,不利于代碼的可重用.Customer類homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcodeEmployee類homeProvincehomeCityhomeStreethomeZipcodecomProvicecomCitycomStreetcomZipcode增加Room信息Customer類homeRoomcomRoomEmployee類homeRoomcomRoom 域模型
21、與關(guān)系模型之間的不匹配舉例精粒度域模型和粗粒度關(guān)系模型private Address homeAddress;private Address comAddress; 3.在Java應(yīng)用中使用Hibernate的步驟在Java應(yīng)用中使用Hibernate的步驟需要以下步驟:(1)創(chuàng)建Hibernate的配置文件(2)創(chuàng)建持久化類(3) 創(chuàng)建數(shù)據(jù)庫(kù)Schema (4)創(chuàng)建對(duì)象-關(guān)系映射文件(5)通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼Helloapp應(yīng)用的結(jié)構(gòu)(1)Hibernate的配置文件(perties) hibernate.dialect=org.hibernate.dialec
22、t.MySQLDialecthibernate.connection.driver_class=com.mysql.jdbc.Driverhibernate.connection.url=jdbc:mysql:/localhost:3306/SAMPLEDB hibernate.connection.username=roothibernate.connection.password=1234hibernate.show_sql=true Hibernate配置文件的屬性 (2)創(chuàng)建持久化類Customer持久化類符合JavaBean的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的getXXX()和set
23、XXX()方法。 持久化類有一個(gè)id屬性,用來(lái)惟一標(biāo)識(shí)Customer類的每個(gè)對(duì)象。在面向?qū)ο笮g(shù)語(yǔ)中,這個(gè)id屬性被稱為對(duì)象標(biāo)識(shí)符(OID,Object Identifier),通常它都用整數(shù)表示 Hibernate要求持久化類必須提供一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造方法 (3) 創(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
24、 , ADDRESS varchar(255), SEX 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)建對(duì)象-關(guān)系映射文件 Customer.hbm.xml 元素映射OID子元素用來(lái)設(shè)定標(biāo)識(shí)符生成器。Hibernate提供了提供了多種內(nèi)置的實(shí)現(xiàn)。 MySQL中:ID bigint auto_increment primary key 元素映射值類型屬性name屬性:指定持
25、久化類的屬性的名字。column屬性:指定與類的屬性映射的表的字段名。type屬性:指定Hibernate映射類型。Hibernate映射類型是Java類型與SQL類型的橋梁。Java類型:StringSQL類型:varcharHibernate類型:string Java類型、Hibernate映射類型 以及SQL類型之間的對(duì)應(yīng)關(guān)系 Customer.hbm.xml配置的對(duì)象-關(guān)系映射 采用XML文件來(lái)配置對(duì)象-關(guān)系映射的優(yōu)點(diǎn)Hibernate既不會(huì)滲透到上層域模型中,也不會(huì)滲透到下層數(shù)據(jù)模型中。軟件開(kāi)發(fā)人員可以獨(dú)立設(shè)計(jì)域模型,不必強(qiáng)迫遵守任何規(guī)范。數(shù)據(jù)庫(kù)設(shè)計(jì)人員可以獨(dú)立設(shè)計(jì)數(shù)據(jù)模型,不必強(qiáng)
26、迫遵守任何規(guī)范。對(duì)象-關(guān)系映射不依賴于任何程序代碼,如果需要修改對(duì)象-關(guān)系映射,只需修改XML文件,不需要修改任何程序,提高了軟件的靈活性,并且使維護(hù)更加方便。 (5)通過(guò)Hibernate API操縱數(shù)據(jù)庫(kù) 創(chuàng)建BusinessService類 初始化Hibernate通過(guò)Hibernate的Session接口操縱數(shù)據(jù)庫(kù):保存Customer對(duì)象更新Customer對(duì)象加載Customer對(duì)象刪除Customer對(duì)象檢索Customer對(duì)象 Hibernate的初始化 static try / 根據(jù)默認(rèn)位置的Hibernate配置文件的配置信息,創(chuàng)建一個(gè) /Configuration實(shí)例 C
27、onfiguration config = new Configuration(); config.addClass(Customer.class); / 創(chuàng)建SessionFactory實(shí)例 */ sessionFactory = config.buildSessionFactory(); catch(Exception e)e.printStackTrace(); Hibernate的初始化 (1)創(chuàng)建一個(gè)Configuration類的實(shí)例,Configuration類的構(gòu)造方法把默認(rèn)文件路徑下的perties配置文件中的配置信息讀入到內(nèi)存: Configuration config =
28、new Configuration();(2)調(diào)用Configuration類的addClass(Customer.class)方法: config.addClass(Customer.class); 該方法把默認(rèn)文件路徑下的Customer.hbm.xml文件中的映射信息讀入到內(nèi)存中。(3)調(diào)用Configuration類的buildSessionFactory()方法: sessionFactory = config.buildSessionFactory(); SessionFactory接口 一個(gè)SessionFactory實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源,應(yīng)用從SessionFactory中獲
29、得Session實(shí)例。SessionFactory有以下特點(diǎn):它是線程安全的,這意味著它的同一個(gè)實(shí)例可以被應(yīng)用的多個(gè)線程共享。它是重量級(jí)的,這意味著不能隨意創(chuàng)建或銷毀它的實(shí)例。如果應(yīng)用只訪問(wèn)一個(gè)數(shù)據(jù)庫(kù),只需要?jiǎng)?chuàng)建一個(gè)SessionFactory實(shí)例,在應(yīng)用初始化的時(shí)候創(chuàng)建該實(shí)例。如果應(yīng)用同時(shí)訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),則需要為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)單獨(dú)的SessionFactory實(shí)例。 Session接口 Session接口是Hibernate應(yīng)用使用最廣泛的接口。Session也被稱為持久化管理器,它提供了和持久化相關(guān)的操作,如添加、更新、刪除、加載和查詢對(duì)象。Session有以下特點(diǎn):不是線程安全的,因
30、此在設(shè)計(jì)軟件架構(gòu)時(shí),應(yīng)該避免多個(gè)線程共享同一個(gè)Session實(shí)例。Session實(shí)例是輕量級(jí)的,所謂輕量級(jí)是指它的創(chuàng)建和銷毀不需要消耗太多的資源。這意味著在程序中可以經(jīng)常創(chuàng)建或銷毀Session對(duì)象,例如為每個(gè)客戶請(qǐng)求分配單獨(dú)的Session實(shí)例,或者為每個(gè)工作單元分配單獨(dú)的Session實(shí)例。 Session接口操縱數(shù)據(jù)庫(kù)的方法Session接口提供了操縱數(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()
31、方法:從數(shù)據(jù)庫(kù)中查詢Java對(duì)象。在 Hibernate3中,該方法已經(jīng)被廢棄。 Hibernate提供了專門的Query查詢接口。 用Session來(lái)執(zhí)行事務(wù)的流程 Session session = factory.openSession(); Transaction tx; try /開(kāi)始一個(gè)事務(wù) tx = session.beginTransaction(); /執(zhí)行事務(wù) . /提交事務(wù) mit(); catch (Exception e) /如果出現(xiàn)異常,就撤銷事務(wù) if (tx!=null) tx.rollback(); throw e; finally /不管事務(wù)執(zhí)行成功與否,最
32、后都關(guān)閉Session session.close(); 正常執(zhí)行數(shù)據(jù)庫(kù)事務(wù)的流程 saveCustomer()方法該方法調(diào)用Session的save()方法,把Customer對(duì)象持久化到數(shù)據(jù)庫(kù)中。 tx = session.beginTransaction(); session.save(customer); mit();當(dāng)運(yùn)行session.save()方法時(shí),Hibernate執(zhí)行以下SQL語(yǔ)句: insert into CUSTOMERS (ID, NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED,DESCRIPTION,
33、IMAGE, BIRTHDAY, REGISTERED_TIME) values(1,Tom,tom,1234,55556666,Shanghai,M,0,I am very honest., ,1980-05-06,null)在test()方法中并沒(méi)有設(shè)置Customer對(duì)象的id屬性,Hibernate會(huì)根據(jù)映射文件的配置,采用increment標(biāo)識(shí)符生成器自動(dòng)以遞增的方式為OID賦值。在Customer.hbm.xml文件中相關(guān)的映射代碼如下: findAllCustomers()方法該方法通過(guò)Query接口查詢所有的Customer對(duì)象。 tx = session.beginTrans
34、action(); /開(kāi)始一個(gè)事務(wù)Query query=session.createQuery(from Customer as c order by asc);List customers=query.list();for (Iterator it = customers.iterator(); it.hasNext();) printCustomer(context,out,(Customer) it.next();mit(); /提交事務(wù)Session的createQuery()方法的參數(shù)“from Customer as c order by asc”使用的是Hibernate查詢語(yǔ)
35、言。運(yùn)行Query.list()方法時(shí), Hibernate執(zhí)行以下SQL語(yǔ)句: select * from CUSTOMERS order by NAME asc;HQL查詢語(yǔ)句Hibernate Query Language loadAndUpdateCustomer ()方法該方法調(diào)用Session的get()方法,加載Customer對(duì)象,然后再修改Customer對(duì)象的屬性。 tx = session.beginTransaction(); Customer c=(Customer)session.get(Customer.class,customer_id); c.setAddre
36、ss(address); /修改內(nèi)存中Customer對(duì)象的address屬性 mit();以上代碼先調(diào)用Session的get()方法,它按照參數(shù)指定的OID從數(shù)據(jù)庫(kù)中檢索出匹配的Customer對(duì)象,Hibernate會(huì)執(zhí)行以下SQL語(yǔ)句: select * from CUSTOMERS where ID=1;loadAndUpdateCustomer()方法接著修改Customer對(duì)象的address屬性。那么,Hibernate會(huì)不會(huì)同步更新數(shù)據(jù)庫(kù)中相應(yīng)的CUSTOMERS表的記錄呢?答案是肯定的。Hibernate采用臟檢查機(jī)制,按照內(nèi)存中的Customer對(duì)象的狀態(tài)的變化,來(lái)同步更新數(shù)據(jù)庫(kù)中相關(guān)的數(shù)據(jù),Hibernate會(huì)執(zhí)行以下SQL語(yǔ)句: update CUSTOMERS set NAME=Tom,EMAIL=TomADDRESS=Beijing where ID=1;盡管只有Customer對(duì)象的address屬性發(fā)生了變化,但是Hib
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園管理制度300字
- 融資平臺(tái)投資管理制度
- 作業(yè)本發(fā)放管理制度
- 魚(yú)塘釣魚(yú)規(guī)章管理制度
- 食品管理制度培訓(xùn)記錄
- 服裝公司5s管理制度
- iqa數(shù)據(jù)管理制度
- 頂級(jí)酒店衛(wèi)生管理制度
- 食品公司加工管理制度
- 集團(tuán)新建項(xiàng)目管理制度
- 地理課程跨學(xué)科主題學(xué)習(xí)的問(wèn)題與對(duì)策
- 2024年國(guó)家發(fā)改委直屬單位招聘考試真題
- 2025年無(wú)錫工藝職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案
- 2025年長(zhǎng)春職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)帶答案
- 2025年河南農(nóng)業(yè)職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)必考題
- 蔚來(lái)銷售培訓(xùn)
- 艾滋病、梅毒母嬰阻斷干預(yù)技術(shù)課件
- 2024年江蘇省腫瘤醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年世界職業(yè)院校技能大賽中職組“養(yǎng)老照護(hù)組”賽項(xiàng)參考試題庫(kù)(含答案)
- 小學(xué)課本劇為中華之崛起而讀書(shū)劇本
- 《道德情操論》課件
評(píng)論
0/150
提交評(píng)論