【正文】
對象 /關(guān)系映射 — Hibernate ? 學(xué)員要求 :熟悉 Java、 SQL、 JDBC,掌握面向?qū)ο蟮?開發(fā) 方法,并有實(shí)際項(xiàng)目開發(fā)經(jīng)驗(yàn) ? 課程目標(biāo): 理解 O/R Mapping原理,掌握Hibernate開發(fā)的相關(guān)知識(shí),并能使用Hibernate進(jìn)行實(shí)際項(xiàng)目開發(fā) 作者:趙青 目 錄 ? 持久層的概念及必要性 ? hibernate框架及核心類介紹 ? hibernate進(jìn)行持久化的一個(gè)例子 ? hibernate如何解決對象和模型的不匹配 ? 對象的持久性生命周期 ? 對目前項(xiàng)目的進(jìn)一步封裝和思考 數(shù)據(jù)的持久化 dcba數(shù) 據(jù) 庫 消 息 隊(duì) 列文 件 系 統(tǒng)內(nèi) 存 中 的 數(shù) 據(jù)持久化 ?持久層 持久化如何演變?yōu)槌志脤樱? 是不是只要在應(yīng)用中用了數(shù)據(jù)庫就天然具備了“持久層”了呢?未必! 只有持久化而沒有持久層 網(wǎng)上商城購物結(jié)算的例子 c u s t o m e rP K i d l e v e l s u m _ a m o u n tp r o m o t i o nP K i d l e v e l r a t i o沒有持久層的特征 ? 業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問邏輯混雜在一起,沒有清晰的界限,干擾了我們的視線,難于理解。 ? 業(yè)務(wù)規(guī)則的變動(dòng)必然影響到數(shù)據(jù)庫的訪問邏輯,反之亦然,笨重,難于維護(hù)。 ? 好處是:簡單方便、開發(fā)迅速,不需要復(fù)雜的設(shè)計(jì),比較適合于業(yè)務(wù)簡單的應(yīng)用。 引入持久層后的系統(tǒng)架構(gòu) 改良后的設(shè)計(jì) C u st o m e rl e v e lsu m A m o u n t: i n t: B i g D e ci m a lP r o m o t i o nl e v e lr a t i o: i n t: d o u b l eC u st o m e r D a o++g e t C u st o m e r ( S t r i n g cu st o m e r I D )sa v e ( C u st o m e r cu st o m e r ): C u st o m e r: v o i dP r o m o t i o n D a o+ g e t P r o m o t i o n ( i n t l e v e l ) : P r o m o t i o n引入 DAO模式 ? DAO = Data Accessor Object 數(shù)據(jù)訪問對象 ? 數(shù)據(jù)庫訪問的實(shí)現(xiàn)細(xì)節(jié)被隱藏到 DAO里面。 ? Domain Object則提供了面向領(lǐng)域的對象,封裝了具體的業(yè)務(wù)規(guī)則。 引入 DAO模式的優(yōu)點(diǎn) ? 業(yè)務(wù)層無需關(guān)心具體的 select、 insert等操作,使得業(yè)務(wù)業(yè)務(wù)邏輯實(shí)現(xiàn)更加清晰,也使得開發(fā)人員的專業(yè)劃分成為可能,業(yè)務(wù)人員專注于業(yè)務(wù)邏輯編碼。 ? 業(yè)務(wù)層和持久層可以彼此獨(dú)立的變化,比如:僅僅替換數(shù)據(jù)訪問層的實(shí)現(xiàn),可以將系統(tǒng)部署在不同的數(shù)據(jù)庫平臺(tái)上。 改良后的代碼 觀察 DAO的實(shí)現(xiàn)細(xì)節(jié) 問題的癥狀 用 JDBC實(shí)現(xiàn)持久層 ? 為域中的每個(gè)類手工編寫持續(xù)性代碼的工作量繁重。 ? 這些代碼基本上都是“支撐性”代碼,單調(diào)、機(jī)械、乏味、不優(yōu)雅。 ? 特別是需要支持多種 SQL方言時(shí),對于持久層的開發(fā)者是個(gè)大難題。 新需求的產(chǎn)生 通用的持久層框架 ? 將編寫支撐性代碼的工作量降到最低。編碼是有趣的工作,但是敲鍵盤決不有趣。凡是無趣的工作都交給機(jī)器去完成。 ? 對象模型和關(guān)系模型的映射( ORM),編碼時(shí)只需要關(guān)心對象,而無需再糾纏于JDBC ResultSet中的字段。 ? 更好的移植性,只需要簡單的修改配置參數(shù),即可實(shí)現(xiàn)底層數(shù)據(jù)庫的切換。 目 錄 ? 持久層的概念及必要性 ? hibernate框架及核心類介紹 ? hibernate進(jìn)行持久化的一個(gè)例子 ? hibernate如何解決對象和模型的不匹配 ? 對象的持久性生命周期 ? 對目前項(xiàng)目的進(jìn)一步封裝和思考 Hibernate在應(yīng)用中的位置 基于 B/S的典型三層架構(gòu) 開發(fā)如何分層? 業(yè)務(wù)邏輯層和持久化層絕不要依賴于展現(xiàn)層。 持久層對于業(yè)務(wù)層是透明的,持久層和業(yè)務(wù)層的變化是彼此獨(dú)立的。 Hibernate核心架構(gòu) Configuration ?Configuration 類負(fù)責(zé)管理 Hibernate 的配置信息。它包括如下內(nèi)容: ? Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫的 URL、用戶名、密碼、 JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫Dialect,數(shù)據(jù)庫連接池等。 ? Hibernate映射文件( *.)。 ? Configuration cfg = new Configuration()。 SessionFactory ? 會(huì)話工廠緩存了生成的 SQL語句和 Hibernate在運(yùn)行時(shí)使用的映射元數(shù)據(jù)。 ? 會(huì)話工廠在應(yīng)用初始化時(shí)被創(chuàng)建,是一個(gè)重量級(jí)的類,它在多個(gè)應(yīng)用線程間進(jìn)行被共享,通常情況下,整個(gè)應(yīng)用只有唯一的一個(gè)會(huì)話工廠,然而,如果你使用 Hibernate訪問多個(gè)數(shù)據(jù)庫,你需要對每一個(gè)數(shù)據(jù)庫使用一個(gè)會(huì)話工廠。 ? 應(yīng)用程序從會(huì)話工廠里獲得 Session(會(huì)話 )實(shí)例。 ? SessionFactory sessionFactory = ()。 Session ? Session也稱為持久化管理器,因?yàn)樗桥c持久化有關(guān)的操作接口。 ? Session代表與數(shù)據(jù)庫之間的一次操作。 ? Session通過 SessionFactory打開,在所有的工作完成后,需要關(guān)閉。 ? 會(huì)話并不是線程安全的因此應(yīng)該被設(shè)計(jì)為每次只能在一個(gè)線程中使用 。 ? Session session = ()。 Transaction (事務(wù) ) ? Transaction將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來 ——可能是一個(gè) JDBC事務(wù)或一個(gè) JTA事務(wù),這有助于保持 Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性