很長一段時間,網上有不少關於Hibernate與Mybatis孰優孰劣的爭論,兩個陣營的人誰也不能說服誰,每一個人的理由都頗有道理。今天,我分享的主題是:在一個項目中同時使用Hibernate和Mybatis兩個ORM框架。java
做爲一個開發者,沒有必要花費過多的時間去證實技術無用論,當你開始指責某個框架垃圾,另一個框架最好時,隱性的暴露出你對某個框架沒有深刻的研究,無知的指責對於技術的提高沒有任何的幫助。框架自己沒有對錯一說,只有適合和更適合項目的選擇。任何框架都有自身的能力範圍,就拿Hibernate和Mybatis這兩個ORM框架來講,Hibernate封裝了不少有用的API給開發者,下降了操做數據庫的難度和複雜度,同時也減小了模板代碼的數量,但Hibernate留給開發者可操做的空間相對Mybatis少了不少;Mybatis框架使用起來很靈活,開發者能夠自定義查詢語句,但增長了模板代碼的數量,看起來沒有Hibernate那麼便捷。兩種框架在便捷與靈活兩個指標上作出了取捨與妥協,這不能說是框架的錯。對於一個框架而言,須要有自身專一的領域和設計願景,不可能面面俱到。git
使用任何一種技術框架,都須要貼合現實的業務需求以及自身的技術能力。當你尚未深刻的去了解一門技術或者當前業務需求沒法與框架契合時,不要盲目的批判框架的好壞。今天,我再也不去對比Hibernate與Mybatis二者之間的優劣,而是給出一個比較中庸的放方案,將兩個ORM框架同時整合在一個項目中。github
若是你想成功運行本文中的源代碼,須要知足一下的幾個條件:數據庫
如需獲取本次分享內容的源代碼進調試,能夠到文章末尾找到源代碼倉庫鏈接json
爲了快速構建項目,筆者採用Spring Boot來構建項目,同時使用加入Spring Data JPA和Mybatis兩個ORM框架的依賴包。在此須要特別說明,Hibernate是一個JPA標準的實現,爾Spring Data JPA是一個JPA數據訪問抽象,經過Spring Data JPA,能夠輕鬆使用Hibernate框架。markdown
你能夠經過Spring Initializer來初始化項目,也能夠經過IDEA自帶的Spring Initializer功能構建項目,項目構建完成以後,pom.xml文件中的配置以下(包含但不限於文中給出的依賴項):網絡
爲了演示同時使用Hibernate和Mybatis操做數據庫,須要提供一個實體類User.java,代碼以下所示:mybatis
說明:app
在本次演示的項目中,使用到了Lombok插件,它可讓開發者減小模板代碼的書寫,提升開發速度。@Data註解能夠自動生成類屬性的getter、setter和toString方法。@NoArgsConstructor會自動爲類生成無參構造函數,@AllArgsConstructor則會生成帶所有屬性的構造函數。框架
在本次課程中,將使用Spring Data JPA來完成寫操做,如新增、修改、刪除;使用Mybatis來完成讀操做,如根據用戶ID查詢、查詢全部的用戶等。Spring Data JPA和MyBatis的持久化接口都位於com.ramostear.hm.orm包下,Spring Data JPA的持久化接口相對比較簡單,之間繼承JpaRepository類便可,代碼以下:
說明:由於JPA只負責寫操做,因此直接繼承並使用JpaRepository提供的API便可,不須要額外的定義其餘的接口方法。
下面是Mybatis的映射接口,定義了兩個方法:根據ID查詢用戶信息和查詢全部的用戶信息。代碼以下所示:
說明:
此接口須要注意的地方是@Component和@Mapper註解,@Component註解標註此接口後,Spring會自動掃描並配置此類;@Mapper註解是把這個mapper的DAO交由Spring進行管理。
定義完Mybatis 映射接口後,須要提供一個進行數據庫查詢的xml配置文件。該文件位於resources/mapper文件夾中,UserMapper.xml完整代碼以下:
在UserService接口中,提供三個方法:保存用戶信息、根據ID查詢用戶、查詢全部的用戶。UserService接口代碼以下:
在UserService接口的實現類中,須要同時注入UserRepository和UserMapper兩個依賴。咱們使用構造函數的方式來注入這兩個依賴。代碼以下:
說明:
@Transactional註解用於設置每一個方法的事務控制方式。@Service註解聲明該類是一個服務提供類,且設置了該類被Spring初始化時Bean對象的名稱爲「userService」。
最後,提供一個控制器,用於處理客戶端的相關請求。在控制器中,提供了三個請求處理方法,分別處理客戶端新增用戶、根據ID查詢用戶和查詢全部用戶的請求。控制器代碼以下:
說明:
在本次教程中,爲了編碼IDEA報警告,全部的依賴注入都採用構造函數的方式注入相關的依賴。
網絡上有不少關於在Spring Boot項目中配置Hibernate和Mybatis的教程,但同時配置Hibernate和Mybatis的文章不多,有一些是經過Java代碼的方式對這兩個ORM框架進行配置,採用的是多數據源的方法來整合兩個框架。其實整合這兩個框架沒有想象中的那麼難,只須要在application.yml或者application.properties配置文件中加入幾行代碼,就能夠完成兩個框架的整合。以application.yml配置文件爲例,配置代碼以下:
是否是很簡單,併爲沒有太多複雜的配置,這是一種較爲簡單的整合方式。Hibernate和Mybatis共用一個數據源,若是是JPA的忠實粉絲,如今想要使用Mybatis,只須要額外加入mybatis的配置便可。
經過以上的幾個步驟,整個項目已經搭建完畢,接下來將使用Postman測試工具對Controller的三個方法進行測試,驗證兩個ORM框架在同一個項目中是否能共存。
首先測試 POST http://localhost/users ,驗證Hibernate是否可以成功將用戶信息持久化。打開Postman工具,在地址欄輸入http://localhost/users請求地址,請求方式選擇POST,在Body欄輸入以下的信息:
{ "username":"譚朝紅", "alias":"ramostear", "age":28 } 複製代碼
點擊「Send」按鈕發送請求,觀察服務端響應信息,測試結果以下圖所示:
能夠看到,服務端成功返回用戶信息,且用戶ID=3。接下來,咱們請求 GET http://localhost/users/3 ,驗證Mybatis是否可以成功查詢出用戶信息,測試結果以下:
經過測試,服務端成功返回了用戶ID=3的用戶信息:
{ "id": 3, "username": "譚朝紅", "alias": "ramostear", "age": 28 } 複製代碼
由此證實,在同一個項目中,Hibernate和Mybatis均能正常工做,整合方案有效,解決了在同一項目中Hibernate與Mybatis共存的問題。
本次課程驗證了同時使用Hibernate和Mybatis兩個ORM框架的方案可行,且採用了一種比較簡單的方式來整合兩個框架,摒棄了多數據源的複雜配置,快速實現兩個框架並用的需求。
在一個項目中同時使用兩個ORM框架有沒有實際的意義呢?個人答案是確定的。同時使用兩個ORM框架,二者之間能夠相互彌補自身的不足,以達到靈活性和便捷性同時兼顧,另一方面,在單獨使用Mybatis時,開發者須要手動或者藉助其餘的工具生成數據庫表信息,而採用本文的整合方案,Mybatis能夠藉助JPA自動生成數據庫表的能力,從而簡化使用Mybatis的步驟。最後,對於一些讀多於寫的系統,徹底能夠將這兩個框架同時使用,寫操做少的模塊,可使用Spring Data JPA快速完成相關功能的實現,對於讀操做部分,則能夠利用Mybatis來優化查詢語句。二者之間的優點互補,能進一步的提高開發效率和系統性能。
本次分享內容的源代碼倉庫地址: