Hibernate淘汰了?只是你不會用而已!
不知道大家在整合SpringBoot+MyBatis有沒有想過, 為什么SpringBoot不提供MyBatis的官方Starter呢?你以為是為了和SpringDataJPA競爭?

?不不不
首先Hibernate才是正統(tǒng)的JPA血脈!JPA(Java Persistence API )是JDK欽點的ORM規(guī)范! 那SpringBoot要做ORM框架肯定跟著JDK玩,畢竟JDK才是整個java的標準,所以SpringBoot會選擇Hibernate作為SpringDataJPA的ORM實現框架也理所當然。 MyBatis?根本算不上ORM框架,不過是一個封裝了JDBC的持久化框架!SpringBoot我都不愿意跟你玩,你對標的應該是我的JDBCTemplate,我都有一個封裝了JDBC的組件干嘛還跟你玩,你要跟我玩自己寫Starter來適配我! 這才是真正的原因!

我知道你看完還是無法打動你,我們來比較一下Hibernate VS MyBatis:
Hibernate VS MyBatis

Hibernate 是一個對象關系映射框架 (ORM),它將 Java 類映射到數據庫表。 MyBatis 是一個持久化框架——不是 ORM。它將 SQL 語句映射到 Java 方法。
為什么國人更偏愛MyBatis
總結原因: 1.你連JPA、Hibernate、ORM 都搞不清楚,還咋用Hibernate?Hibernate學習和使用門檻比MyBatis高 2.MyBatis簡單易學上手快—符合培訓機構的教學標準。培訓機構都教MyBatis能不流行嘛! 3.中國特色的業(yè)務需求更復雜,使用MyBatis實現簡單快捷。Hibernate要實復雜需求現難度更大! 4.為了無條件實現領導的需求。需要面向領導編程。
隨著SSH的落幕,SSM的帶動下。時代變遷\技術變更\大眾選擇
ps:那說來說去感覺還是應該MyBatis更好用啊..Hibernate還是被時代被社會環(huán)境拋棄了啊..雖然它確實有用又能怎么樣呢?但是hibernate在實現一些需求單一的應用還是有它的優(yōu)勢的:相較傳統(tǒng)的Mybatis來說,持久層代碼碼少了60%,當然大部分都是體現在xml文件上,你無需花精力去維護你SQL語句,大大簡化了持久層的開發(fā)、提升了開發(fā)效率。所以他們可以用于不同場景:
不同使用場景
Hibernate用于
● 常規(guī) CRUD功能、偏簡單的業(yè)務需求 。
● 編程方式由對象模型驅動—CodeFisrt。
● 有更換數據庫的需求。
MyBatis 用于
● 編程方式由數據庫驅動—DBFisrt。
● 對SQL語句有極致的優(yōu)化需求。
● 對復雜的搜索查詢,動態(tài)條件查詢支持更舒服。
哦~~看樣子他們各有各的好處,難不成我Hibernate和MyBatis混用?確實有很多應用這么干,但是我不建議在一個應用中混用,增加了應用架構的復雜度,但是如果一個應用可以拆成互不相干的小應用呢?各自小應用可以根據自己的業(yè)務復雜度選擇自己所需的技術呢?
所以迎來Hibernate的又一春來了—— 微服務下結合SpringDataJpa
微服務架構下的關鍵就是:“拆!”,代碼和數據庫都會隨之拆分,單個服務的業(yè)務復雜度也就降低了,隨之SQL復雜度也就降低了,并且我每個服務可以自由選擇自己的技術互不干涉,SpringDataJpa的用武之地毋庸置疑??!

使用SpringDataJPA
SpringBoot下使用SpringDataJPA不要太方便:
1.只需加入對應springdatajpa依賴
<dependency>
? ?
????<groupId>org.springframework.boot</groupId>
? ?
????<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2.添加Repository接口
結合dao層的Repository內置接口即可快速的CRUD,多種持久化方式供你自由選擇,以下示例中7種:
public interface CustomerRepository extends PagingAndSortingRepository<Customer,Long> ??
????//1.實現分頁排序和CRUD
?// 需要實現動態(tài)條件也有很多內置接口可選擇, QueryByExampleExecutor<Customer> ?// 2.實現動態(tài)條件:快速精確匹配(查), JpaSpecificationExecutor<Customer> // 3.實現動態(tài)條件:Specification(查), QuerydslPredicateExecutor<Customer> ?// 4.實現動態(tài)條件:Querydsl(查){ ?
????// 5.還可以根據規(guī)定方法名進行快速定制持久化操作(查刪)
????List<Customer> findByCustName(String custName);
????// 即可生成SELECT * FROM Customer WHERE custName=?
?
?
?
????// 如果你想自定義語句查詢,依然提供:
?
????// 6.通過JPQL進行持久化操作(增刪改查)
?
"FROM Customer where custName=:custName ") ?
(
????List<Customer> findCustomerByCustName(@Param("custName") String custName); ?
????// 7.通過原生SQL進行持久化操作(增刪改查)
?
"select * FROM tb_customer where cust_name=:custName ",nativeQuery = true) ?
(value=
????List<Customer> findCustomerByCustNameBySql(@Param("custName") String custName);
}
第5種更多規(guī)定方法名對照表:?
使用:
直接調用持久化方法即可、無需依賴任何代碼生成器
CustomerRepository repository;
// 1.PagingAndSortingRepositoryrepository.findById(20L);
// 5.規(guī)定方法名repository.findByCustName("圖靈");
// 4.通過QueryDSL可以進行復雜查詢: 是不是跟SQL很像:
JPAQuery<Tuple> tupleJPAQuery = factory
?.select(customer.custId, customer.custName)
?.from(customer)
?.where(customer.custId.eq(1L))
?.orderBy(customer.custId.desc());
??
?// ...更多方式可以學習springdatajpa課程
總結和展望
SpringDataJPA使用起來的感受就是一個字 “快” ,它能快速的搭建起一個持久層,也不用像Mybatis一樣太多的關心SQL。 其實在互聯網項目中涉及到實時直接操作數據的場景會越來越少, 大多數都會通過緩存或其他NoSql存儲(ES、MongoDB)、定時任務、MQ等技術 來為數據庫減壓。所以我覺得以后數據庫的運用就應該是簡單直接的。 所以推薦簡單業(yè)務的應用和微服務架構下都可以采用SpringDataJpa,而MyBatis的則為實現那些復雜的ERP\OA等各種系統(tǒng)、為了應付領導各種復雜的需求才有它的用武之地。