框架:Hibernate和Mybatis的区别
Mybatis和hibernate不同,
Mybatis不完全是一個(gè)ORM框架,因?yàn)镸yBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML或注解方式靈活配置要運(yùn)行的sql語句,并將java對(duì)象和sql語句映射生成最終執(zhí)行的sql,最后將sql執(zhí)行的結(jié)果再映射生成java對(duì)象。
Mybatis學(xué)習(xí)門檻低,簡(jiǎn)單易學(xué),程序員直接編寫原生態(tài)sql,可嚴(yán)格控制sql執(zhí)行性能,靈活度高,非常適合對(duì)關(guān)系數(shù)據(jù)模型要求不高的軟件開發(fā),例如互聯(lián)網(wǎng)軟件、企業(yè)運(yùn)營(yíng)類軟件等,因?yàn)檫@類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的前提是mybatis無法做到數(shù)據(jù)庫無關(guān)性,如果需要實(shí)現(xiàn)支持多種數(shù)據(jù)庫的軟件則需要自定義多套sql映射文件,工作量大。(因?yàn)槊恳恢蠸QL的語法有些不同)
mybatis無法做到數(shù)據(jù)庫無關(guān)性
Hibernate對(duì)象/關(guān)系映射能力強(qiáng),數(shù)據(jù)庫無關(guān)性好,對(duì)于關(guān)系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發(fā)可以節(jié)省很多代碼,提高效率。但是Hibernate的學(xué)習(xí)門檻高,要精通門檻更高,而且怎么設(shè)計(jì)O/R映射,在性能和對(duì)象模型之間如何權(quán)衡,以及怎樣用好Hibernate需要具有很強(qiáng)的經(jīng)驗(yàn)和能力才行。
Hibernate對(duì)象/關(guān)系映射能力強(qiáng),數(shù)據(jù)庫無關(guān)性好
總之,按照用戶的需求在有限的資源環(huán)境下只要能做出維護(hù)性、擴(kuò)展性良好的軟件架構(gòu)都是好架構(gòu),所以框架只有適合才是最好。
1.概念:
Hibernate :Hibernate是一個(gè)開放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來操縱數(shù)據(jù)庫。著力點(diǎn)對(duì)象與對(duì)象之間關(guān)系,自動(dòng)生成SQL。
Mybatis:MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。Mybatis著力于POJO與SQL之間的映射關(guān)系
Spring Data:Spring Data是一個(gè)用于簡(jiǎn)化數(shù)據(jù)庫訪問,并支持云服務(wù)的開源框架。其主要目標(biāo)是使得對(duì)數(shù)據(jù)的訪問變得方便快捷,并支持map-reduce框架和云計(jì)算數(shù)據(jù)服務(wù)。
2.開發(fā)的難度:
Hibernate的開發(fā)難度要大于Mybatis、Spring Data。主要是由于Hibernate封裝了完整的對(duì)象關(guān)系映射機(jī)制,以至于內(nèi)部的實(shí)現(xiàn)比較復(fù)雜、龐大,學(xué)習(xí)周期較長(zhǎng)。
Mybatis 主要依賴于SQL的編寫與ResultMap的映射。
Spring Data易上手,通過命名規(guī)范、注解查詢簡(jiǎn)化查詢操作。
3.查詢區(qū)別:
簡(jiǎn)單查詢:Hibernate 提供了基礎(chǔ)的查詢方法,也可以根據(jù)具體的業(yè)務(wù)編寫相應(yīng)的SQL(HQL);
Mybatis需要手動(dòng)編寫SQL語句,Spring Data 繼承基礎(chǔ)接口,可使用內(nèi)置的增刪改查方法。
高級(jí)查詢:Hibernate通過對(duì)象映射機(jī)制,開發(fā)者無需關(guān)心SQL的生成與結(jié)果映射,專注業(yè)務(wù)流程;Mybatis需要通過手動(dòng)在XML文件中編寫SQL語句以及ResultMap或者注解,Spring Data 提供了命名規(guī)范查詢和注解查詢更簡(jiǎn)便的編寫想要的SQL。
4.數(shù)據(jù)庫的擴(kuò)展性:
Hibernate與數(shù)據(jù)庫具體的關(guān)聯(lián)都在XML中,所以HQL對(duì)具體是用什么數(shù)據(jù)庫并不是很關(guān)心。
Mybatis由于所有SQL都是依賴數(shù)據(jù)庫書寫的,所以擴(kuò)展性,遷移性比較差。
Spring Data 與數(shù)據(jù)具體的關(guān)聯(lián)可以通過命名規(guī)范查詢、注解查詢,無需關(guān)心數(shù)據(jù)庫的差異,但是通過本地化SQL查詢的話,就不易擴(kuò)展。
5.緩存機(jī)制:
相同點(diǎn):Hibernate和Mybatis的二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨?#xff0c;創(chuàng)建適配器來完全覆蓋緩存行為。
不同點(diǎn):Hibernate的二級(jí)緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對(duì)象映射中配置是那種緩存。
MyBatis的二級(jí)緩存配置都是在每個(gè)具體的表-對(duì)象映射中進(jìn)行詳細(xì)配置,這樣針對(duì)不同的表可以自定義不同的緩存機(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---->對(duì)象化查詢 Criteria c = getSession().Criteria(Admin.class)
? ?c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
???c.add(Restrictions.eq("apassword", password));
3.DetachedCriteria----->動(dòng)態(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)用存儲(chǔ)過程 {call 存儲(chǔ)過程名}?
Spring Data查詢:
1.命名查詢,需要遵循Spring Data規(guī)范,例如findByUser、deleteById 等從右向左解析生成sql
2.注解查詢:@Query(“ql語句”)
7.總結(jié):
Hibernate 對(duì)數(shù)據(jù)庫提供了較為完整的封裝,封裝了基本的DAO層操作,有較好的數(shù)據(jù)庫移植性
Mybatis 可以進(jìn)行更細(xì)致的SQL優(yōu)化,查詢必要的字段,但是需要維護(hù)SQL和查詢結(jié)果集的映射,而且數(shù)據(jù)庫的移植性較差,針對(duì)不同的數(shù)據(jù)庫編寫不同的SQL,
Spring Data JPA 極大的簡(jiǎn)化了數(shù)據(jù)庫訪問,可以通過命名規(guī)范、注解的方式較快的編寫SQL。
總結(jié)
以上是生活随笔為你收集整理的框架:Hibernate和Mybatis的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架:mybatis的缓存机制
- 下一篇: Java:四种取整的方法