ORM
一、概述
?????? ? O/R Mapping全稱Object Relational Mapping,就是對象關(guān)系映射。把對表直接進(jìn)行的操作,變成對持久化類的屬性和方法的直接操作。
???????? 很多的項(xiàng)目是基于數(shù)據(jù)庫的開發(fā),程序中要大量進(jìn)行表的增、刪、改、查詢的工作。
??????? 例如下面一段C#代碼,從數(shù)據(jù)庫CustomerDemo取表Customer數(shù)據(jù):
???? 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];
???? //判斷數(shù)據(jù)集是否為空
???? if (cusomerDataTable.Rows.Count>0)
???? {
???????? DataRow dr = cusomerDataTable.Rows[0];
???????? //不進(jìn)行取數(shù)據(jù)的是否為空的判斷,很容易留下隱患
if (! dr.IsNull("CustomerName"))
???????? {
????????????? txtCustomerName.Text = dr["CustomerName"].ToString();
???????? }
???? }
?
???? theSqlConnection.Close();
如果用O/R Mapping對表封裝成持久化類,讀取表的數(shù)據(jù)就變?yōu)樵L問持久化類的屬性。例如:
?? //以下只是一段偽代碼的模擬,不同的O/R Mapping技術(shù)封裝,代碼的寫法會(huì)有不同。
??? //建立數(shù)據(jù)連接Connection
?? Connection conn = DataSource.GetConnection();
?? //建立可持久化類工廠
?? SessionFactory theSessionFactory = ConfigurationFactory.BuildSessionFactory(conn);
?? //實(shí)例化一個(gè)Customer,并取CustomerID=1的對象
?? Customer theCustomer = (Customer)theSessionFactory.CreateObject(typeof(Customer),”1”);
?? //取對象的屬性進(jìn)行賦值
? txtCustomerName.Text = theCustomer.Name;
? conn.Close();
?
以上的代碼相當(dāng)?shù)暮啙?#xff0c;對表的一些常用的操作,都封裝在類里面。O/R Mapping對整個(gè)項(xiàng)目的開發(fā)都有相當(dāng)?shù)囊嫣?#xff1a;
1、?? 程序員
(1)???????? 一般的數(shù)據(jù)庫應(yīng)用的項(xiàng)目,無非是大量的表、字段的select、insert、delete、edit的操作。這些操作沒有多大的技術(shù)難度,就是耗時(shí)間去實(shí)現(xiàn),還要小心謹(jǐn)慎處理,到處用if語句來進(jìn)行的判斷。把大量重復(fù)勞動(dòng)進(jìn)行類的封裝,提高開發(fā)質(zhì)量和效率是顯而易見的。
(2)???????? O/R Mapping所需要編寫的持久化類和對應(yīng)的XML映射文件,都可以通過工具自動(dòng)的生成,極大的減少程序的代碼量。實(shí)際的使用中,大約會(huì)減少20%的代碼量。
(3)???????? 程序員的重復(fù)勞動(dòng)減少,程序員能有更多的精力放在其它技術(shù)方面。
(4)???????? 代碼風(fēng)格統(tǒng)一,源程序清晰簡潔,可讀性強(qiáng)。程序員的水平高低不一,編碼風(fēng)格各有各的特點(diǎn),讀其他人寫的源程序,相信對誰都是一件痛苦的事。而用O/R Mapping封裝后,從源頭上規(guī)范大家的開發(fā)風(fēng)格,讀懂和修改別人的源程序會(huì)容易很多。
(5)???????? 讓程序員在一個(gè)良好的面向?qū)ο箝_發(fā)的環(huán)境中成長,培養(yǎng)他們面向?qū)ο箝_發(fā)的思維和編碼經(jīng)驗(yàn),使面向?qū)ο蟮乃枷朐谄綍r(shí)的項(xiàng)目開發(fā)中潛移默化。
?
2、?? 系統(tǒng)分析員
(1)???????? 有利于系統(tǒng)分析員用在系統(tǒng)分析、設(shè)計(jì)、編碼、測試中全部用面向?qū)ο髞斫鉀Q。不會(huì)再出現(xiàn)分析設(shè)計(jì)文檔寫了大量的類,到編碼階段,還是在源程序看到大量的SQL語句滿天飛。有了對象的持久化的解決方案,系統(tǒng)分析員能沒有后顧之憂,全面用面向?qū)ο髞碓O(shè)計(jì)分析。并且編寫出來的UML文檔非常明了簡潔。
(2)???????? 由于O/R Mapping把表的操作完全封裝在類的層次,使表跟源程序耦合性大大的降低。能明顯提高項(xiàng)目結(jié)構(gòu)的擴(kuò)展性和柔韌性,更加容易修改和升級(jí)。
(3)???????? O/R Mapping不是一堆操作表的函數(shù)庫,還可以把項(xiàng)目中常用的邏輯進(jìn)行封裝復(fù)用,如:角色分配、權(quán)限控制、用戶登錄注冊等身份認(rèn)證、樹型結(jié)構(gòu)的部門等,都可以支持在數(shù)據(jù)庫級(jí)進(jìn)行組件重用。這種數(shù)據(jù)庫級(jí)組件,通過O/R Mapping跟實(shí)際的數(shù)據(jù)庫完全隔離,復(fù)用性很強(qiáng)。
(4)???????? 能降低一些附屬性強(qiáng)的功能模塊的開發(fā)難度,如聊天室、論壇、購物系統(tǒng)、短信頻道等,通過O/R Mapping,源程序不再直接跟數(shù)據(jù)庫打交道,只需要通過更改表的映射文件,就可以把這些功能掛到其它現(xiàn)有的系統(tǒng)上。并減低項(xiàng)目產(chǎn)品化的工作難度。
(5)???????? 數(shù)據(jù)庫和項(xiàng)目源程序耦合性大大的降低后,使項(xiàng)目能更容易的移植到其它數(shù)據(jù)庫中。
?
3、?? 項(xiàng)目經(jīng)理
(1)???????? O/R Mapping的使用并不復(fù)雜,無論有沒有開發(fā)經(jīng)驗(yàn),面向?qū)ο笫煜づc否的,都可以快速上手。程序員不必理會(huì)程序中對數(shù)據(jù)庫的操作部分,相對來說可以減少程序員的技術(shù)要求。項(xiàng)目經(jīng)理可以有更大的空間去分配工作。
(2)???????? 項(xiàng)目更容易的實(shí)現(xiàn)框架、組件重用和積累,提高開發(fā)的質(zhì)量和效率。
(3)???????? 可以實(shí)現(xiàn)部分界面(如ASP、JSP)的源程序自動(dòng)生成。
?
當(dāng)然,O/R Mapping只是一個(gè)技術(shù)的解決方案,缺點(diǎn)和局限性會(huì)在文章的最后總結(jié)時(shí)講述。
?
二、O/R Mapping的基本框架
???? O/R Mapping的重要部分是表與持久化類之間的映射,現(xiàn)在主要有兩種方式:
?
一種是單純的持久化類映射:表與持久化類之間的映射是通過硬編碼的方式寫成類,編譯后運(yùn)行的。這種方式用起來直觀明了,程序員可以控制的部分多,運(yùn)行速度快。缺點(diǎn)是如果更改表的字段、類型等,需要直接更改類里面的代碼,再編譯后才能運(yùn)行。
?
另外的一種是通過XML和持久化類一起來實(shí)現(xiàn)映射。持久化類是映射出來的實(shí)體類,大部分關(guān)于類屬性的類型、長度、是否能修改、是否可以插入等,和表字段的類型、長度、是否允許為空等,都通過XML的文件來表達(dá)。表的映射關(guān)系需要改動(dòng)時(shí),只需改XML部分,持久化類不需要改動(dòng)及重新編譯。現(xiàn)在流行的是這種方式,它很靈活,耦合性更加低。以下是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>
?
?
從表初始化一個(gè)持久化類的步驟:
1 讀取數(shù)據(jù)庫的表 -> 2 在XML文件找出所映射的持久化類,并初始化該類 -> 3 逐個(gè)讀取表的字段名,在XML中找出所映射的持久化類的屬性 -> 4? 通過類的反射,把表的字段的數(shù)據(jù)賦值給類的屬性
?
把一個(gè)持久化類的數(shù)據(jù)保存到表的步驟:
1 通過XML文件,找出持久化類所映射的表 -> 2 通過反射,逐一讀取類屬性所映射的表字段 -> 3 把屬性的值賦值給所映射的表字段 -> 4 保存表的數(shù)據(jù)到數(shù)據(jù)庫
?
以上的只是一般的處理步驟,在實(shí)際的O/R Mapping中,對其開發(fā)語言有技術(shù)的優(yōu)化而不同。
[天傷之夢] http://www.cnblogs.com/william_fire/category/20613.html
轉(zhuǎn)載于:https://www.cnblogs.com/frogbag/archive/2006/05/31/413819.html
總結(jié)
- 上一篇: 挪威有感
- 下一篇: ASP.NET常用函数