国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Hibernate作為數(shù)據(jù)持久層的分析和研究

2024-07-21 02:14:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  摘要 在java技術(shù)中有許多方法可以對(duì)數(shù)據(jù)進(jìn)行持久化,持久層也是java應(yīng)用程序中最重要的部分之一。本文在分析了3種持久層主流解決方案的基礎(chǔ)上,介紹了o-r映射開(kāi)源項(xiàng)目hibernate,并介紹了在web應(yīng)用開(kāi)發(fā)中怎樣配置hibernate的環(huán)境,并使用它建立一個(gè)應(yīng)用。

  關(guān)鍵字 hibernate,數(shù)據(jù)持久化,jdbc, ejb,jdo

  數(shù)據(jù)持久層簡(jiǎn)介

  j2ee的三層結(jié)構(gòu)是指表示層(presentation),業(yè)務(wù)邏輯層(business logic)以及基礎(chǔ)架構(gòu)層(infrastructure),這樣的劃分非常經(jīng)典,但是在實(shí)際的項(xiàng)目開(kāi)發(fā)法中,開(kāi)發(fā)者通常對(duì)三層結(jié)構(gòu)進(jìn)行擴(kuò)展來(lái)滿(mǎn)足一些項(xiàng)目的具體要求,一個(gè)最常用的擴(kuò)展就是將三層體系擴(kuò)展為五層體系,即表示層(presentation),控制/中介層(controller/mediator)、領(lǐng)域?qū)?domain),數(shù)據(jù)持久層(data persistence)和數(shù)據(jù)源層(data source)。它其實(shí)是在三層架構(gòu)中增加了兩個(gè)中間層??刂?中介層位于表示層和領(lǐng)域?qū)又g,數(shù)據(jù)持久層位于領(lǐng)域?qū)雍突A(chǔ)架構(gòu)層之間。由于對(duì)象范例和關(guān)系范例這兩大領(lǐng)域之間存在“阻抗不匹配”,所以把數(shù)據(jù)持久層單獨(dú)作為j2ee體系的一個(gè)層提出來(lái)的原因就是能夠在對(duì)象-關(guān)系數(shù)據(jù)庫(kù)之間提供一個(gè)成功的企業(yè)級(jí)映射解決方案,盡最大可能彌補(bǔ)這兩種范例之間的差異。

  三種持久層主流解決方案

  1、jdbc

  許多開(kāi)發(fā)者用jdbc進(jìn)行數(shù)據(jù)庫(kù)程序的開(kāi)發(fā)。此中方式很多情況下都使用dao模式,采用sql進(jìn)行查詢(xún)。雖然用此方式可以使應(yīng)用程序代碼與具體的數(shù)據(jù)庫(kù)廠商和數(shù)據(jù)庫(kù)位置無(wú)關(guān),不過(guò)jdbc是低級(jí)別的數(shù)據(jù)庫(kù)訪問(wèn)方式,jdbc并不支持面向?qū)ο蟮臄?shù)據(jù)庫(kù)表示。jdbc數(shù)據(jù)庫(kù)表示完全圍繞關(guān)系數(shù)據(jù)庫(kù)模型。在大型應(yīng)用程序的dao中書(shū)寫(xiě)這樣的代碼,維護(hù)量是非常大的。

  2、ejb

  在j2ee的規(guī)范中,為ejb定義了兩種持久化的解決方案:一種是bmp,另一種是cmp。其中cmp不需要將sql語(yǔ)句加入到代碼中。目前,在采用j2ee的應(yīng)用中,ejb cmp方式得到了廣泛應(yīng)用。更加引人注意的是,隨著ejb規(guī)范的發(fā)展,cmp也包含了一些高級(jí)關(guān)系的內(nèi)容。但是,cmp的使用比較復(fù)雜,對(duì)很多開(kāi)發(fā)人員來(lái)說(shuō)比較難以掌握。而且,不是在所有的情況下都適合在系統(tǒng)中采用ejb,而且想要非常清楚的了解ejb規(guī)范也是非常費(fèi)時(shí)的。在用ejb編碼前,先要讓專(zhuān)家理解api,然后需要了解每一個(gè)容器部署時(shí)所要關(guān)注的技術(shù)。此外,許多情況下商用容器的性能和支持也不是很好。

  3、jdo

  jdo是一個(gè)存儲(chǔ)java對(duì)象的規(guī)范,jdo規(guī)范1.0的提出可以使你將精力集中在設(shè)計(jì)java對(duì)象模型,然后在企業(yè)應(yīng)用軟件架構(gòu)的不同層面中存儲(chǔ)傳統(tǒng)的java對(duì)象(plain old java objects,簡(jiǎn)稱(chēng)pojos),采用jdoql語(yǔ)言進(jìn)行sql操作。一些公司(包括sun)企圖根據(jù)jdo規(guī)范進(jìn)行設(shè)計(jì)并實(shí)現(xiàn)jdo產(chǎn)品,然而他們都不能很好的進(jìn)行實(shí)現(xiàn),并且性能優(yōu)化上比較差。

  數(shù)據(jù)持久層新的解決方案hibernate

  1、hibernate介紹

  hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)jdbc進(jìn)行了輕量級(jí)的對(duì)象封裝,使java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。它不僅提供了從java類(lèi)到數(shù)據(jù)表之間的映射,也提供了數(shù)據(jù)查詢(xún)和恢復(fù)機(jī)制。相對(duì)于使用jdbc和sql來(lái)手工操作數(shù)據(jù)庫(kù), hibernate可以大大減少操作數(shù)據(jù)庫(kù)的工作量。 另外hibernate可以利用代理模式來(lái)簡(jiǎn)化載入類(lèi)的過(guò)程,這將大大減少利用hibernate ql從數(shù)據(jù)庫(kù)提取數(shù)據(jù)的代碼的編寫(xiě)量,從而節(jié)約開(kāi)發(fā)時(shí)間和開(kāi)發(fā)成本hibernate可以和多種web服務(wù)器或者應(yīng)用服務(wù)器良好集成,如今已經(jīng)支持幾乎所有的流行的數(shù)據(jù)庫(kù)服務(wù)器。

  2、hibernate原理

  hibernate技術(shù)本質(zhì)上是一個(gè)提供數(shù)據(jù)庫(kù)服務(wù)的中間件。它的架構(gòu)如圖1所示:


圖1


  圖1顯示了hibernate的工作原理,它是利用數(shù)據(jù)庫(kù)以及其他一些配置文件如hibernate.properties,xml mapping等來(lái)為應(yīng)用程序提供數(shù)據(jù)持久化服務(wù)的。

  hibernate具有很大的靈活性,但同時(shí)它的體系結(jié)構(gòu)比較復(fù)雜,提供了好幾種不同的運(yùn)行方式。在輕型體系中,應(yīng)用程序提供jdbc連接,并且自行管理事務(wù),這種方式使用了hibernate的一個(gè)最小子集;在全面解決體系中,對(duì)于應(yīng)用程序來(lái)說(shuō),所有底層的jdbc/jta api都被抽象了,hibernate會(huì)替你照管所有的細(xì)節(jié)。

  使用hibernate建立一個(gè)應(yīng)用

  1、配置hibernate

  在src 目錄下創(chuàng)建名為hibernate.cfg.xml 的配置文件,并且將它的路徑添加到應(yīng)用的類(lèi)路徑中就可以完成hibernate 的配置。該配置文件由hibernate 用來(lái)連接到數(shù)據(jù)庫(kù)、生成模式和獲得其它特定數(shù)據(jù)庫(kù)信息的屬性組成。要將底層數(shù)據(jù)庫(kù)內(nèi)的變動(dòng)反射到整個(gè)應(yīng)用,只需要修改該文件內(nèi)的屬性值。該配置文件的內(nèi)容如下:

<!doctype hibernate-configuration public "-//hibernate/hibernate configuration dtd 2.0//en" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
<session-factory>
?。紁roperty name="hibernate.connection.driver_class">com.ibm.db2.jdbc.app.db2driver</property>
 <property name="hibernate.connection.url">jdbc:db2:cipdb</property>
?。紁roperty name="hibernate.connection.username">admin</property>
 <property name="hibernate.connection.password">rubipass</property>
?。紁roperty name="dialect">cirrus.hibernate.sql.db2dialect</property>
?。糾apping resource="com/ubipass/cip/data/event.hbm.xml"/>
</session-factory>
</hibernate-configuration>

  2、創(chuàng)建映射文檔

  映射文檔是用來(lái)定義持久數(shù)據(jù)和在需要時(shí)保存關(guān)于對(duì)象的持久域、關(guān)聯(lián)、子類(lèi)和代理的xml文檔。對(duì)于每個(gè)持久對(duì)象和以名字class_name.hbm.xml保存的文件來(lái)說(shuō),都要?jiǎng)?chuàng)建一個(gè)映射文檔。在class_name.hbm.xml中class_name就是對(duì)象的類(lèi)名,下面是event.hbm.xml的內(nèi)容。

<!doctype hibernate-mapping public

"-//hibernate/hibernate mapping dtd 2.0//en" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
 <class name="com.ubipass.cip.event" table="events">
  <id name="id" column="uid" type="long">
  ?。糶enerator class="increment"/>
 ?。?id>
 ?。紁roperty name="date" column="event_date" type="timestamp"/>
 ?。紁roperty name="title" column="event_title" type="string"/>
?。?class>
</hibernate-mapping>

  映射文檔在應(yīng)用啟動(dòng)時(shí)編譯,它可為hibernate 提供關(guān)于持久對(duì)象的相應(yīng)類(lèi)、它們的結(jié)構(gòu)、它們應(yīng)該映射到哪個(gè)數(shù)據(jù)庫(kù)表格、以及如何映射的信息。hibernate 也使用這些映射文檔,分別利用內(nèi)建設(shè)備schemaexport和codegenerator來(lái)生成相應(yīng)的數(shù)據(jù)庫(kù)模式和stub java類(lèi)。

  3、生成用于持久對(duì)象的stub java類(lèi)

  在創(chuàng)建了映射文檔之后這個(gè)任務(wù)就變得簡(jiǎn)單的多。stub類(lèi)的創(chuàng)建使用hibernate的內(nèi)建設(shè)備 codegenerator ,執(zhí)行一個(gè)簡(jiǎn)單的命令就可以完成。,命令的語(yǔ)法如下:

java -cp classpath net.sf.hibernate.tool.hbm2java.codegenerator

options mapping_files

  它為classpath、options、和mapping_files參數(shù)提供了恰當(dāng)?shù)闹?。下面是通過(guò)映射文檔event.hbm.xml生成的stub java 類(lèi)的部分代碼。
 
package com.ubipass.cip
public class event {
 private string title;
 ……
 event(){ }
 public long getid() {
  return id;
 }
 private void setid(long id) {
  this.id = id;
 }
 ……
}

  4、生成數(shù)據(jù)庫(kù)模式

  要使用hibernate的 schemaexport 來(lái)生成數(shù)據(jù)庫(kù)模式,在提交了用于參數(shù)的恰當(dāng)值之后執(zhí)行下列命令:

java -cp classpath net.sf.hibernate.tool.hbm2ddl.schemaexport options mapping_files

  此命令為classpath、options、和mapping_files 參數(shù)提供了恰當(dāng)?shù)闹?。圖2顯示了由映射文檔生成的模式的外形。


圖2

  5、初始化并運(yùn)行hibernate的代碼

  要初始化和運(yùn)行hibernate,需要采取以下步驟:

  ·在恰當(dāng)?shù)念?lèi)中,初始化和組裝想要的持久對(duì)象 ;

  ·在應(yīng)用啟動(dòng)時(shí)使用net.sf.hibernate.cfg.configuration 對(duì)象獲取net.sf.hibernate.sessionfactory 對(duì)象 ;

  ·調(diào)用sessionfactory 對(duì)象上的opensession() 方法來(lái)打開(kāi)net.sf.hibernate.session ;

  ·保存想要的對(duì)象,關(guān)閉session。

  下面的代碼顯示了如何對(duì)上述的步驟進(jìn)行實(shí)現(xiàn):

// 初始化持久對(duì)象

event ev = new event();
ev.setdate("1/4/2004")
ev.settitle("hibernate startup");
try {
 //開(kāi)始hibernate
 configuration cfg = new configuration().addclass(event.class);
 sessionfactory sf = cfg.buildsessionfactory();
 //打開(kāi) session
 session sess = sf.opensession();
} catch (hibernateexception e) {
 e.printstacktrace();
}

//保存 product 并關(guān)閉 session

transaction t = sess.begintransaction();
sess.save(ev);
t.commit();
sess.close();

  總結(jié)

  hibernate是一個(gè)功能強(qiáng)大,可以有效地進(jìn)行數(shù)據(jù)庫(kù)數(shù)據(jù)到業(yè)務(wù)對(duì)象的o/r映射方案。hibernate推動(dòng)了基于普通java對(duì)象模型,用于映射底層數(shù)據(jù)結(jié)構(gòu)的持久對(duì)象的開(kāi)發(fā)。通過(guò)將持久層的生成自動(dòng)擴(kuò)展到一個(gè)更大的范圍,hibernate 使開(kāi)發(fā)人員專(zhuān)心實(shí)現(xiàn)業(yè)務(wù)邏輯而不用分心于繁瑣的數(shù)據(jù)庫(kù)方面的邏輯,同時(shí)提供了更加合理的模塊劃分的方法。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥芬河市| 临湘市| 德庆县| 清苑县| 日照市| 河津市| 梅州市| 永德县| 阳曲县| 鄂尔多斯市| 资溪县| 喜德县| 兴山县| 获嘉县| 鄄城县| 荣昌县| 富锦市| 通州区| 嵩明县| 宁化县| 丹凤县| 沾化县| 门头沟区| 崇义县| 远安县| 大足县| 南溪县| 博湖县| 友谊县| 卢氏县| 宁阳县| 旬邑县| 玛纳斯县| 涞水县| 达孜县| 闵行区| 威信县| 西乌| 瓦房店市| 珲春市| 梁山县|