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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ORM

發(fā)布時(shí)間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORM 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、概述
?????? ? 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é)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。