明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

我的O/R Mapping實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)之談(二)

[摘要]三、現(xiàn)有的O/R Mapping產(chǎn)品介紹 O/R Mapping已經(jīng)出現(xiàn)很久了, 產(chǎn)品很多:Java方面的有Hibernate、jdo等。.Net的有ObjectSpaces、Grove.N...
三、現(xiàn)有的O/R Mapping產(chǎn)品介紹

O/R Mapping已經(jīng)出現(xiàn)很久了, 產(chǎn)品很多:Java方面的有Hibernate、jdo等。.Net的有ObjectSpaces、Grove.Net、OJB.Net、AtomsFramework、Objectz.Net、OPF.Net等。



1、Hibernate

Hibernate是一個(gè)java開(kāi)放源代碼的O/R Mapping,它對(duì)JDBC進(jìn)行了輕量級(jí)的對(duì)象封裝,可以非常靈活的用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù),F(xiàn)在以一個(gè)簡(jiǎn)單的demo看下Hibernate是怎樣使用的:



首先Hibernate需要一個(gè)hibernate.cfg.xml配置文件

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>

<session-factory>

<!-數(shù)據(jù)庫(kù)的配置 -->

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/quickstart </property>

<property name="hibernate.connection.username">dbusername</property>

<property name="hibernate.connection.password">dbpassword</property>

<property name="hibernate.connection.pool.size">30</property>

<property name="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</property>

<!-持久化類映射的XML文件名 -->

<Mapping resource=" ormappingdemo.hibernate.Customer.xml"/>

</session-factory>

</hibernate-configuration>





一個(gè)需要持久化類的表:Customer

CREATE TABLE dbo.Customer (

customerID int,

CustomerName varchar(100) NULL,

)





在Hibernate需要定義一個(gè)Customer.xml映射文件

<?xml version="1.0"?>

<!DOCTYPE hibernate-Mapping

PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

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



<hibernate-Mapping>



<!-定義持久化類的類名和所映射的表名 -->

<class name="ormappingdemo.hibernate.Customer" table="Customer">



<!-定義主鍵 -->

<id name="customerID" type="int" unsaved-value="null" >

<column name="customerID " sql-type="int" not-null="true"/>



<!-主鍵的生成規(guī)則,"increment"表示該主鍵是自遞增,hibernate有10多種的主鍵生成方法-->

<generator class="increment">

</generator>

</id>

<!-定義類的屬性 -->

<property name="Name">

<!-所映射的字段,這里可以看出表的字段名可以跟類屬性名完全不同 -->

<column name="CustomerName" sql-type="varchar(100)" not-null="true"/>

</property>

</class>

</hibernate-Mapping>





Customer.xml里面定義了很多類的屬性和表的字段的詳細(xì)信息,如果有變動(dòng)的,只需要更改這個(gè)xml文件就行。Hibernate定義mapping比較靈活, property也可以不定義property里面的內(nèi)容,用缺省的形式。

除了這個(gè)xml文件,還要有一個(gè)持久化類:Customer

package ormappingdemo.hibernate;



public class Customer {



private int customerID;

private String name;



public Customer() {

}

//全部的屬性都要通過(guò)get、set方法來(lái)訪問(wèn)

public int getCustomerID() {

return customerID;

}



public void setCustomerID(int customerID) {

this.customerID = customerID;

}



public String getName() {

return name;

}



public void setName(String name) {

this.name = name;

}

}





Customer是個(gè)“瘦”類,持久化類不需要實(shí)現(xiàn)什么特別的接口,也不需要從一個(gè)特別的持久化父類繼承下來(lái)。到現(xiàn)在為止,一個(gè)Customer的映射的持久化類工作完成,而這部分工作,可以通過(guò)Hibernate的一個(gè)Schema 生成器的工具自動(dòng)完成。現(xiàn)在,我們可以使用這個(gè)類了:

  //建立一個(gè)Session工廠

  SessionFactory sessionFactory =

new Configuration().configure().buildSessionFactory();



  //打開(kāi)一個(gè)Session

  Session session = sessionFactory.openSession();



  //開(kāi)始事務(wù)

  Transaction tx = session.beginTransaction();



  //初始化一個(gè)持久化類

  Customer theCustomer = new Customer();



  //賦值

  theCustomer.setName("Karl");



  //保存新建的持久化類

  session.save(theCustomer);



  //提交事務(wù)

  tx.commit();



  //關(guān)閉Session

  session .close();





這段代碼,你看不出任何傳統(tǒng)跟數(shù)據(jù)庫(kù)打交道的代碼,需要的只是用持久化類和幾個(gè)工廠化的類,就可以實(shí)現(xiàn)全部的功能。Hibernate還有一種極其強(qiáng)大的查詢語(yǔ)言HQL,看上去很像SQL。但HQL是完全面向?qū)ο蟮摹?br>
Transaction tx = session.beginTransaction();



//通過(guò)HQL語(yǔ)言進(jìn)行查詢。注意,這里的HQL是對(duì)象與屬性,不是表和字段。如Name是持久化類的屬性,真正所映射的表字段名是CustomerName

Query query = session.createQuery("select Name from Customer as customer where customer.customerID>=:ID");



query.setInteger("ID", 1);



//用迭代遍歷Customer

for (Iterator it = query.iterate(); it.hasNext();) {

Customer theCustomer = (Customer) it.next();

out.println("Customer : " + theCustomer.getName() );

}



tx.commit();





Hibernate的功能極其強(qiáng)大,結(jié)構(gòu)合理,并且完全開(kāi)發(fā)源代碼,不需要license。無(wú)論是否用java,仔細(xì)研究Hibernate,對(duì)學(xué)習(xí)和開(kāi)發(fā)O/R Mapping都有莫大的益處。



2、Castor JDO

Castor JDO(Java 數(shù)據(jù)對(duì)象 (Java Data Objects))也是一種開(kāi)放源碼的、百分之百 Java 數(shù)據(jù)綁定框架。

Castor JDO 最早發(fā)布于 1999 年 12 月,它是第一批可用的開(kāi)放源碼數(shù)據(jù)綁定框架之一。自那時(shí)以來(lái),這項(xiàng)技術(shù)已獲得了長(zhǎng)足的發(fā)展。現(xiàn)在,往往將 Castor JDO 同許多其它技術(shù)(既有開(kāi)放源碼的,也有商業(yè)的)結(jié)合使用,以將 Java 對(duì)象模型綁定到關(guān)系數(shù)據(jù)庫(kù)、XML 文檔以及 LDAP 目錄上。

同樣這一節(jié)也是以一個(gè)demo來(lái)講一下Castor JDO,

Castor JDO 叫做 Java 數(shù)據(jù)對(duì)象 同樣用了類似于 類似 javabean 的類來(lái)存儲(chǔ)字據(jù)并表示數(shù)據(jù)之間的關(guān)系。

應(yīng)用程序主要負(fù)責(zé)設(shè)置數(shù)據(jù)庫(kù)連接和管理事務(wù)處理。數(shù)據(jù)庫(kù)的設(shè)置是通過(guò)一個(gè)與映射文件相連接的獨(dú)立的XML文件來(lái)實(shí)現(xiàn)的。

看看下面如同Hibernate的sessionFactory一樣,Castor JDO 也封裝了一個(gè)處理數(shù)據(jù)庫(kù)資源的類,是org.exolab.castor.jdo.JDO,在里面定義了數(shù)據(jù)庫(kù)的名字和屬性,并被用來(lái)打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接。

我們可以通過(guò)使用setConfiguration命令來(lái)指定配置文件URL,我們可以裝載數(shù)據(jù)庫(kù)的配置。使用同一個(gè)配置來(lái)創(chuàng)建多個(gè)JDO對(duì)象只會(huì)裝載配置文件一次。



下面的代碼片展示了在如何打開(kāi)一個(gè)數(shù)據(jù)庫(kù),并進(jìn)行一個(gè)事務(wù)處理,然后關(guān)閉數(shù)據(jù)庫(kù)的過(guò)程。

// 定義JDO對(duì)象

jdo = new JDO();

jdo.setDatabaseName( "CustomerDemo" );

jdo.setConfiguration( "database.xml" );

jdo.setClassLoader( getClass().getClassLoader());

// 獲取一個(gè)新的數(shù)據(jù)庫(kù)

db = jdo.getDatabase();

// 開(kāi)始事務(wù)處理

db.begin();



// 事務(wù)過(guò)程

. . .

// 提交事務(wù),關(guān)閉數(shù)據(jù)庫(kù)

db.commit();

db.close();




<>