日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ORM

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的ORM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。