第5章 Hibernate持久層技術(shù)(1)_第1頁
第5章 Hibernate持久層技術(shù)(1)_第2頁
第5章 Hibernate持久層技術(shù)(1)_第3頁
第5章 Hibernate持久層技術(shù)(1)_第4頁
第5章 Hibernate持久層技術(shù)(1)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 Hibernate持久(chji)層技術(shù)共五十頁教學(xué)內(nèi)容案例Java 持久化對象(duxing)Hibernate 概述Hibernate 映射關(guān)系HQL查詢語言共五十頁5.1 案例(n l)案例(n l)Hibernate關(guān)系數(shù)據(jù)庫Customer類CustomerService類對象關(guān)系型映射Hibernate APIHibernate 配置文件customers表共五十頁一個(y )語言轉(zhuǎn)換工具,Hibernate利用它實現(xiàn) HQL 到 SQL 的轉(zhuǎn)換collections Apache 的工具集,用來增強(qiáng)(zngqing)Java對集合的處理能力dom4j XML 解析器核心包

2、代碼生成工具, Hibernate用它在運(yùn)行時擴(kuò)展 Java類標(biāo)準(zhǔn)的 JAVA 事務(wù)處理接口hibernate使用的一個日志系統(tǒng)所用Jar包及說明5.1 案例共五十頁5.1 案例(n l)創(chuàng)建(chungjin)表和對應(yīng)的javaBean 文件create table customer( id int primary key, name varchar(12), age int, des text)public class Customer private Integer id; private String name; private Integer age; private String

3、des;共五十頁5.1 案例(n l)創(chuàng)建 Customer.hbm.xml 文件(擴(kuò)展名 .hbm.xml) Hibernate 采用 XML 格式的文件來指定對象和關(guān)系數(shù)據(jù)之間的映射. 在運(yùn)行時 Hibernate 將根據(jù)(gnj)這個映射文件來生成各種 SQL 語句共五十頁指定持久(chji)化類的OID 和表的主鍵的映射映射(yngsh)類的屬性和表的字段指定對象標(biāo)識符生成器, 負(fù)責(zé)為 OID 生成唯一標(biāo)識符指定類和表的映射共五十頁5.1 案例(n l)property元素:設(shè)定持久化類的屬性(shxng)和表字段映射name屬性:指定持久化類的屬性的名字column屬性:指定表中字段

4、的名稱type屬性指定Hibernate映射類型 Hibernate映射類型是java類型與SQL類型的橋梁注: 該映射文件的規(guī)范在 org.hibernate. hibernate-mapping-3.0.dtd 文件中共五十頁5.1 案例(n l)java、hibernate、sql類型對應(yīng)(duyng)關(guān)系SQL類型Java類型Hibernate類型VARCHARStringstringINTInteger/intintCHARCharacter/charcharacterBITBoolean/booleanbooleanTEXTStringtextBLOBbytebinaryDATEj

5、ava.sql.DatedateTIMESTAMPjava.sql.Timestamptimestamp共五十頁5.2 Java 持久(chji)化對象軟件模型用于描述業(yè)務(wù)系統(tǒng)涉及的真實實體。在軟件開發(fā)的不同階段需要建立(jinl)不同的模型:分析階段:概念模型設(shè)計階段:域模型、關(guān)系數(shù)據(jù)模型各種模型之間存在轉(zhuǎn)換關(guān)系:概念模型域模型(面向?qū)ο?關(guān)系數(shù)據(jù)模型(面向關(guān)系)分析階段設(shè)計階段對象關(guān)系映射共五十頁5.2 Java 持久(chji)化對象概念模型概念模型用來(yn li)模擬問題域中的真實實體。概念模型描述每個實體的概念及屬性,以及實體之間的關(guān)系。概念模型并不描述實體的行為。技術(shù)人員還是非技

6、術(shù)人員他們都能夠看得懂概念模型,也可以很容易的提出模型中的問題,及早發(fā)現(xiàn)以幫助系統(tǒng)分析人員修改問題。共五十頁5.2 Java 持久(chji)化對象關(guān)系模型關(guān)系數(shù)據(jù)模型建立在概念模型的基礎(chǔ)之上,它是用于描述關(guān)系數(shù)據(jù)的靜態(tài)結(jié)構(gòu)它由數(shù)據(jù)表以及數(shù)據(jù)表之間的參照完整性,視圖,索引,觸發(fā)器組成數(shù)據(jù)表中用主鍵來標(biāo)識和區(qū)分記錄關(guān)系表中作為主鍵的字段應(yīng)當(dāng)滿足:不充許為空每條記錄擁有唯一值,表中不充許重復(fù)(chngf)每條記錄的主鍵值永遠(yuǎn)不可改變關(guān)系表中應(yīng)當(dāng)盡量使用代理主鍵共五十頁5.2 Java 持久(chji)化對象關(guān)系模型-表與表的參照完整性在概念模型中需要建立實體與實體之間的關(guān)系而在數(shù)據(jù)模型中需要建立關(guān)

7、系數(shù)據(jù)之間的參照完整性關(guān)系示例:員工(yungng)和部門,訂單與產(chǎn)品員工與部門之間的一對多訂單與產(chǎn)品的多對多關(guān)系共五十頁5.2 Java 持久(chji)化對象域?qū)ο?業(yè)務(wù)(yw)系統(tǒng)中域?qū)ο蟾鶕?jù)用途可分為:實體域?qū)ο?、過程域?qū)ο蟆⑹录驅(qū)ο髮嶓w域?qū)ο髮嶓w可以代表人,地點,事物或概念Java中用包含屬性的JavaBean表示每個實體域?qū)ο笈c關(guān)系數(shù)據(jù)庫中一條記錄對應(yīng),為了區(qū)分實體域?qū)ο螅總€實體域?qū)ο蠖?有一個唯一的OID,OID的值對應(yīng)記錄的主鍵概念模型的實體一般需要轉(zhuǎn)換成實體域?qū)ο蠊参迨?.2 Java 持久(chji)化對象持久(chji)化的操作主要包括:保存:把域?qū)ο蟊4娴綌?shù)據(jù)庫中

8、。更新:更新數(shù)據(jù)庫中域?qū)ο蟮臓顟B(tài)數(shù)據(jù)。刪除:從數(shù)據(jù)庫中刪除一個域?qū)ο?。加載:根據(jù)一個特定的OID,將對應(yīng)的域?qū)ο髲臄?shù)據(jù)庫中加載到內(nèi)存。查詢:根據(jù)特定的條件,把一個或多個域?qū)ο蠹虞d到內(nèi)存中。共五十頁5.2 Java 持久(chji)化對象通用的Java應(yīng)用一般使用JDBC來實現(xiàn)域?qū)ο蟮某志没?,使用JDBC操作數(shù)據(jù)庫具有一些缺餡:業(yè)務(wù)邏輯的代碼和數(shù)據(jù)庫訪問代碼摻雜在一起,使程序結(jié)構(gòu)不清晰,可讀性差。程序代碼中應(yīng)用了SQL語句,使開發(fā)人員無法以完全面向?qū)ο蟮乃季S來編寫程序。業(yè)務(wù)邏輯和關(guān)系數(shù)據(jù)模型綁定,如果關(guān)系模型發(fā)生了變化,必須手工修改程序代碼中所有(suyu)相關(guān)的SQL語句,增加了軟件的維護(hù)難度

9、。如果程序代碼中的包含 SQL的語法錯誤,在編譯階段無法檢查出這種錯誤,只有在運(yùn)行時才能發(fā)現(xiàn),這增加了調(diào)試難度。共五十頁5.2 Java 持久(chji)化對象ORM模式ORM(Object Relation Mapping)簡稱對象關(guān)系映射ORM通過特定的配置文件定義域?qū)ο笈c關(guān)系數(shù)據(jù)庫之間的關(guān)系來實現(xiàn)域模型到關(guān)系數(shù)據(jù)模型的映射ORM通過從業(yè)務(wù)層分離一個單獨的持久(chji)化層來實現(xiàn)域模型與關(guān)系數(shù)據(jù)模型之間的映射。在持久化層通過向業(yè)務(wù)層公開API接口,來實現(xiàn)業(yè)務(wù)系統(tǒng)的數(shù)據(jù)持久化。Hibernate是基于ORM模式的一種實現(xiàn)。共五十頁5.2 Java 持久(chji)化對象對象-關(guān)系映射ORM

10、解決(jiju)的主要問題就是對象-關(guān)系的映射域模型是面向?qū)ο蟮亩P(guān)系數(shù)據(jù)模型是面向關(guān)系的域模型與關(guān)系模型中元素的對應(yīng)關(guān)系:面向?qū)ο蟮母拍蠲嫦蜿P(guān)系的概念類表對象表行、記錄屬性表列、字段共五十頁5.2 Java 持久(chji)化對象域模型與關(guān)系模型之間的不匹配 除了基本的匹配關(guān)系外,域模型與關(guān)系模型之間還存在許多不匹配的關(guān)系:域模型主要由域?qū)ο蟮年P(guān)聯(lián),依賴,聚集,一般化關(guān)系組成,而關(guān)系模型只有參照完整性域模型中有繼承關(guān)系,關(guān)系模型不能直接(zhji)表示繼承關(guān)系域模型中有多對多的關(guān)系,而關(guān)系模型中只能通過連接表來表示多對多的關(guān)聯(lián)關(guān)系域模型中有雙向關(guān)聯(lián)關(guān)系,關(guān)系模型只有單向參照關(guān)系,只有多參照

11、一的一方域模型提倡精粒度的設(shè)計,而關(guān)系模型則提倡粗粒度的設(shè)計共五十頁5.3.1 Hibernate 概述(i sh)Hibernate是什么 面向java環(huán)境的對象-關(guān)系數(shù)據(jù)庫映射工具。1.開源的持久層框架.2.ORM(Object/Relational Mapping)映射工具,建立(jinl)面向?qū)ο蟮挠蚰P秃完P(guān)系數(shù)據(jù)模型之間的映射.3.連接java應(yīng)用和數(shù)據(jù)庫的中間件,簡化了數(shù)據(jù)訪問層繁瑣的重復(fù)性代碼。 4.對JDBC進(jìn)行封裝,負(fù)責(zé)java對象的持久化.共五十頁5.3.1 Hibernate 概述(i sh)Hibernate 5. Hibernate使用java的反射機(jī)制,而不是字節(jié)碼

12、增強(qiáng)程序類實現(xiàn)透明性 6. Hibernate的性能非常好,因為它是一個輕量級框架。映射的靈活性很出色。它支持很多關(guān)系型數(shù)據(jù)庫,從一對一到多對多的各種復(fù)雜關(guān)系。7. 在分層結(jié)構(gòu)中處于持久化層,封裝對數(shù)據(jù)庫的訪問細(xì)節(jié)(xji),使業(yè)務(wù)邏輯層更專注于實現(xiàn)業(yè)務(wù)邏輯共五十頁5.3.1 Hibernate 概述(i sh)Hibernate不和特定(tdng)的業(yè)務(wù)領(lǐng)域相關(guān),能夠把任意一個Java應(yīng)用與數(shù)據(jù)庫系統(tǒng)連接,可以理解為是一種中間件。應(yīng)用1業(yè)務(wù)邏輯層應(yīng)用2業(yè)務(wù)邏輯層應(yīng)用3業(yè)務(wù)邏輯層持久化層(hibernate)數(shù)據(jù)庫1數(shù)據(jù)庫2數(shù)據(jù)庫3共五十頁5.3.1 Hibernate 概述(i sh)持久化

13、層封裝了數(shù)據(jù)訪問的細(xì)節(jié),為業(yè)務(wù)邏輯(lu j)層提供了面向?qū)ο蟮腁PI。完善的持久化層應(yīng)該達(dá)到的目標(biāo): 1.代碼重用性高,可完成所有的數(shù)據(jù)訪問操作。 2.如果需要的話,能夠支持多種數(shù)據(jù)庫平臺。 3.具有相對獨立性,當(dāng)持久化層變化時,不會影響上層 實現(xiàn)共五十頁5.3.1 Hibernate 概述(i sh)Hibernate提供了對域模型和關(guān)系模型之間的完整映射,它的主要功能和優(yōu)點:實現(xiàn)了ORM的核心功能,能用面向?qū)ο蟮母拍顏硖幚?chl)關(guān)系數(shù)據(jù)庫 功能強(qiáng)大,高效較高,除提供對象關(guān)系映射,同時提供了對象查詢語言HQL,和一套Criteria API等功能獨立的持久層框架,不與具體服務(wù)器相關(guān)能夠

14、支持絕大多數(shù)的關(guān)系數(shù)據(jù)庫Hibernate缺點,配置較多,查詢支持不夠靈活,對分布式,安全檢查,集群,負(fù)載均衡的支持有限共五十頁5.3.1 Hibernate 概述(i sh)開發(fā)Hibernater的參考基本(jbn)步聚:獲取Hibernate相關(guān)的庫文件及參考手冊可查詢Hibernate的官方網(wǎng)站,/工程中引入Hibernate相關(guān)的Jar文件建立Hibernate的初始化配置文件根據(jù)概念模型建立系統(tǒng)的實體域類及它們關(guān)系根據(jù)概念模型建立關(guān)系數(shù)據(jù)表根據(jù)實體類與表之間的對應(yīng)關(guān)系建立映射文件建立Hibernate會話工廠及會話對象,通過會話對象執(zhí)行持久化操作共五十頁應(yīng)用程序 Configura

15、tion SessionFactory Session Query 映射(yngsh)文件.hbm.xmlTransaction配置文件hibernate.cfg.xml 回滾 提交(tjio) 數(shù)據(jù)庫 查詢異常正常共五十頁5.3.1 Hibernate 概述(i sh)Hibernate應(yīng)用程序結(jié)構(gòu)(jigu)示例:訂單管理應(yīng)用Order(訂單實體)OrderServices(訂單管理業(yè)務(wù)類)Hibernate對象關(guān)系映射文件Hibernate 會話APIHibernate配置文件關(guān)系數(shù)據(jù)庫Orders(訂單表)共五十頁5.3.2 Hibernate配置文件示例(shl)Hibernate配

16、置文件用于設(shè)置Hibernate鏈接數(shù)據(jù)庫的參數(shù)及一些(yxi)初始化參數(shù),它是一個XML文件jdbc:mysql:/localhost:3306/mydbrootadmincom.mysql.jdbc.Driverorg.hibernate.dialect.MySQLDialect共五十頁5.3.2 Hibernate配置文件示例(shl)Hibernate的參考手冊有對配置參數(shù)作詳細(xì)說明,常見的配置參數(shù)有:dialect數(shù)庫方言,方言用于屏蔽不同的數(shù)據(jù)庫的SQL的不同點。connection.driver_class 數(shù)據(jù)庫鏈接驅(qū)動類connection.url 數(shù)據(jù)庫的JDBC鏈接的UR

17、Lconnection.username 數(shù)據(jù)庫帳號connection.password 數(shù)據(jù)庫密碼show_sql Hibernate將生成(shn chn)的SQL腳本是否打印在控制臺上hbm2ddl 指定Hibernate自動生成數(shù)據(jù)表結(jié)構(gòu),常見值有:create-drop,create,update共五十頁 建立(jinl)實體類建立配置文件的需要(xyo)根據(jù)實體域模型建立類的實體類,例如用于描述客戶的實體類定義如下:public class Customer private Long id;/客戶編號OIDprivate String name;/客戶姓名private Date

18、 birth;/出生日期private String address;/地址private String telPhone;/聯(lián)系電話public String getAddress() return address;public void setAddress(String address) this.address = address;public Date getBirth() return birth;public void setBirth(Date birth) this.birth = birth;共五十頁 持久(chji)化類(PO)的特征Hibernate需要持久化的實體類又

19、稱之為持久化類(Persistent Object)又簡稱POPO需要符合(fh)JavaBean的規(guī)范,必需提供一個不帶參數(shù)的構(gòu)造函數(shù),屬性通過set和get方法訪問PO需要有一個唯一的標(biāo)識屬性,該屬性用于區(qū)為同一PO類的不同PO實例,其值對應(yīng)數(shù)據(jù)表記錄的主鍵值,簡稱為OID。PO的屬性應(yīng)當(dāng)都是可序列化的,最好PO自身實現(xiàn)java.io.Serializable接口。共五十頁建立(jinl)數(shù)據(jù)表根據(jù)關(guān)系模型建立相應(yīng)(xingyng)的數(shù)據(jù)表,數(shù)據(jù)表存放PO,示例建立Customer對應(yīng)的關(guān)系數(shù)據(jù)表。共五十頁 建立(jinl)PO與關(guān)系表的映射Hibernate通過XML配置文件來定義(dn

20、gy)PO與關(guān)系表的映射。共五十頁 PO與關(guān)系(gun x)表的映射示例共五十頁 PO映射(yngsh)PO映射主要由幾個部分組成PO類的映射,建立(jinl)PO類到關(guān)系數(shù)據(jù)表的映射OID的映射,建立PO的標(biāo)識符與關(guān)系表的主鍵的映射基本屬性的映射,建立PO的基本屬性與關(guān)系表的列的映射關(guān)系的映射,建立PO與PO的關(guān)系到關(guān)系數(shù)據(jù)庫中表與表之間的關(guān)系的映射。共五十頁 OID的映射(yngsh)OID的映射由OID屬性和主鍵值生成器兩部分組成元素用于映射OID屬性,與基本屬性映射一致(yzh)。的用于指定主鍵的生成器,主鍵生成器用于生成代理主鍵值,Hibernate根據(jù)不同的關(guān)系數(shù)據(jù)庫有提供大量的主

21、鍵生成器,用戶根據(jù)需要也可以自定義主鍵生成器。共五十頁 Hibernate主鍵生成器Hibernate常見(chn jin)主鍵生成器如下:標(biāo)識符生成器描述increment適用于代理主鍵,由hibernate自動以遞增的方式產(chǎn)生。identity適用于代理主鍵,由底層數(shù)據(jù)庫自動產(chǎn)生主鍵,底層數(shù)據(jù)庫需設(shè)置為自增的字段sequence適用于代理主鍵,Hibernate根據(jù) 底層的數(shù)據(jù)庫序列來產(chǎn)生標(biāo)識符,前提是數(shù)據(jù)庫需支持序列。hilo適用于代理主鍵,hibernate根據(jù)high/low算法來產(chǎn)生標(biāo)識符uuid適用于代理主鍵,Hibernate采用 128位UUID算法,來生成標(biāo)識符,UUID能

22、在網(wǎng)絡(luò)中產(chǎn)生唯一的標(biāo)識符,適用于字符串類型的主鍵。assigned適用于自然主鍵,由java程序負(fù)責(zé)產(chǎn)生標(biāo)識。在實際使用中應(yīng)當(dāng)盡量避免使用于自然主鍵。共五十頁 基本屬性(shxng)的映射元素(yun s)用于建立PO屬性與表列的映射,常見的屬性或子元素的含義如下:name 指定PO待映射的屬性名column 指定對應(yīng)的關(guān)系表的列名type 指定映射的數(shù)據(jù)類型,類型可以指定為Java的類型,Hibernate類型或關(guān)系數(shù)據(jù)庫類型。JAVA類型:java.lang.StringSQL類型:varcharHibernate類型:string共五十頁0 常見的類型(lixng)及其對應(yīng)關(guān)系SQL類型

23、Java類型Hibernate類型VARCHARStringstringINTInteger/intintCHARCharacter/charcharacterBITBoolean/booleanbooleanTEXTStringtextBLOBbytebinaryDATEjava.sql.DatedateTIMESTAMPjava.sql.Timestamptimestamp共五十頁1 使用XML配置映射(yngsh)的優(yōu)點Hibernate不會滲透到上層(shngcng)的域模型中,也不會滲透到下層的數(shù)據(jù)模型中。軟件開發(fā)人員可以獨立的設(shè)計域模型,而不必強(qiáng)迫遵守任何規(guī)范。數(shù)據(jù)庫設(shè)計人員也可以

24、獨立的設(shè)計數(shù)據(jù)模型,而不必強(qiáng)迫遵守任何規(guī)范。對象-關(guān)系的映射不依賴任何的程序代碼,如果需要修改對象-關(guān)系的映射,只需要修改XML文件,而不需要修改任何的程序代碼,提高了軟件的靈活性,并且更加容易維護(hù)。共五十頁5.3.3 使用(shyng)HibernateAPI執(zhí)行持久化Hibernate提供了對JDBC的完整(wnzhng)封裝用于執(zhí)行執(zhí)久化操作。Java應(yīng)用JDBC APIDBDriverManagerConnectionResultSet 基于JDBC的持久化操作Java應(yīng)用DBConfigurationSessionFactorySession Hiberate的持久化操作Hibern

25、ateAPIJDBCAPI共五十頁 Hibernate API體系結(jié)構(gòu)共五十頁 Hibernate APIConfiguration類用于描述Hibernate配置(pizh)示例Java中根據(jù)Hibernate配置文件構(gòu)建配置對象Configuration config = new Configuration();config.configure(resource/hibernate.cfg.xml);除了配置文件的方式之外,用戶也可以(ky)通過編程的方式設(shè)置和修改配置。config.setProperty(connection.pool_size, 20);config.addXML(E

26、mployee.hbm.xml);共五十頁SessionFactory用于產(chǎn)生Session接口的實例。Session是應(yīng)用程序與Hibernate的會話,提供了用于應(yīng)用程序執(zhí)行持久化操作(cozu)的方法。示例,Java中建立SessionFactory及Session的實例:SessionFactory sf = config.buildSessionFactory();Session session = sf.openSession(); Hibernate API共五十頁Session接口提供了應(yīng)用程序執(zhí)行持久化操作的方法,常見方法有:save 保存一個新的POsaveOrUpdate

27、 更新或保存POmerge 檢查數(shù)據(jù)庫中是否存在不存在即新加否則更新update 更新POdelete 刪除(shnch)POload/get根據(jù)OID加載POcreateQuery 根據(jù)提供的特定的HQL語言查詢POcreateCretiera 通過API方法查詢符合條件的PO Hibernate API共五十頁 Hibernate Session 使用(shyng)示例Customer cus = new Customer();cus.setAddress(XM);cus.setBirth(Date.valueOf(1982-02-02);cus.setName(Tony);/執(zhí)行新加保存session.save(cus);/加載并刪除session.delete(session.load(Customer.class, 1l);/根據(jù)(gnj)名稱查詢session.createQuery(from Customer a where “ + “ like %T%).list();共五十頁 SessionFactorySessionFactory用于建立Session的工廠類,一般一個數(shù)據(jù)源對應(yīng)一SessionFactory

溫馨提示

  • 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

提交評論