接上)
具体过程如下:
(1)首先建立数据库配置文件,我们在这里定为database.xml,当然也可以改成是其它名字。
<?xml version="1.0" encoding="gb2312"?>
<database name="customerdemo" engine="mysql">
<driver url="jdbc:mysql://cwb:3306/quickstart" class-name="org.gjt.mm.mysql.driver">
<param name="user" value="dbusername"/>
<param name="password" value="dbpassword "/>
</driver>
<mapping href="customer.xml"/>
</database>
建立影射文件customer.xml
<?xml version="1.0" encoding="gb2312"?>
<class name="demo.customer" access="shared" identity="customerid">
<map-to table="users"/>
<field name="customerid" type="integer">
<sql name="customerid" type="integer"/>
</field>
<field name="name" type="string">
<sql name="name" type="varchar"/>
</field>
</class>
建立持久化类,与hibernate的是一样的类似javabean的类
package demo;
public class customer {
private string name;
private int customerid;
public customer() {
}
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;
}
}
基本的实现后,我们可以看看这个demo怎么运行。
import java.util.*;
import org.exolab.castor.jdo.*;
import java.net.*;
public class customermanager {
jdo jdo;
database db;
public customermanager() throws databasenotfoundexception,
persistenceexception {
//定义一个jdo对象
jdo = new jdo();
jdo.setdatabasename("customerdemo");
jdo.setconfiguration("database.xml");
jdo.setclassloader(getclass().getclassloader());
//获得连接数据库
db = jdo.getdatabase();
}
/**
* 用于读取用户
* @param id customer 对象的主键
*/
public customer loadcustomer(integer id) throws databasenotfoundexception,
persistenceexception {
customer result = null;
//开始事务
db.begin();
result = (customer) db.load(customer.class, id);
//完成事务,关闭数据库
db.commit();
db.close();
return result;
}
/**
* 用于建立用户
* @param customer newcustomer 新对象
*/
public void createcustomer(customer newcustomer) throws
databasenotfoundexception,
persistenceexception {
customer result = null;
db.begin();
//新建customer
db.create(newcustomer);
db.commit();
db.close();
}
/**
* 更新旧的对象
*/
public customer updatecustomer(customer updatecustomer) throws
databasenotfoundexception,
persistenceexception {
db.begin();
//更新customer
db.update(updatecustomer);
db.commit();
db.close();
return null;
}
public void removecustomer(customer removecustomer) throws
databasenotfoundexception,
persistenceexception {
db.begin();
//删除customer
db.remove(removecustomer);
db.commit();
db.close();
}
}
在castor jdo对象模型上执行查询
castor 实现了对象查询语言(oql)的 odmg 3.0 规范的一个子集。oql 的语法类似于 sql 的语法,但它却使您能够查询对象模型,而不是直接查询数据库。在支持多个数据库时,这可能是一项强大的功能。castor 的 oql 实现在内部将 oql 查询转换成用于数据库的适当的 sql。使用 bind() 方法将参数绑定到查询上。以下是 oql 查询的一些简单示例。
castor 的 oql 实现并不在整个查询中继续使用全限定对象名,相反它支持对象别名的使用。在下面的这些查询中,c 就是这样的一个别名。
如果想要查询以找出所有 customer,可以执行下列查询:
select c from demo.customer c
如果想要查询以找出标识等于 1234 的customer,可以以:
select c from demo.customer c where c.customerid= $1
开始,后跟:
query.bind( 1234 )
要查询名称与特殊字符串相似的 customer,可以执行下列查询:
select c from demo.customer c where c.name like $1
后跟:
query.bind( "%abcd%" )
3、objectspaces
objectspaces是微软.net下面的o/r mapping,到目前为止还是beta版,相信会在vs.net 2004出现正式版。.net下的o/r mapping没有像java方面那样的兴旺,开放源码的也不多,ojb. net、atomsframework、opf.net等,都有相当的知名度,但还在不断的成熟之中。ado.net功能强大,与jdbc有很多不同的地方,所以.net下的o/r mapping有很多自己的特色。
现在简单的介绍下objectspaces的用法,大家可以跟hibernate和jdo比较一下。
objectspaces同样有一个配置source.xml文件:
<sources xmlns="http://www.microsoft.com/objectspaces-v1">
<!-数据连接的配置–>
<source name="demo" adapter="sql" connection="data source=localhost; integrated security=sspi; database=customerdemo"/>
</sources>
每个持久化类也有对应的一个map.xml:
<map xmlns="http://www.microsoft.com/objectspaces-v1">
<type name="customer" datasource="customer">
<property name="customerid" datasource="customerid"/>
<property name="name" datasource="customername"/>
</type>
</map>
大家有hibernate上面的例子,相信很容易看得懂这段xml,很多都是大同小异。同样,也需要一个持久化类:
public abstract class customer
{
//定义主键
[uniqueid] public abstract int customerid { get; set; }
//同样定义属性
public abstract string name { get; set; }
public void oncreate(int newid)
{
customerid = newid;
}
}
使用的例子:
//装入source.xml,建立objectspace工厂
iobjectspace os = objectspacefactory.createobjectspace("source.xml");
//新建一个customer
customer thecustomer = (customer) os.createobject( typeof(customer), "1" );
thecustomer.name = "karl";
//保存新增的customer
os.updateall();
如果需要用数据库保存持久化类,写法有点不同:
//建立connection
string connectionstring = "data source=localhost;integrated security=sspi;initial catalog=customerdemo;";
sqlconnection connection = new sqlconnection(connectionstring);
sqldataadapter thesqldataadapter = new sqldataadapter("select * from customer",
connection);
dataset ds = new dataset("customer");
thesqldataadapter.fill(ds, "customer");
//建立一个dataspace实例
dataspace thedataspace = new dataspace("map.xml", ds);
//从dataspace取name是"karl" 的customer.
customer thecustomer = (customer) thedataspace.getobject(typeof(customer), "name=karl ");
//修改name
thecustomer.name = "little karl";
以上简单的介绍了一下hibernate、jdo和objectspaces的使用,要想更加的深入理会,那要好好自己研究下了。
(下一章 《四、我的第一版o/r mapping介绍》)