|            
三、现有的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配置文件
  <?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"表示该主键是自递增,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里面定义了很多类的属性和表的字段的详细信息,如果有变动的,只需要更改这个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();  
 
        <>  
 |