你O/R Mapping了吗?

来源:互联网 发布:windows流畅度 编辑:程序博客网 时间:2024/04/28 00:43

在时下的软件开发中,O/R Mapping这个词组越来越多的被人们提起。什么是O/R Mapping?简单地说就是Object/Relation Mapping,对象到关系的映射。这名字和概念是出那里冒出来的呢?我们在开发中为什么需要O/R Mapping呢?

首先我们看看面向对象的开发。Object-oriented开发在近年已广为普及,成为软件开发最基本的方法。开发语言也出现了专门为面向对象开发的编程语言,象目前主流的java, C#都是基于面对象开发设计的编程语言。实践证明面向对象是一种能有效提高开发质量,易于管理和符合人的思维模式的开发方法。

不管是面向过程/结构的开发方法还是面向对象的开发方法,几乎所有的项目和产品的软件开发中都必须涉及关系数据库的数据存取更新等问题。和关系数据库打交道是所有项目产品开发中首先需要面对的,目前的开发技术需要为每个项目开发一个数据访问层( Data Access Layer )来作为商业逻辑代码的基础。

在面向对象的开发中,数据访问层最基本的数据库操作包括插入对象,删除对象,更新对象和查询对象。几乎所有的项目开发都需要首先需要实现这些原子操作。而这些操作在几乎所有的项目开发中都很类似,都是把插入对象,删除对象,更新对象和查询对象的对象级别的操作转化为底层关系数据支持的insert, delete, update和select等sql操作。

看一个基本的例子插入对象,这里我们增加一个用户对象Account。

public void addAccount(final Account account) throws DAOException,            AccountAlreadyExistException {     final Connection conn;     conn = getConnection();     final PreparedStatement stat                    = conn.prepareStatement("insert into "                    + PersistentAccount.PROPERTY_ACCOUNT_TABLE                    + " ( "                    + PersistentAccount.PROPERTY_USER_NAME + ","                    + PersistentAccount.PROPERTY_PASSWORD + ","                    + PersistentAccount.PROPERTY_EMAIL + ","                    + PersistentAccount.PROPERTY_COLUMN_WRITER + ")"                    + " values( '"                    + account.getUserName() + "', '"                    + account.getPassword() + "', '"                    + account.getEmail() + "', '"                    + (account.isColumnWriter() ? "Y" : "N") + "')");     stat.execute();     stat.close();     conn.close();     return; }


这个操作很简单,就是把增加一个Account对象的对象逻辑转化为一个insert操作,即实现最简单的Account对象到数据库表account的映射。例子中是由开发人员手工编写JDBC代码来实现。如果有另一个对象Person,我们也要写相近的代码来实现增加一个Person的操作。

类似的例子和代码在大量的项目中都存在。从1996年JDBC出现到目前8年,大量的项目开发还在重复的编写这样的代码来实现这些每个项目都需要的基本操。开发数据访问层的工作量(开发和测试)极大,对开发人员的要求也很高。最不幸的是在大量的项目开发中都需要重复这种繁复的数据访问层的开发,从而导致大量的人力物力财力都浪费在这种人力密集型的数据访问层重复开发中而数据库操作也恰恰是项目开发中最容易出错和消耗大量时间的部分。如果在项目需要面对不同的数据库,则还需要为每个数据库开发一个专门的数据访问层。

显然这种每个项目都重复但却具备相同模式的代码是一种明显的浪费。这就催生了O/R Mapping技术的产生。ORM,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个自动映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像操作对象就可以了, O/R Mapping工具会自动地将对象的操作转换为SQL语句操作。这样我们就只需要关注业务逻辑中的对象架构,而不是底层的重复性的数据库SQL和JDBC代码。

我们再看看原来的代码在使用了O/R Mapping技术后有什么不同。这里我们使用JDO。
 

public void addAccount(final Account account) throws DAOException,            AccountAlreadyExistException {    final PersistenceManager pm = pmf.getPersistenceManager();    pm.currentTransaction().begin();    pm.makePersistent(account);    pm.currentTransaction().commit();
}

对比后我们可以体会到代码量的巨大差别。而这个还只是一个最简单的插入单个对象的的情况。

在插入多个对象,特别是插入多个关联对象的情况下,更可以看到O/R Mapping的优势。在Liberator JDO框架中,支持Persistence By Reachability,在保存对象的时候,可以将该对象所引用的所有对象自动都保存到相应的数据表中,而不需要每个对象都做保存的操作。
对比后我们可以体会到代码量的巨大差别。而这个还只是一个最简单的插入单个对象的的情况。

在插入多个对象,特别是插入多个关联对象的情况下,更可以看到O/R Mapping的优势。在Liberator JDO框架中,支持Persistence By Reachability,在保存对象的时候,可以将该对象所引用的所有对象自动都保存到相应的数据表中,而不需要每个对象都做保存的操作。

下面的例子保存一个系(Department),系所包含的所有学生对象和每个学生得档案(Profiel)。

final PersistenceManager pm = pmf.getPersistenceManager();
    final Profile myProfile1 = new Profile( 180, "foo1", "fooLast1", 19 );
    final Student student1 = new Student( 1, myProfile1 );
    final Profile myProfile2 = new Profile( 181, "foo2", "fooLast2", 19 );
    final Student student2 = new Student( 2, myProfile2 );
    final Department department = new Department( "Computer" );
    department.addStudent( student1 );
    department.addStudent( student2 );
    pm.currentTransaction().begin();
    pm.makePersistent( department );
    pm.currentTransaction().commit();


如果采用传统的手工SQL, JDBC方式编码,代码量可以多出近5倍。在算上测试节省的时间,可以件采用O/R Mapping技术可以极大的提高开发效率和开发时间,同时开发质量也更容易保证。

这里我们仅仅展示了O/R Mapping技术的一小部分,还有更多非常吸引人的功能值得我们尝试。

采用O/R Mapping带来的好处:
1) 提高学习和开发效率,极大的降低开发成本。
使用ORM可以大大降低学习和开发成本,现代技术的发展,使得我们需要不断学习。我们不仅要学习面向对象、UML、设计模式等知识,而且还需要学习SQL, JDBC,甚至是各种数据库( DB2, Oracle, SQL Server等)的知识。而在实际的开发中,真正对客户有价值的是其独特的业务功能,而现在的现状是我们花费了大量的时间在编写数据访问,包括后期的Bug查找,维护等也会花费相当多的时间在数据处理上。这就是说,我们在实际的开发中很多的时间都被浪费在根本不创造价值的非业务事件上了。

在使用ORM之后,我们将不需要再浪费太多的时间在 SQL语句, JDBC上的开发和测试上。ORM框架已经把底层的数据库操作转变成了我们熟悉的对象操作,我们将只需要了解面向对象开发就可以实现数据库应用程序的开发。

2) 简化代码,减少BUG数量。
通过建立ORM框架,能够大量减少程序开发代码,开发数据层就比较简单,大大减少了出错机会。

3)简化测试。只需测试业务逻辑的类和行为,避免重复的JDBC测试

4) 提高性能 对象级缓存( 缓存对象及其关系 )可以避免不必要的数据库存取,极大的提高数据读写的性能。我们也可以节省用于系统调优的时间和工作量。

5) 隔离数据源,可以很方便的转换数据库 ORM可以将业务层与实际的数据存储隔开,开发人员不需要关心实际存储的方式,如果我们需要把SQL Server数据库换成ORACLE数据库,只需要修改配置文件就可,业务逻辑代码完全不需要修改。

O/R Mapping技术的巨大优越性使它很快成为面向对象开发中的主流开发模式。在Java社区中,Java Data Object就是由Sun发起,众多厂家共同制定的java的O/R Mapping标准,而下一代的Enterprise Java Bean标准也将融合JDO技术,将O/R Mapping技术作为EJB 3.0技术规范的核心技术。而Microsoft也不示弱,在下一代的.NET开发框架中提供称为ObjectSpaces的O/R Mapping框架。可以预见在不久的将来,O/R Mapping技术将被广泛的运用在软件项目开发中,成为软件开发的火箭助推器。

原创粉丝点击