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ù)