ORM是什麼,爲什麼用ORM

什麼是ORM

ORM(Object-relational mapping),中文翻譯爲對象關係映射,是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中

爲什麼用ORM

在程序開發中,數據庫保存的表,字段與程序中的實體類之間是沒有關聯的,在實現持久化時就比較不方便。那麼,到底如何實現持久化呢?一種簡單的方案是採用硬編碼方式,爲每一種可能的數據庫訪問操作提供單獨的方法。這種方案存在以下不足:

  • 1.持久化層缺乏彈性。一旦出現業務需求的變更,就必須修改持久化層的接口
  • 2.持久化層同時與域模型與關係數據庫模型綁定,不管域模型還是關係數據庫模型發生變化,毒藥修改持久化曾的相關程序代碼,增加了軟件的維護難度

ORM提供了實現持久化層的另一種模式,它採用映射元數據來描述對象關係的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋樑

ORM的方法論基於三個核心原則:

  • 簡單:以最基本的形式建模數據
  • 傳達性:數據庫結構被任何人都能理解的語言文檔化
  • 精確性:基於數據模型創建正確標準化了的結構

本文以C#編程語言爲例,在傳統的數據讀取操作中,我們以Ado.net的方式對數據庫進行CRUD操作,使用的基本都是SQL硬編碼,比如有以下數據庫查詢操作:


 
  1. String sql = "SELECT ... FROM persons WHERE id = 10";

  2. DbCommand cmd = new DbCommand(connection, sql);

  3. Result res = cmd.Execute();

  4. String name = res[0]["FIRST_NAME"];

使用了ORM映射的C#實現的僞代碼:


 
  1. Person p = repository.GetPerson(10);

  2. String name = p.getFirstName();

上面的示例代碼表示我們可以從數據倉庫repository中獲取到一個實體對象,當然數據倉庫中可能包含其他的方法,你也可以定義自己的ORM實現,比如:

Person p = Person.Get(10);

通常,在處理ORM映射和數據倉庫時會暴露一些過濾或者查詢方法,允許客戶端對數據集進行進一步的篩選等操作,比如代碼演示從數據庫中查詢ID=10的用戶:

Person p = Person.Get(Person.Properties.Id == 10);

優/缺點

優點

與傳統的數據庫訪問技術相比,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 實現框架比這個要複雜的多。
————————————————
版權聲明:本文爲CSDN博主「zhangchibang311」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhangchibang311/article/details/83329802

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章