我的O/R Mapping實際開發經驗之談(一)

來源:互聯網
上載者:User
一、概述

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中,對其開發語言有技術的最佳化而不同。





相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。