分享
 
 
 

使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量

王朝java/jsp·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

一、什么是对象-关系映射(ORM)?

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

二、为什么要引入对象-关系映射中间件?

在开发关系数据库的系统时,可以通过SQL语句读取及操作关系数据库数据。在Java领域,可以直接通过JDBC编程来访问数据库。JDBC可以说是JAVA访问关系数据库的最原始、最直接的方法。这种方式的优点是运行效率高,缺点是在Java程序代码中嵌入大量SQL语句,冗余是不可避免的,开发人员常常发现自己在一次又一次地编写相同的普通代码,如获得连接、准备语句、循环结果集以及其他一些 JDBC 特定元素,使得项目难以维护。特别是当涉及到非常多的关系数据表、需要在多个不同类型的关系数据库系统中使用时,通过在程序中使用JDBC开发实施起来更加困难。

在开发基于数据应用为主的软件系统时,引入对象-关系映射中间件是提高开发效率、提升软件产品的可维护、扩展性的现实需要。实践表明,在基于数据处理为主的企业级应程序开发中,通过引入对象-关系映射中间件,可以节省与对象持久化有关的差不多35%的编程工作量,同时提升软件产品可维护及易扩展性,提升软件产品质量。

因此,在开发企业级应用时,有必要通过引入对象-关系映射系统中间件,实现数据库的快速开发。企业可以通过JDBC编程来开发单独的持久化层,把数据库访问操作封装起来,提供简洁的API,供业务层统一调用,实现自己的ORM系统中间件。

当然,一个成熟的对象-关系映射中间件产品,不只是简单的把内存中的对象持久化到数据库、把数据库中的关系数据加载到内存中,还要保证系统频繁地访问数据库的性能,降低访问数据库的频率,需要引入多线程、缓存、事务管理等很多细节,涉及到的技术比较复杂,因此,我们更多是使用市场上优秀的ORM系统中间件产品。

三、当前JAVA主流的对象-关系映射中间件产品?

对象关系映射程序(Object Relational Mappers,ORM)有多种形式。在 Java领域,大多数流行的 ORM 都可以实现完整的域模型映射,它的目标是将整层的对象和行为映射到数据库表。当前主流的 ORM 中间件产品主要有:

Hibernate(重点推荐)

JDO

iBatis

EJB Entities 3

EJB Entity Beans 2.x

TopLink

在众多的ORM中间件产品中,Hibernate是笔者重点推荐的。Hibernate是一个基于Java的开放源代码的持久化中间件,它对JDBC做了轻量级封装,不仅提供ORM映射服务,还提供数据查询和数据缓存功能,Java开发人员可以方便地通过Hibernate API来操纵数据库。现在,越来越多的Java开发人员把Hibernate作为企业应用和关系数据库之间的中间件。

四、使用EasyDBO实现简单的对象-关系映射

EasyDBO是由简易java框架网(www.easyjf.com)开发的一个适合中小型软件数据库开发的java数据持久层框架,系统参考hibernate、JDO等,结合中小项目软件的开发实际,实现简单的Java对象到关系数据的映射。EasyDBO由于比较简单,比较适合于中小企业及个人开发使用,EasyDBO当前还处于测试阶段、是一个简易但不太成熟的对象-关系映射开源中间件。

EasyDBO的源代码非常简单,有一点Java知识的人基本上都能读懂,因此,选择EasyDBO作本文的示例主要目的在于让读者快速进入ORM系统的世界,理解对象-关系数据库实质及实现原理。

EasyDBO考虑的是最简单的对象-关系映射,简单到可以不使用任何配置文件就实现对象-关系的映射。EasyDBO源码主要包括com.easyjf.dbo、com.easyjf.dbo.config、com.easyjf.dbo.sql三个包。其中com.easyjf.dbo是框架的核心、实现了对象-关系的转换、JDBCAPI的封装以及用户接口支持等,com.easyjf.dbo.config实现配置文件的管理,com.easyjf.dbo.sql实现数据库的简单Sql语句的生成及多数据库支持的扩展。

在当前推出的测试版本中,程序员使用EasyDBO操作数据库主要关注EasyJDO类提供的方法及原数据对象DBObject类、IObject接口即可。

五、使用EasyDBO的开发数据库应用程序示例

下面我们看看使用EasyDBO是怎么样实现数据库的开发。

假设一个留言版系统存放留言信息关系数据表(message)的结构为:

cid: varchar 16 主键

title: varchar 50

content: text

inputUser: varchar 16

inputTime: datetime

status: int

相应java中的类Message定义为

import java.util.Date;

import java.util.List;

import com.easyjf.dbo.EasyJDB;

import com.easyjf.dbo.IObject;

//实现com.easyjf.dbo.IObject接口从而使得你的对象无需要配置文件即可与关系数据表映射

public class Message implements IObject {

private String cid;

private String title;

private String content;

private String inputUser;

private Date inputTime;

private Integer status;

public String getTableName() {

return "message";

}

public String getKeyField() {

return "cid";

}

public String getKeyGenerator() {

return "com.easyjf.dbo.IdGenerator";

}

public String getCid() {

return cid;

}

public void setCid(String cid) {

this.cid = cid;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public java.util.Date getInputTime() {

return inputTime;

}

public void setInputTime(java.util.Date inputTime) {

this.inputTime = inputTime;

}

public String getInputUser() {

return inputUser;

}

public void setInputUser(String inputUser) {

this.inputUser = inputUser;

}

public Integer getStatus() {

return status;

}

public void setStatus(Integer status) {

this.status = status;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

//把对象持久化(保存)到关系数据库中

public boolean save()

{

EasyJDB db=new EasyJDB();

return db.saveOrUpdate(this);

}

//从持久化存储设备数据库系统中永久删除对象

public boolean del()

{

EasyJDB db=EasyJDB.getInstance();

return db.del(this);

}

//通过主键id从数据库系统中读取数据,返回一个对象

public static Message read(String cid)

{

EasyJDB db=EasyJDB.getInstance();

return (Message)db.get(Message.class,cid);

}

//通过sql从数据库中查询符合条件的数据,返回对象列表

public static List query(String sql)

{

EasyJDB db=EasyJDB.getInstance();

return db.query(Message.class,sql);

}

//应用演示代码

public static void main(String[] args) {

Message m=new Message();

m.setTitle("标题");

m.setContent("内容");

m.setInputTime(new Date());

m.setInputUser("test");

m.setStatus(new Integer(1));

if(m.save())

{

System.out.print("成功把对象保存到关系数据库中");

}

else

{

System.out.println("保存数据出错!");

}

//查询数据

List list=Message.query("1=1");

if(list!=null){

for(int i=0;i<list.size();i++)

{

Message message=(Message)list.get(i);

System.out.println("--------");

System.out.println("cid:"+message.getCid());

System.out.println("title:"+message.getTitle());

System.out.println("inputUser:"+message.getInputUser());

System.out.println("inputTime:"+message.getInputTime());

System.out.println("status:"+message.getStatus());

}

}

}

}

如上面的代码所示,程序只需要通过EasyJDB的getInstance()方法得到一个实例,然后就可以通过EasyJDB对象的save、update、del、get、query等类似的方法进行数据库的操作了。而程序员不用管具体的数据库系统类型、不用管数据库连接的获取、数据库资源的释放、不用构造烦琐无味的Sql添、删、改、查语句。

关于数据源及配置文件:用户可以通过EasyDBO的配置文件easyjf-dbo.xml文件配置数据库连接数据源,也可以程序中设置数据源,还可通过IOC容器设置数据源。下面我们看看EasyDBO的数据源配置文件easyjf-dbo.xml的内容。

<easyjf-dbo>

<datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">

<property name="easydbo.connection.driver_class">org.gjt.mm.mysql.Driver</property>

<property name="easydbo.connection.password">yourpassword</property>

<property name="easydbo.connection.url">jdbc:mysql://127.0.0.1:3306/easyjf</property>

<property name="easydbo.connection.username">root</property>

<property name="easydbo.dialect">com.easyjf.dbo.sql.MySqlQuery</property>

<property name="easydbo.optimize">true</property>

<property name="esyydbo.show_sql">true</property>

</datasource>

<tables>

<class>

</class>

</tables>

</easyjf-dbo>

假如用户使用的是MS Sql Server数据为,把上面的的配置文件修改成如下的内容即可:

<easyjf-dbo>

<datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">

<property name="easydbo.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>

<property name="easydbo.connection.password">sa</property>

<property name="easydbo.connection.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=easyjf;SelectMethod=cursor</property>

<property name="easydbo.connection.username">yourpassword</property>

<property name="easydbo.dialect">com.easyjf.dbo.sql.MSSqlServerQuery</property>

</datasource>

<tables>

<class>

</class>

</tables>

</easyjf-dbo>

六、选择适合你的对象-关系映射中间件

不是功能最全,用得最多的中间件就一定适合您,当前流行的各种ORM中间件产品中,hibernate无疑是最为出色的产品,从系统的构架、性能及功能上都非常好。在大型分布市群集服务器运用领域,EJB Entity Beans是首选,因为其有广泛的市场及运用基础。当然,在小型的数据库应用软件领域,如一个新闻网站、一个简单的网上商店、论坛系统等,笔者也推荐大家不防试试EasyDBO。作为初学者,笔者推荐大家使用EasyDBO,阅读EasyDBO的源代码,可以让你快速掌握及了解ORM中间件的实质及工作原理,从而为学习及使用功能更加强大对象-关系映射中间件产品打下基础。

更多完整的有关EasyDBO应用实例代码,请通过官方网站www.easyjf.com下载。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有