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

一、概述

O/R Mapping全称Object Relational Mapping,就是对象关系映射。把对表直接进行的操作,变成对持久化类的属性和方法的直接操作。

很多的项目是基于数据库的开发,程序中要大量进行表的增、删、改、查询的工作。

例如下面一段C#代码,从数据库CustomerDemo取表Customer数据:

string ConnectionString = "data source=WILLIAM;persist security info=True;initial catalog=CustomerDemo;user id=sa;password=sasa";

SqlConnection theSqlConnection = new SqlConnection(ConnectionString);

string query = "select CustomerName from Customer where CustomerID=1";

SqlDataAdapter theSqlDataAdapter = new SqlDataAdapter();

theSqlDataAdapter.SelectCommand = new SqlCommand(query, theSqlConnection);

DataSet customerDataSet = new DataSet();

theSqlDataAdapter.Fill(customerDataSet);

DataTable cusomerDataTable = new DataTable();

cusomerDataTable = customerDataSet.Tables[0];

//判断数据集是否为空

if (cusomerDataTable.Rows.Count>0)

{

DataRow dr = cusomerDataTable.Rows[0];

//不进行取数据的是否为空的判断,很容易留下隐患

if (! dr.IsNull("CustomerName"))

{

txtCustomerName.Text = dr["CustomerName"].ToString();

}

}

theSqlConnection.Close();

如果用O/R Mapping对表封装成持久化类,读取表的数据就变为访问持久化类的属性。例如:

//以下只是一段伪代码的模拟,不同的O/R Mapping技术封装,代码的写法会有不同。

//建立数据连接Connection

Connection conn = DataSource.GetConnection();

//建立可持久化类工厂

SessionFactory theSessionFactory = ConfigurationFactory.BuildSessionFactory(conn);

//实例化一个Customer,并取CustomerID=1的对象

Customer theCustomer = (Customer)theSessionFactory.CreateObject(typeof(Customer),”1”);

//取对象的属性进行赋值

txtCustomerName.Text = theCustomer.Name;

conn.Close();

以上的代码相当的简洁,对表的一些常用的操作,都封装在类里面。O/R Mapping对整个项目的开发都有相当的益处:

1、 程序员

(1) 一般的数据库应用的项目,无非是大量的表、字段的select、insert、delete、edit的操作。这些操作没有多大的技术难度,就是耗时间去实现,还要小心谨慎处理,到处用if语句来进行的判断。把大量重复劳动进行类的封装,提高开发质量和效率是显而易见的。

(2) O/R Mapping所需要编写的持久化类和对应的XML映射文件,都可以通过工具自动的生成,极大的减少程序的代码量。实际的使用中,大约会减少20%的代码量。

(3) 程序员的重复劳动减少,程序员能有更多的精力放在其它技术方面。

(4) 代码风格统一,源程序清晰简洁,可读性强。程序员的水平高低不一,编码风格各有各的特点,读其他人写的源程序,相信对谁都是一件痛苦的事。而用O/R Mapping封装后,从源头上规范大家的开发风格,读懂和修改别人的源程序会容易很多。

(5) 让程序员在一个良好的面向对象开发的环境中成长,培养他们面向对象开发的思维和编码经验,使面向对象的思想在平时的项目开发中潜移默化。

2、 系统分析员

(1) 有利于系统分析员用在系统分析、设计、编码、测试中全部用面向对象来解决。不会再出现分析设计文档写了大量的类,到编码阶段,还是在源程序看到大量的SQL语句满天飞。有了对象的持久化的解决方案,系统分析员能没有后顾之忧,全面用面向对象来设计分析。并且编写出来的UML文档非常明了简洁。

(2) 由于O/R Mapping把表的操作完全封装在类的层次,使表跟源程序耦合性大大的降低。能明显提高项目结构的扩展性和柔韧性,更加容易修改和升级。

(3) O/R Mapping不是一堆操作表的函数库,还可以把项目中常用的逻辑进行封装复用,如:角色分配、权限控制、用户登录注册等身份认证、树型结构的部门等,都可以支持在数据库级进行组件重用。这种数据库级组件,通过O/R Mapping跟实际的数据库完全隔离,复用性很强。

(4) 能降低一些附属性强的功能模块的开发难度,如聊天室、论坛、购物系统、短信频道等,通过O/R Mapping,源程序不再直接跟数据库打交道,只需要通过更改表的映射文件,就可以把这些功能挂到其它现有的系统上。并减低项目产品化的工作难度。

(5) 数据库和项目源程序耦合性大大的降低后,使项目能更容易的移植到其它数据库中。

3、 项目经理

(1) O/R Mapping的使用并不复杂,无论有没有开发经验,面向对象熟悉与否的,都可以快速上手。程序员不必理会程序中对数据库的操作部分,相对来说可以减少程序员的技术要求(我曾经组织个用O/R Mapping开发的项目,带几个初入行的程序员开发,大约开发了4个月,项目开发完了,那几个程序员还不知道怎样用ADO.NET)。项目经理可以有更大的空间去分配工作。

(2) 项目更容易的实现框架、组件重用和积累,提高开发的质量和效率。

(3) 可以实现部分界面(如ASP、JSP)的源程序自动生成。

当然,O/R Mapping只是一个技术的解决方案,缺点和局限性会在文章的最后总结时讲述。

二、O/R Mapping的基本框架

O/R Mapping的重要部分是表与持久化类之间的映射,现在主要有两种方式:

一种是单纯的持久化类映射:表与持久化类之间的映射是通过硬编码的方式写成类,编译后运行的。这种方式用起来直观明了,程序员可以控制的部分多,运行速度快。缺点是如果更改表的字段、类型等,需要直接更改类里面的代码,再编译后才能运行。

另外的一种是通过XML和持久化类一起来实现映射。持久化类是映射出来的实体类,大部分关于类属性的类型、长度、是否能修改、是否可以插入等,和表字段的类型、长度、是否允许为空等,都通过XML的文件来表达。表的映射关系需要改动时,只需改XML部分,持久化类不需要改动及重新编译。现在流行的是这种方式,它很灵活,耦合性更加低。以下是Grove.Net映射的一段的一段代码:

持久化类:

public class Customer

{

int CustomerID;

string Name;

[KeyField("CustomerID")]

public int CustomerID

{

get{return this.CustomerID;}

set{this.CustomerID=value;}

}

[DataField("CustomerName")]

public string Name

{

get{return this.Name;}

set{this.Name=value;}

}

}

XML文件的映射部分:

<?xml version="1.0" encoding="utf-8"?>

<Entity xmlns="http://tempuri.org/Customer.xsd">

<TableName>Customer</TableName>

<OperationTypes>

<OperationType Name="select" />

<OperationType Name="insert" />

<OperationType Name="update" />

<OperationType Name="delete" />

</OperationTypes>

<DataFields>

<DataField Name="CustomerID" MapName="CustomerID" IsKey="true" />

<DataField Name="CustomerName" MapName="Name" IsKey="false" />

</DataFields>

</Entity>

从表初始化一个持久化类的步骤:

1 读取数据库的表 -> 2 在XML文件找出所映射的持久化类,并初始化该类 -> 3 逐个读取表的字段名,在XML中找出所映射的持久化类的属性 -> 4 通过类的反射,把表的字段的数据赋值给类的属性

把一个持久化类的数据保存到表的步骤:

1 通过XML文件,找出持久化类所映射的表 -> 2 通过反射,逐一读取类属性所映射的表字段 -> 3 把属性的值赋值给所映射的表字段 -> 4 保存表的数据到数据库

以上的只是一般的处理步骤,在实际的O/R Mapping中,对其开发语言有技术的优化而不同。

时间: 2024-10-22 02:19:33

我的O/R Mapping实际开发经验之谈(一)的相关文章

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

三.现有的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看下Hibernat

理解O/R Mapping

http://www.cnblogs.com/teddyma/archive/2010/08/01/1789714.html 本文的目的是以最精炼的语言,理解什么是O/R Mapping,为什么要O/R Mapping,和如何进行O/R Mapping. 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换.狭义上,ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口.理想情况下,基于这样一个面向对象的接口,

三、现有的O/R Mapping产品介绍

接上) 具体过程如下: (1)首先建立数据库配置文件,我们在这里定为database.xml,当然也可以改成是其它名字. <?xml version="1.0" encoding="gb2312"?> <database name="CustomerDemo" engine="mysql"> <driver url="jdbc:mysql://cwb:3306/quickstart&qu

[NHibernate]O/R Mapping基础

系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) 引言 对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的.这个映射文档被设计为易读的,并且拒绝恶意手工修改.映射语言以.NET为中心的,意味着映射是持久化类的定义来创建的,而非表的定义. 请注意,虽然很多Hibernate用户选择手工定义XML映射文档,也有一些工具来生成映射文档,包括XDo

.net下的几个O/R Mapping框架对比,数据实体的验证

几个.net的O/R框架 名称 URL Pros Cons Microsoft Entity Framework msdn 官方支持 可视化很好 发展时间相对短 NHibernate http://nhforge.com 开发支持,时间很长 比较复杂 Subsonic http://subsonicproject.com Active Record Auto-generate code Open Source, Not flexible Genome http://www.genom-e.com

PHP和MYSQL制作动态网站开发经验之谈

一. 10个经验 1.不要依赖register_global=ON的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF. 2.写程序前看看怎么用error_reporting. 3.不懂就问本身没错,但你需要在那之前查查手册. 4.当然,你需要懂得使用手册.手册上找不到答案的时候,应该考虑下网络上的搜索引擎. 5.刚学会php+mysql之后,不要叫嚷着要写论坛,要写XXX.要明白,刚学会写汉字并不表示

关于O/R Mapping的思考,我们应该选择什么?

最近对ORM方面的东西感兴趣,有一些想法,想和大家讨论一下. 我觉得Hibernate应算算是一个经典且功能强大的ORM框架. 它最大的有点是,你可以完全用面向对象分析与设计(OOAD)的思想来设计好所有的类,然后该框架就可以以非常人性化的方式为你获取对象或者持久化对象. 但同时我也发现它的一个缺点,就是当对象与对象之间的关系比较复杂的时候,ORM配置文件会很复杂,且比较难维护.并且当我们要对多个表进行关联查询时,虽然框架提供给了我们很多方便的接口让我们可以通过设置对象的属性的方式来告诉框架我们

《R的极客理想—工具篇》—— 1.5 多人在线协作R开发RStudio Server

1.5 多人在线协作R开发RStudio Server 问题 R语言开发,哪个工具最好用? 引言 RStudio是R语言开发中的利器,是最好用的R语言IDE集成环境.RStudio Server更是利器中的神器.不仅提供了Web的功能,可以安装到远程服务器上,通过Web进行访问,还支持多用户的协作开发.如此神器,快来动手试一下吧. 1.5.1 RStudio和RStudio Server RStudio 是一个强大的.免费的.开源的R语言集成开发环境的应用软件,可以安装在Windows.Linu

初学者如何开发出高质量的J2EE系统

j2ee|初学 J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向. 首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系. J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase.到Delphi/VB等C/S结构,发展到B