1. 程式人生 > 其它 >ORM框架簡介及優缺點

ORM框架簡介及優缺點

一、ORM簡介
物件關係對映(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料,將程式中的物件自動持久化到關係資料庫中。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式,為每一種可能的資料庫訪問操作提供單獨的方法。
這種方案存在以下不足:
1.持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的介面
2.持久化層同時與域模型與關係資料庫模型繫結,不管域模型還是關係資料庫模型發生變化,毒藥修改持久化曾的相關程式程式碼,增加了軟體的維護難度。

ORM提供了實現持久化層的另一種模式,它採用對映元資料來描述物件關係的對映,使得ORM中介軟體能在任何一個應用的業務邏輯層和資料庫層之間充當橋樑。Java典型的ORM中介軟體有:Hibernate,ibatis,speedframework。
ORM的方法論基於三個核心原則:
  · 簡單:以最基本的形式建模資料。
  · 傳達性:資料庫結構被任何人都能理解的語言文件化。
  · 精確性:基於資料模型建立正確標準化了的結構。

二、ORM的概念
讓我們從O/R開始。字母O起源於"物件"(Object),而R則來自於"關係"(Relational)。幾乎所有的程式裡面,都存在物件和關係資料庫。在業務邏輯層和使用者介面層中,我們是面向物件的。當物件資訊發生變化的時候,我們需要把物件的資訊儲存在關係資料庫中。
當你開發一個應用程式的時候(不使用O/R Mapping),你可能會寫不少資料訪問層的程式碼,用來從資料庫儲存,刪除,讀取物件資訊,等等。你在DAL中寫了很多的方法來讀取物件資料,改變狀態物件等等任務。而這些程式碼寫起來總是重複的。

ORM解決的主要問題是物件關係的對映。域模型和關係模型分別是建立在概念模型的基礎上的。域模型是面向物件的,而關係模型是面向關係的。一般情況下,一個持久化類和一個表對應,類的每個例項對應表中的一條記錄,類的每個屬性對應表的每個欄位。
ORM技術特點:
1.提高了開發效率。由於ORM可以自動對Entity物件與資料庫中的Table進行欄位與屬性的對映,所以我們實際可能已經不需要一個專用的、龐大的資料訪問層。
2.ORM提供了對資料庫的對映,不用sql直接編碼,能夠像操作物件一樣從資料庫獲取資料。

三、ORM的優缺點
ORM的缺點是會犧牲程式的執行效率和會固定思維模式。
從系統結構上來看,採用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向物件的做法,而面向物件的做法也會對效能產生一定的影響。

在我們開發系統時,一般都有效能問題。效能問題主要產生在演算法不正確和與資料庫不正確的使用上。ORM所生成的程式碼一般不太可能寫出很高效的演算法,在資料庫應用上更有可能會被誤用,主要體現在對持久物件的提取和和資料的加工處理上,如果用上了ORM,程式設計師很有可能將全部的資料提取到記憶體物件中,然後再進行過濾和加工處理,這樣就容易產生效能問題。
在對物件做持久化時,ORM一般會持久化所有的屬性,有時,這是不希望的。
但ORM是一種工具,工具確實能解決一些重複,簡單的勞動。這是不可否認的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對絕大多數的系統,應該是很少的。

什麼是ORM為什麼要使用ORM?

什麼是“持久化”
持久(Persistence),即把資料(如記憶體中的物件)儲存到可永久儲存的儲存裝置中(如磁碟)。持久化的主要應用是將記憶體中的資料儲存在關係型的資料庫中,當然也可以儲存在磁碟檔案中、XML資料檔案中等等。
什麼是“持久層”
持久層(Persistence Layer),即專注於實現資料持久化應用領域的某個特定系統的一個邏輯層面,將資料使用者和資料實體相關聯。

什麼是ORM
即Object-Relationl Mapping,它的作用是在關係型資料庫和物件之間作一個對映,這樣,我們在具體的操作資料庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作物件一樣操作它就可以了 。

為什麼要做持久化和ORM設計(重要)
在目前的企業應用系統設計中,MVC,即 Model(模型)- View(檢視)- Control(控制)為主要的系統架構模式。MVC 中的 Model 包含了複雜的業務邏輯和資料邏輯,以及資料存取機制(如 JDBC的連線、SQL生成和Statement建立、還有ResultSet結果集的讀取等)等。將這些複雜的業務邏輯和資料邏輯分離,以將系統的緊耦合關係轉化為鬆耦合關係(即解耦合),是降低系統耦合度迫切要做的,也是持久化要做的工作。MVC 模式實現了架構上將表現層(即View)和資料處理層(即Model)分離的解耦合,而持久化的設計則實現了資料處理層內部的業務邏輯和資料邏輯分離的解耦合。而 ORM 作為持久化設計中的最重要也最複雜的技術,也是目前業界熱點技術。

簡單來說,按通常的系統設計,使用 JDBC 操作資料庫,業務處理邏輯和資料存取邏輯是混雜在一起的。
一般基本都是如下幾個步驟:
1、建立資料庫連線,獲得 Connection 物件。
2、根據使用者的輸入組裝查詢 SQL 語句。
3、根據 SQL 語句建立 Statement 物件 或者 PreparedStatement 物件。
4、用 Connection 物件執行 SQL語句,獲得結果集 ResultSet 物件。
5、然後一條一條讀取結果集 ResultSet 物件中的資料。
6、根據讀取到的資料,按特定的業務邏輯進行計算。
7、根據計算得到的結果再組裝更新 SQL 語句。
8、再使用 Connection 物件執行更新 SQL 語句,以更新資料庫中的資料。
7、最後依次關閉各個 Statement 物件和 Connection 物件。

由上可看出程式碼邏輯非常複雜,這還不包括某條語句執行失敗的處理邏輯。其中的業務處理邏輯和資料存取邏輯完全混雜在一塊。而一個完整的系統要包含成千上萬個這樣重複的而又混雜的處理過程,假如要對其中某些業務邏輯或者一些相關聯的業務流程做修改,要改動的程式碼量將不可想象。另一方面,假如要換資料庫產品或者執行環境也可能是個不可能完成的任務。而使用者的執行環境和要求卻千差萬別,我們不可能為每一個使用者每一種執行環境設計一套一樣的系統。
所以就要將一樣的處理程式碼即業務邏輯和可能不一樣的處理即資料存取邏輯分離開來,另一方面,關係型資料庫中的資料基本都是以一行行的資料進行存取的,而程式執行卻是一個個物件進行處理,而目前大部分資料庫驅動技術(如ADO.NET、JDBC、ODBC等等)均是以行集的結果集一條條進行處理的。所以為解決這一困難,就出現 ORM 這一個物件和資料之間對映技術。

舉例來說,比如要完成一個購物打折促銷的程式,用 ORM 思想將如下實現(引自《深入淺出Hibernate》):
業務邏輯如下:
public Double calcAmount(String customerid, double amount)
{
// 根據客戶ID獲得客戶記錄
Customer customer = CustomerManager.getCustomer(custmerid);
// 根據客戶等級獲得打折規則
Promotion promotion = PromotionManager.getPromotion(customer.getLevel());
// 累積客戶總消費額,並儲存累計結果
customer.setSumAmount(customer.getSumAmount().add(amount);
CustomerManager.save(customer);
// 返回打折後的金額
return amount.multiply(protomtion.getRatio());
}
這樣程式碼就非常清晰了,而且與資料存取邏輯完全分離。設計業務邏輯程式碼的時候完全不需要考慮資料庫JDBC的那些千篇一律的操作,而將它交給 CustomerManager 和 PromotionManager 兩個類去完成。這就是一個簡單的 ORM 設計,實際的 ORM 實現框架比這個要複雜的多