ORM
一、概述
?????? ? 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的使用并不復雜,無論有沒有開發經驗,面向對象熟悉與否的,都可以快速上手。程序員不必理會程序中對數據庫的操作部分,相對來說可以減少程序員的技術要求。項目經理可以有更大的空間去分配工作。
(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中,對其開發語言有技術的優化而不同。
[天傷之夢] http://www.cnblogs.com/william_fire/category/20613.html
轉載于:https://www.cnblogs.com/frogbag/archive/2006/05/31/413819.html
總結
- 上一篇: 挪威有感
- 下一篇: ASP.NET常用函数