我的O/R Mapping实际开发经验之谈(二)

三、现有的 O/R Mapping 产品介绍

O/R Mapping 已经出现很久了, 产品很多: Java 方面的有 Hibernate 、 jdo 等。 .Net 的有 ObjectSpaces 、 Grove.Net 、 OJB.Net 、 AtomsFramework 、 Objectz.Net 、 OPF.Net 等。

1 、 Hibernate

Hibernate 是一个 java 开放源代码的 O/R Mapping ,它对 JDBC 进行了轻量级的对象封装,可以非常灵活的用对象编程思维来操纵数据库。现在以一个简单的 demo 看下 Hibernate 是怎样使用的:

首先 Hibernate 需要一个 hibernate.cfg.xml 配置文件

 1<hibernate-configuration>
 2<session-factory>
 3<!---  数据库的配置  \---->
 4<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/quickstart </property>
 5<property name="hibernate.connection.username">dbusername</property>
 6<property name="hibernate.connection.password">dbpassword</property>
 7<property name="hibernate.connection.pool.size">30</property>
 8<property name="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</property>
 9<!---  持久化类映射的  XML  文件名  \---->
10<mapping resource=" ormappingdemo.hibernate.Customer.xml"></mapping>
11</session-factory>
12</hibernate-configuration>

一个需要持久化类的表: Customer

CREATE TABLE dbo.Customer (

customerID int,

CustomerName varchar(100) NULL,

)


在 Hibernate 需要定义一个 Customer.xml 映射文件

 1<hibernate-mapping>
 2<!---  定义持久化类的类名和所映射的表名  \---->
 3<class name="ormappingdemo.hibernate.Customer" table="Customer">
 4<!---  定义主键  \---->
 5<id name="customerID" type="int" unsaved-value="null">
 6<column name="customerID " not-null="true" sql-type="int"></column>
 7<!---  主键的生成规则,  "increment"  表示该主键是自递增,  hibernate  有  10  多种的主键生成方法  \---->
 8<generator class="increment">
 9</generator>
10</id>
11<!---  定义类的属性  \---->
12<property name="Name">
13<!---  所映射的字段,这里可以看出表的字段名可以跟类属性名完全不同  \---->
14<column name="CustomerName" not-null="true" sql-type="varchar(100)"></column>
15</property>
16</class>
17</hibernate-mapping>

Customer.xml 里面定义了很多类的属性和表的字段的详细信息,如果有变动的,只需要更改这个 xml 文件就行。 Hibernate 定义 mapping 比较灵活, property 也可以不定义 property 里面的内容,用缺省的形式。

除了这个 xml 文件,还要有一个 持久化类 : Customer

package ormappingdemo.hibernate;

public class Customer {

private int customerID;

private String name;

public Customer() {

}

// 全部的属性都要通过 get 、 set 方法来访问

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 是个“瘦”类, 持久化类不需要实现什么特别的接口,也不需要从一个特别的持久化父类继承下来。到现在为止,一个 Customer 的映射的 持久化类工作完成,而这部分工作,可以通过 Hibernate 的一个 Schema 生成器的工具自动完成。现在,我们可以使用这个类了:

// 建立一个 Session 工厂

SessionFactory sessionFactory =

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

// 打开一个 Session

Session session = sessionFactory.openSession();

// 开始事务

Transaction tx = session.beginTransaction();

// 初始化一个持久化类

Customer theCustomer = new Customer();

// 赋值

theCustomer.setName("Karl");

// 保存新建的持久化类

session.save(theCustomer);

// 提交事务

tx.commit();

// 关闭 Session

session .close();


这段代码,你看不出任何传统跟数据库打交道的代码,需要的只是用持久化类和几个工厂化的类,就可以实现全部的功能。 Hibernate 还有一种极其强大的查询语言 HQL ,看上去很像 SQL 。但 HQL 是完全面向对象的。

Transaction tx = session.beginTransaction();

// 通过 HQL 语言进行查询。注意,这里的 HQL 是对象与属性,不是表和字段。如 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 的功能极其强大,结构合理,并且完全开发源代码,不需要 license 。无论是否用 java ,仔细研究 Hibernate ,对学习和开发 O/R Mapping 都有莫大的益处。

2 、 Castor JDO

Castor JDO ( Java 数据对象 (Java Data Objects) )也 是一种开放源码的、百分之百 Java 数据绑定框架。

Castor JDO 最早发布于 1999 年 12 月,它是第一批可用的开放源码数据绑定框架之一。自那时以来,这项技术已获得了长足的发展。现在,往往将 Castor JDO 同许多其它技术(既有开放源码的,也有商业的)结合使用,以将 Java 对象模型绑定到关系数据库、 XML 文档以及 LDAP 目录上。

同样这一节也是以一个 demo 来讲一下 Castor JDO,

Castor JDO 叫做 Java 数据对象 同样用了类似于 类似 javabean 的类来存储字据并表示数据之间的关系。

应用程序主要负责设置数据库连接和管理事务处理。数据库的设置是通过一个与映射文件相连接的独立的 XML 文件来实现的。

看看下面如同 Hibernate 的 sessionFactory 一样, Castor JDO 也封装了一个处理数据库资源的类,是 org.exolab.castor.jdo.JDO ,在里面定义了数据库的名字和属性,并被用来打开一个数据库连接。

我们可以通过使用 setConfiguration 命令来指定配置文件 URL ,我们可以装载数据库的配置。使用同一个配置来创建多个 JDO 对象只会装载配置文件一次。

下面的代码片展示了在如何打开一个数据库,并进行一个事务处理,然后关闭数据库的过程。

// 定义 JDO 对象

jdo = new JDO();

jdo.setDatabaseName( "CustomerDemo" );

jdo.setConfiguration( "database.xml" );

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

// 获取一个新的数据库

db = jdo.getDatabase();

// 开始事务处理

db.begin();

// 事务过程

. . .

// 提交事务,关闭数据库

db.commit();

db.close();


(待续)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus