ORM框架--------Hibernate、Mybatis與Spring JPA-Data之間的區(qū)別

1.概念:

Hibernate:Hibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。著力點(diǎn)對象與對象之間關(guān)系

2.簡介:

Mybatis:MyBatis

本是apache的一個開源項(xiàng)目iBatis, 2010年這個項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。Mybatis:著力于POJO與SQL之間的映射關(guān)系

Spring Data:Spring Data:是一個用于簡化數(shù)據(jù)庫訪問,并支持云服務(wù)的開源框架。其主要目標(biāo)是使得對數(shù)據(jù)的訪問變得方便快捷,并支持map-reduce框架和云計(jì)算數(shù)據(jù)服務(wù)。

3.開發(fā)的難度:

Hibernate的開發(fā)難度要大于Mybatis、Spring Data。主要是由于Hibernate封裝了完整的對象關(guān)系映射機(jī)制,以至于內(nèi)部的實(shí)現(xiàn)比較復(fù)雜、龐大,學(xué)習(xí)周期較長。

Mybatis

主要依賴于SQL的編寫與ResultMap的映射。

Spring

Data易上手,通過命名規(guī)范、注解查詢簡化查詢操作。


4.查詢區(qū)別:

簡單查詢:Hibernate

提供了基礎(chǔ)的查詢方法,也可以根據(jù)具體的業(yè)務(wù)編寫相應(yīng)的SQL;

Mybatis需要手動編寫SQL語句,Spring

Data 繼承基礎(chǔ)接口,可使用內(nèi)置的增刪改查方法。

高級查詢:Hibernate通過對象映射機(jī)制,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射,專注業(yè)務(wù)流程;Mybatis需要通過手動在XML文件中編寫SQL語句以及ResultMap或者注解,Spring

Data 提供了命名規(guī)范查詢和注解查詢更簡便的編寫想要的SQL。

5.數(shù)據(jù)庫的擴(kuò)展性:

Hibernate與數(shù)據(jù)庫具體的關(guān)聯(lián)都在XML中,所以HQL對具體是用什么數(shù)據(jù)庫并不是很關(guān)心。

Mybatis由于所有SQL都是依賴數(shù)據(jù)庫書寫的,所以擴(kuò)展性,遷移性比較差。

Spring Data 與數(shù)據(jù)具體的關(guān)聯(lián)可以通過命名規(guī)范查詢、注解查詢,無需關(guān)心數(shù)據(jù)庫的差異,但是通過本地化SQL查詢的話,就不易擴(kuò)展。

6.緩存機(jī)制:

相同點(diǎn):Hibernate和Mybatis的二級緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨福瑒?chuàng)建適配器來完全覆蓋緩存行為。

不同點(diǎn):Hibernate的二級緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對象映射中配置是那種緩存。

MyBatis的二級緩存配置都是在每個具體的表-對象映射中進(jìn)行詳細(xì)配置,這樣針對不同的表可以自定義不同的緩存機(jī)制。并且Mybatis可以在命名空間中共享相同的緩存配置和實(shí)例,通過Cache-ref來實(shí)現(xiàn)。

Spring

Data 可以通過自己的緩存或者第三方緩存方案,配置滿足自己業(yè)務(wù)需要的緩存行為。

6.查詢方式:

Hibernate查詢:

?.1.HQL??--->from?Admin?as?admin?where?admin.name?=:name?使用命名參數(shù),僅使用與Hiberante框架

2.Criteria---->對象化查詢?Criteria?c?=?getSession().Criteria(Admin.class)

??c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或???c.add(Restrictions.eq("apassword",?password));

3.DetachedCriteria----->動態(tài)分離查詢

4.例子查詢-Example.create(user).list()

5.sql查詢

Query?q?=?s.createSQLQuery("select?*?from?user").addEntity(User.class);

6.命名查詢:Query?q?=?getSession().getNamedQuery(“getUserByID”);

Mybatis查詢:

l?定義xml例如;userMapper.xml

l?定義接口userMapper?定義相關(guān)的方法?不必編寫接口的實(shí)現(xiàn)類

l?通過mybatis內(nèi)部處理機(jī)制解析xml文件中的sql?

l?調(diào)用存儲過程?{call?存儲過程名}

Spring

Data查詢:

1.命名查詢,需要遵循Spring?Data規(guī)范,例如findByUser、deleteById?等從右向左解析生成sql

2.注解查詢:@Query(“ql語句”)

7.總結(jié):

Hibernate?對數(shù)據(jù)庫提供了較為完整的封裝,封裝了基本的DAO層操作,有較好的數(shù)據(jù)庫移植性

Mybatis 可以進(jìn)行更細(xì)致的SQL優(yōu)化,查詢必要的字段,但是需要維護(hù)SQL和查詢結(jié)果集的映射,而且數(shù)據(jù)庫的移植性較差,針對不同的數(shù)據(jù)庫編寫不同的SQL,

Spring?Data?JPA?極大的簡化了數(shù)據(jù)庫訪問,可以通過命名規(guī)范、注解的方式較快的編寫SQL。

ORM框架的使用需要根據(jù)具體的項(xiàng)目業(yè)務(wù)選擇更適合的技術(shù)方案,而不能一味地為了技術(shù)而技術(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容