瞭解orm,先了解如下概念:數據庫
什麼是「持久化」
持久(Persistence),即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內存中的數據存儲在關係型的數據庫中,固然也能夠存儲在磁盤文件中、XML數據文件中等等。架構
什麼是 「持久層」
持久層(Persistence Layer),即專一於實現數據持久化應用領域的某個特定系統的一個邏輯層面,將數據使用者和數據實體相關聯。app
什麼是ORM框架
即Object-Relationl Mapping,它的做用是在關係型數據庫和對象之間做一個映射,這樣,咱們在具體的操做數據庫的時候,就不須要再去和複雜的SQL語句打交道,只要像平時操做對象同樣操做它就能夠了 。設計
爲何要作持久化和ORM設計(重要)orm
在目前的企業應用系統設計中,MVC,即 Model(模型)- View(視圖)- Control(控制)爲主要的系統架構模式。MVC 中的 Model 包含了複雜的業務邏輯和數據邏輯,以及數據存取機制(如 JDBC的鏈接、SQL生成和Statement建立、還有ResultSet結果集的讀取等)等。將這些複雜的業務邏輯和數據邏輯分離,以將系統的緊耦 合關係轉化爲鬆耦合關係(即解耦合),是下降系統耦合度迫切要作的,也是持久化要作的工做。MVC 模式實現了架構上將表現層(即View)和數據處理層(即Model)分離的解耦合,而持久化的設計則實現了數據處理層內部的業務邏輯和數據邏輯分離的解耦合。 而 ORM 做爲持久化設計中的最重要也最複雜的技術,也是目前業界熱點技術。對象
簡單來講,按一般的系統設計,使用 JDBC 操做數據庫,業務處理邏輯和數據存取邏輯是混雜在一塊兒的。
通常基本都是以下幾個步驟:
一、創建數據庫鏈接,得到 Connection 對象。
二、根據用戶的輸入組裝查詢 SQL 語句。
三、根據 SQL 語句創建 Statement 對象 或者 PreparedStatement 對象。
四、用 Connection 對象執行 SQL語句,得到結果集 ResultSet 對象。
五、而後一條一條讀取結果集 ResultSet 對象中的數據。
六、根據讀取到的數據,按特定的業務邏輯進行計算。
七、根據計算獲得的結果再組裝更新 SQL 語句。
八、再使用 Connection 對象執行更新 SQL 語句,以更新數據庫中的數據。
七、最後依次關閉各個 Statement 對象和 Connection 對象。ip
由上可看出代碼邏輯很是複雜,這還不包括某條語句執行失敗的處理邏輯。其中的業務處理邏輯和數據存取邏輯徹底混雜在一塊。而一個完整的系統要包含成 千上萬個這樣重複的而又混雜的處理過程,假如要對其中某些業務邏輯或者一些相關聯的業務流程作修改,要改動的代碼量將不可想象。另外一方面,假如要換數據庫 產品或者運行環境也多是個不可能完成的任務。而用戶的運行環境和要求卻千差萬別,咱們不可能爲每個用戶每一種運行環境設計一套同樣的系統。
所 以就要將同樣的處理代碼即業務邏輯和可能不同的處理即數據存取邏輯分離開來,另外一方面,關係型數據庫中的數據基本都是以一行行的數據進行存取的,而程序 運行倒是一個個對象進行處理,而目前大部分數據庫驅動技術(如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 實現框架比這個要複雜的多。get