三、现有的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 = nam