{eval=Array;=+count(Array);}
選擇哪一種框架,需要結(jié)合項目實際來,結(jié)合業(yè)務(wù)場景和團隊成員的能力,綜合考慮并選擇技術(shù)方案。
Hibernate:POJO與數(shù)據(jù)庫表建立映射關(guān)系;Java程序員可以使用操作對象的思維操作數(shù)據(jù)庫。(POJO就是Java Bean,只有有屬性、set、get方法)
Mybatis:做的是POJO與SQL之間的映射關(guān)系;程序員需要編寫SQL;
Spring Data JPA:有人說它是對Hibernate更高級的封裝,這種說法是有一些問題的;第二部分詳細說明一下。
期初Java需要通過各個數(shù)據(jù)庫廠商提供的API進行數(shù)據(jù)庫的訪問,后來JAVA提出了JDBC,程序直接使用JDBC這套規(guī)范就可以跟各個數(shù)據(jù)庫進行對接;
接著誕生了ORM技術(shù),簡化了Java對象的持久化工作,出現(xiàn)了Hibernate、TopLink等ORM框架;
Sun公司在JDK1.5的時候,吸收了Hibernate、TopLink等ORM框架的優(yōu)點,提出了Java持久化規(guī)范:JPA;
Hibernate在3.2的時候提供了JPA的實現(xiàn),其余的JPA的供應(yīng)商還有諸如OpenJPA、Toplink等;
Spring在做持久化這一塊的工作,開發(fā)了Spring-data-xxx這一系列包,如:Spring-data-jpa,Spring-data-redis,Spring-data-mongodb等等,這些都是Spring 提供的基于JPA和其他一些NOSQL的Repository。
Spring data JPA 是在JPA規(guī)范的基礎(chǔ)下提供了Repository層的實現(xiàn),但是使用哪一款ORM需要你自己去決定;相比我們更為熟悉的Hibernate和MyBatis,Spring Data JPA可以看做更高層次的抽象。
使用Spring data JPA,默認底層是Hibernate,但是可以修改成其他的ORM框架。
Hibernate開發(fā)難度較大,學習周期長;但是可以讓開發(fā)者無需關(guān)心SQL,更專注業(yè)務(wù)流程;HQL不關(guān)心數(shù)據(jù)庫的類型,所以遷移起來很方便;
Mybatis需要手動編寫SQL語句(更直觀),可更直接地對SQL進行優(yōu)化,但是數(shù)據(jù)庫移植性差;
Spring Data JPA簡化了數(shù)據(jù)庫訪問,可以通過命名規(guī)范編寫SQL,如果SQL較為復雜,還是需要通過注解的方式編寫SQL;它更適用于現(xiàn)在微服務(wù)的架構(gòu)(微服務(wù)的極致都是單表操作)。
從個人的角度:MyBatis>Spring Data JPA>Hibernate,或者MyBatis + Spring Data JPA。
如果沒有更換不同數(shù)據(jù)庫可能,Mybatis 可能更好一些,現(xiàn)在的Mybatis不光只有原生,什么操作都得寫SQL了,自動增刪改查單表的插件也很多了,而且自動分頁插件也有,都挺優(yōu)秀。關(guān)于Hibernate和Spring Data Jpa本質(zhì)基本一樣,Hibernate是JPA標準的一種實現(xiàn),同為JPA實現(xiàn)的還有Eclipselink 、OpenJPA。這樣Hibernate就是Spring Data Jpa的默認執(zhí)行器,同時Spring Data Jpa也有Eclipselink的實現(xiàn),在實際使用中JPQL(HQL)會出現(xiàn)方法不足的情況最后還是得用SQL,比如像xxx,xxx,xxx這樣的數(shù)據(jù),JPA和HQL中沒有實現(xiàn),但是在MySQL中有一個find in set方法。
JPA: J2EE數(shù)據(jù)持久化的規(guī)范
JPA規(guī)范實現(xiàn):Hibernate
Spring Data JPA: 本質(zhì)也是借助Hibernate實現(xiàn)JPA規(guī)范,并提供了很多數(shù)據(jù)庫交互的接口,容易快速上手
hibernate相比mybatis較重,如果只是簡單業(yè)務(wù)借助于HQL語言可以提高開發(fā)效率。mybatis相比hibernate比較靈活,近乎原生的sql操作,處理復雜邏輯或者sql調(diào)優(yōu)優(yōu)勢巨大,目前我接觸的IT公司基本清一色的mybatis
0
回答0
回答0
回答0
回答0
回答0
回答1
回答10
回答0
回答4
回答