1.什么是ORM ?
- 對象關(guān)系映射(Object Relational Mapping,簡稱ORM)是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。 簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將Java程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。 這也同時暗示者額外的執(zhí)行開銷;然而,如果ORM作為一種中間件實現(xiàn),則會有很多機(jī)會做優(yōu)化,而這些在手寫的持久層并不存在。 更重要的是用于控制轉(zhuǎn)換的元數(shù)據(jù)需要提供和管理;但是同樣,這些花費要比維護(hù)手寫的方案要少;而且就算是遵守ODMG規(guī)范的對象數(shù)據(jù)庫依然需要類級別的元數(shù)據(jù)。
- 對象-關(guān)系映射(Object/Relation Mapping,簡稱ORM),是隨著面向?qū)ο蟮能浖_發(fā)方法發(fā)展而產(chǎn)生的。面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法,關(guān)系數(shù)據(jù)庫是企業(yè)級應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲系統(tǒng)。對象和關(guān)系數(shù)據(jù)是業(yè)務(wù)實體的兩種表現(xiàn)形式,業(yè)務(wù)實體在內(nèi)存中表現(xiàn)為對象,在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù)。內(nèi)存中的對象之間存在關(guān)聯(lián)和繼承關(guān)系,而在數(shù)據(jù)庫中,關(guān)系數(shù)據(jù)無法直接表達(dá)多對多關(guān)聯(lián)和繼承關(guān)系。因此,對象-關(guān)系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射。
- 面向?qū)ο笫菑能浖こ袒驹瓌t(如耦合、聚合、封裝)的基礎(chǔ)上發(fā)展起來的,而關(guān)系數(shù)據(jù)庫則是從數(shù)學(xué)理論發(fā)展而來的,兩套理論存在顯著的區(qū)別。為了解決這個不匹配的現(xiàn)象,對象關(guān)系映射技術(shù)應(yīng)運而生。
- 讓我們從O/R開始。字母O起源于"對象"(Object),而R則來自于"關(guān)系"(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數(shù)據(jù)庫。在業(yè)務(wù)邏輯層和用戶界面層中,我們是面向?qū)ο蟮摹.?dāng)對象信息發(fā)生變化的時候,我們需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。
- 當(dāng)你開發(fā)一個應(yīng)用程序的時候(不使用O/R Mapping),你可能會寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存、刪除、讀取對象信息等等。你在DAO中寫了很多的方法來讀取對象數(shù)據(jù),改變狀態(tài)對象等等任務(wù),并且這些代碼寫起來總是重復(fù)的。
解決方案,引入一個O/R Mapping。實質(zhì)上,一個O/R Mapping會為你生成DAO。與其自己寫DAO代碼,不如用O/R Mapping。你用O/R Mapping保存、刪除、讀取對象,O/R Mapping負(fù)責(zé)生成SQL,你只需要關(guān)心對象就好。
2.ORM組成
- 一個對持久類對象進(jìn)行CRUD操作的API;
- 一個語言或API用來規(guī)定與類和類屬性相關(guān)的查詢;
- 一個規(guī)定mapping metadata的工具;
- 一種技術(shù)可以讓ORM的實現(xiàn)同事務(wù)對象一起進(jìn)行dirty checking, lazy association fetching以及其他的優(yōu)化操作。
3.持久化的概念
狹義的理解:“持久化”僅僅指把域?qū)ο笥谰帽4娴綌?shù)據(jù)庫中;
廣義的理解:“持久化”包括和數(shù)據(jù)庫相關(guān)的各種操作(持久化就是將有用的數(shù)據(jù)以某種技術(shù)保存起來,將來可以再次取出來應(yīng)用,數(shù)據(jù)庫技術(shù),將內(nèi)存數(shù)據(jù)一文件的形式保存在永久介質(zhì)中(磁盤等)都是持久化的例子)。
- 保存:把域?qū)ο?或者實體Bean)永久保存到數(shù)據(jù)庫。
- 更新:更新數(shù)據(jù)庫中域?qū)ο?或者說持久化對象)的狀態(tài)。
- 刪除:從數(shù)據(jù)庫中刪除一個域?qū)ο蟆?/li>
- 加載:根據(jù)特定的OID(一般是指主鍵ID),把一個域?qū)ο髲臄?shù)據(jù)庫加載到內(nèi)存。
- 查詢:根據(jù)特定的查詢條件,把符合查詢條件的一個或多個域?qū)ο髲臄?shù)據(jù)庫加載內(nèi)在存中。
4.為什么使用持久化?
- 持久化技術(shù)封裝了數(shù)據(jù)訪問細(xì)節(jié),為大部分業(yè)務(wù)邏輯提供面向?qū)ο蟮腁PI。
- 通過持久化技術(shù)可以減少訪問數(shù)據(jù)庫數(shù)據(jù)次數(shù),增加應(yīng)用程序執(zhí)行速度
- 代碼重用性高,能夠完成大部分?jǐn)?shù)據(jù)庫操作;
- 松散耦合,使持久化不依賴于底層數(shù)據(jù)庫和上層業(yè)務(wù)邏輯實現(xiàn),更換數(shù)據(jù)庫時只需修改配置文件而不用修改代碼。
5.有哪些ORM產(chǎn)品?
目前眾多廠商和開源社區(qū)都提供了持久層框架的實現(xiàn),常見的有:
Apache OJB | Cayenne | Jaxor | Hibernate | iBatis[MyBatis] | JPA等等
- Hibernate 的輕量級 ORM 模型逐步確立了在 Java ORM 架構(gòu)中領(lǐng)導(dǎo)地位,甚至取代復(fù)雜而又繁瑣的 EJB 模型而成為事實上的 Java ORM 工業(yè)標(biāo)準(zhǔn)。而且其中的許多設(shè)計均被 J2EE 標(biāo)準(zhǔn)組織吸納而成為最新 EJB 3.0 規(guī)范的標(biāo)準(zhǔn),這也是開源項目影響工業(yè)領(lǐng)域標(biāo)準(zhǔn)的有力見證。
- JPA(Java Persistense API)是EJB3.0的一部分,為其提供了一套O/R關(guān)系映射的API,但不僅限于EJB中使用,它也可以在web應(yīng)用或者應(yīng)用程序客戶端中被使用,甚至在Java桌面程序中被使用。
- iBATIS/MyBatis 的著力點,則在于POJO 與SQL之間的映射關(guān)系。然后通過映射配置文件,將SQL所需的參數(shù),以及返回的結(jié)果字段映射到指定POJO。 相對Hibernate“O/R”而言,iBATIS 是一種“Sql Mapping”的ORM實現(xiàn)。
6.MyBatis和Hibernate的區(qū)別
- 1.Hibernate是全自動,而MyBatis是半自動 [簡單理解]
Hibernate完全可以通過對象關(guān)系模型實現(xiàn)對數(shù)據(jù)庫的操作,擁有完整的JavaBean對象與數(shù)據(jù)庫的映射結(jié)構(gòu)來自動生成SQL語句。而MyBatis僅有基本的字段映射,對象數(shù)據(jù)以及對象實際關(guān)系仍然需要通過定制SQL語句來實現(xiàn)和管理。 - 2.Hibernate數(shù)據(jù)庫移植性遠(yuǎn)大于MyBatis
Hibernate通過它強(qiáng)大的映射結(jié)構(gòu)和hql語言,大大降低了對象與數(shù)據(jù)庫(Oracle、MySQL等)的耦合性,而MyBatis由于需要手寫sql,因此與數(shù)據(jù)庫的耦合性直接取決于程序員寫SQL的方法,如果SQL不具通用性而用了很多某數(shù)據(jù)庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。 - 3.Hibernate擁有完整的日志系統(tǒng),MyBatis則欠缺一些
Hibernate日志系統(tǒng)非常健全,涉及廣泛,包括:SQL記錄、關(guān)系異常、優(yōu)化警告、緩存提示、臟數(shù)據(jù)警告等;而MyBatis則除了基本記錄功能外,功能薄弱很多。 - 4.MyBatis相比Hibernate需要關(guān)心很多細(xì)節(jié)
Hibernate配置要比MyBatis復(fù)雜的多,學(xué)習(xí)成本也比MyBatis高。但也正因為MyBatis使用簡單,才導(dǎo)致它要比Hibernate關(guān)心很多技術(shù)細(xì)節(jié)。MyBatis由于不用考慮很多細(xì)節(jié),開發(fā)模式上與傳統(tǒng)jdbc區(qū)別很小,因此很容易上手并開發(fā)項目,但忽略細(xì)節(jié)會導(dǎo)致項目前期bug較多,因而開發(fā)出相對穩(wěn)定的軟件很慢,而開發(fā)出軟件卻很快。Hibernate則正好與之相反。但是如果使用Hibernate很熟練的話,實際上開發(fā)效率絲毫不差于甚至超越MyBatis。 - 5.SQL直接優(yōu)化上,MyBatis要比Hibernate方便很多
個人認(rèn)為:這也是很多公司選擇它的重要原因!
由于MyBatis的sql都是寫在xml里,因此優(yōu)化sql比Hibernate方便很多。而Hibernate的sql很多都是自動生成的,無法直接維護(hù)sql;雖有hql,但功能還是不及sql強(qiáng)大,見到報表等變態(tài)需求時,hql也歇菜,也就是說hql是有局限的;hibernate雖然也支持原生sql,但開發(fā)模式上卻與orm不同,需要轉(zhuǎn)換思維,因此使用上不是非常方便??傊畬憇ql的靈活度上Hibernate不及MyBatis。
- 6.安全性
安全性,Hibernate是預(yù)編譯的,MyBatis可能存在SQL注入問題,另外使用Hibernate對數(shù)據(jù)庫類型進(jìn)行切換時,成本明顯低于MyBatis