首页 > 开发 > 综合 > 正文

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

2024-07-21 02:17:11
字体:
来源:转载
供稿:网友
三、现有的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();





(待续)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表