分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

一、概述

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中,对其开发语言有技术的优化而不同。

(下一章 《三、现有的O/R Mapping产品介绍》)

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