分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

三、现有的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();

(待续)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有