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

类别:.NET开发 点击:0 评论:0 推荐:

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

     O/R Mapping已经出现很久了, 产品很多:Java方面的有Hibernatejdo等。.Net的有ObjectSpacesGrove.NetOJB.NetAtomsFrameworkObjectz.NetOPF.Net等。

 

     1Hibernate

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

 

     首先Hibernate需要一个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>

        <!-数据库的配置 -->

         <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>

    

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

CREATE TABLE dbo.Customer (

  customerID int,

  CustomerName varchar(100) NULL,

  )

    

Hibernate需要定义一个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"/>

 

            <!-主键的生成规则,"increment"表示该主键是自递增,hibernate10多种的主键生成方法-->

            <generator class="increment">

            </generator>

        </id>

         <!-定义类的属性  -->

        <property name="Name">

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

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

        </property>

    </class>

</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() {

    }

    //全部的属性都要通过getset方法来访问

    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都有莫大的益处。

 

2Castor JDO

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

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

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

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

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

看看下面如同HibernatesessionFactory一样,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();

    

(待续)

本文地址:http://com.8s8s.com/it/it44856.htm