了解orm,先了解以下概念:
- 什么是“持久化”
持久(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內(nèi)存中的數(shù)據(jù)存儲在關(guān)系型的數(shù)據(jù)庫中,當然也可以存儲在磁盤文件中、XML數(shù)據(jù)文件中等等。- 什么是 “持久層”
持久層(Persistence Layer),即專注于實現(xiàn)數(shù)據(jù)持久化應用領(lǐng)域的某個特定系統(tǒng)的一個邏輯層面,將數(shù)據(jù)使用者和數(shù)據(jù)實體相關(guān)聯(lián)。
一、什么是ORM
- 對象關(guān)系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。那么,到底如何實現(xiàn)持久化呢?一種簡單的方案是采用硬編碼方式,為每一種可能的數(shù)據(jù)庫訪問操作提供單獨的方法。
- ORM提供了實現(xiàn)持久化層的另一種模式,它采用映射元數(shù)據(jù)來描述對象關(guān)系的映射,使得ORM中間件能在任何一個應用的業(yè)務邏輯層和數(shù)據(jù)庫層之間充當橋梁。Java典型的ORM中間件有:Hibernate,ibatis,speedframework。
- 這種方案存在以下不足:
1. 持久化層缺乏彈性。一旦出現(xiàn)業(yè)務需求的變更,就必須修改持久化層的接口
2. 持久化層同時與域模型與關(guān)系數(shù)據(jù)庫模型綁定,不管域模型還是關(guān)系數(shù)據(jù)庫模型發(fā)生變化,毒藥修改持久化曾的相關(guān)程序代碼,增加了軟件的維護難度。 - ORM的方法論基于三個核心原則:
- 簡單:以最基本的形式建模數(shù)據(jù)。
- 傳達性:數(shù)據(jù)庫結(jié)構(gòu)被任何人都能理解的語言文檔化。
- 精確性:基于數(shù)據(jù)模型創(chuàng)建正確標準化了的結(jié)構(gòu)。
二、ORM的概念
- 讓我們從O/R開始。字母O起源于"對象"(Object),而R則來自于"關(guān)系"(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數(shù)據(jù)庫。在業(yè)務邏輯層和用戶界面層中,我們是面向?qū)ο蟮?。當對象信息發(fā)生變化的時候,我們需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。
- 當你開發(fā)一個應用程序的時候(不使用O/R Mapping),你可能會寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存,刪除,讀取對象信息,等等。你在DAL中寫了很多的方法來讀取對象數(shù)據(jù),改變狀態(tài)對象等等任務。而這些代碼寫起來總是重復的。
- ORM解決的主要問題是對象關(guān)系的映射。域模型和關(guān)系模型分別是建立在概念模型的基礎(chǔ)上的。域模型是面向?qū)ο蟮模P(guān)系模型是面向關(guān)系的。一般情況下,一個持久化類和一個表對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表的每個字段。
- ORM技術(shù)特點:
- 提高了開發(fā)效率。由于ORM可以自動對Entity對象與數(shù)據(jù)庫中的Table進行字段與屬性的映射,所以我們實際可能已經(jīng)不需要一個專用的、龐大的數(shù)據(jù)訪問層。
- ORM提供了對數(shù)據(jù)庫的映射,不用sql直接編碼,能夠像操作對象一樣從數(shù)據(jù)庫獲取數(shù)據(jù)。
三、ORM的優(yōu)缺點
- ORM的缺點是會犧牲程序的執(zhí)行效率和會固定思維模式。
從系統(tǒng)結(jié)構(gòu)上來看,采用ORM的系統(tǒng)一般都是多層系統(tǒng),系統(tǒng)的層次多了,效率就會降低。ORM是一種完全的面向?qū)ο蟮淖龇ǎ嫦驅(qū)ο蟮淖龇ㄒ矔π阅墚a(chǎn)生一定的影響。 - 在我們開發(fā)系統(tǒng)時,一般都有性能問題。性能問題主要產(chǎn)生在算法不正確和與數(shù)據(jù)庫不正確的使用上。ORM所生成的代碼一般不太可能寫出很高效的算法,在數(shù)據(jù)庫應用上更有可能會被誤用,主要體現(xiàn)在對持久對象的提取和和數(shù)據(jù)的加工處理上,如果用上了ORM,程序員很有可能將全部的數(shù)據(jù)提取到內(nèi)存對象中,然后再進行過濾和加工處理,這樣就容易產(chǎn)生性能問題。
- 在對對象做持久化時,ORM一般會持久化所有的屬性,有時,這是不希望的。
- 但ORM是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對絕大多數(shù)的系統(tǒng),應該是很少的。
Spring支持的ORM:
- Hibernate
- iBatis
- JPA (Java Persistence API)
- TopLink
- JDO (Java Data Objects)
- OJB
進階學習參考 編寫ORM