哦哇資訊網

魚與熊掌得兼:Hibernate與Mybatis共存

由 愛吃年糕的皮皮蝦 發表于 科技2021-06-13

很長一段時間,網上有很多關於Hibernate與Mybatis孰優孰劣的爭論,兩個陣營的人誰也不能說服誰,每個人的理由都很有道理。今天,我分享的主題是:在一個專案中同時使用Hibernate和Mybatis兩個ORM框架。

作為一個開發者,沒有必要花費過多的時間去證明技術無用論,當你開始指責某個框架垃圾,另外一個框架最好時,隱性的暴露出你對某個框架沒有深入的研究,無知的指責對於技術的提升沒有任何的幫助。框架本身沒有對錯一說,只有適合和更適合專案的選擇。任何框架都有自身的能力範圍,就拿Hibernate和Mybatis這兩個ORM框架來說,Hibernate封裝了很多有用的API給開發者,降低了操作資料庫的難度和複雜度,同時也減少了模板程式碼的數量,但Hibernate留給開發者可操作的空間相對Mybatis少了很多;Mybatis框架使用起來很靈活,開發者可以自定義查詢語句,但增加了模板程式碼的數量,看起來沒有Hibernate那麼便捷。兩種框架在便捷與靈活兩個指標上做出了取捨與妥協,這不能說是框架的錯。對於一個框架而言,需要有自身專注的領域和設計願景,不可能面面俱到。

使用任何一種技術框架,都需要貼合現實的業務需求以及自身的技術能力。當你還沒有深入的去了解一門技術或者當前業務需求無法與框架契合時,不要盲目地批判框架的好壞。今天,我不再去對比Hibernate與Mybatis兩者之間的優劣,而是給出一個比較中庸的放方案,將兩個ORM框架同時整合在一個專案中。

一、準備開發環境

如果你想成功執行本文中的原始碼,需要滿足以下的幾個條件:

1、JDK : JDK 1。8。x及以上版本

2、Maven : Maven 3。x或更高版本

3、Git:

版本控制工具,選擇一個你喜歡的

4、IDE:選擇你比較喜歡的一個程式碼編輯器,如STS、IntelliJ IDEA。

筆者使用的是IntelliJ IDEA

5、Databases:選擇一個你熟練使用的資料庫系統。

筆者在本文中使用的是MySQL 5。1。x版本的資料庫系統

如需獲取本次分享內容的原始碼進除錯,可以到文章末尾找到原始碼倉庫連線

二、搭建專案

2-1、引入依賴

為了快速構建專案,筆者採用Spring Boot來構建專案,同時使用加入Spring Data JPA和Mybatis兩個ORM框架的依賴包。在此需要特別說明,Hibernate是一個JPA標準的實現,而Spring Data JPA是一個JPA資料訪問抽象,透過Spring Data JPA,可以輕鬆使用Hibernate框架。

你可以透過Spring Initializer來初始化專案,也可以透過IDEA自帶的Spring Initializer功能構建專案,專案構建完成之後,pom。xml檔案中的配置如下(包含但不限於文中給出的依賴項):

2-2、定義實體類-User。java

為了演示同時使用Hibernate和Mybatis操作資料庫,需要提供一個實體類User。java,程式碼如下所示:

說明:

在本次演示的專案中,使用到了Lombok外掛,它可以讓開發者減少模板程式碼的書寫,提高開發速度。@Data註解可以自動生成類屬性的getter、setter和toString方法。@NoArgsConstructor會自動為類生成無參建構函式,@AllArgsConstructor則會生成帶全部屬性的建構函式。

2-3、定義資料持久化介面

在本次課程中,將使用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完整程式碼如下:

魚與熊掌得兼:Hibernate與Mybatis共存

2-4、定義UserService

在UserService介面中,提供三個方法:儲存使用者資訊、根據ID查詢使用者、查詢所有的使用者。UserService介面程式碼如下:

魚與熊掌得兼:Hibernate與Mybatis共存

在UserService介面的實現類中,需要同時注入UserRepository和UserMapper兩個依賴。我們使用建構函式的方式來注入這兩個依賴。程式碼如下:

魚與熊掌得兼:Hibernate與Mybatis共存

說明:

@Transactional註解用於設定每個方法的事務控制方式。@Service註解宣告該類是一個服務提供類,且設定了該類被Spring初始化時Bean物件的名稱為“userService”。

2-5、定義控制器

最後,提供一個控制器,用於處理客戶端的相關請求。在控制器中,提供了三個請求處理方法,分別是客戶端新增使用者、根據ID查詢使用者和查詢所有使用者的請求。控制器程式碼如下:

魚與熊掌得兼:Hibernate與Mybatis共存

說明:

在本次教程中,為了編碼IDEA報警告,所有的依賴注入都採用建構函式的方式注入相關的依賴。

三、配置Hibernate和Mybatis

網路上有很多關於在Spring Boot專案中配置Hibernate和Mybatis的教程,但同時配置Hibernate和Mybatis的文章很少,有一些是透過Java程式碼的方式對這兩個ORM框架進行配置,採用的是多資料來源的方法來整合兩個框架。其實整合這兩個框架沒有想象中的那麼難,只需要在application。yml或者application。properties配置檔案中加入幾行程式碼,就可以完成兩個框架的整合。以application。yml配置檔案為例,配置程式碼如下:

魚與熊掌得兼:Hibernate與Mybatis共存

是不是很簡單,併為沒有太多複雜的配置,這是一種較為簡單的整合方式。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”按鈕傳送請求,觀察服務端響應資訊,測試結果如下圖所示:

魚與熊掌得兼:Hibernate與Mybatis共存

可以看到,服務端成功返回使用者資訊,且使用者ID=3。接下來,我們請求 GET http://localhost/users/3,驗證Mybatis是否能夠成功查詢出使用者資訊,測試結果如下:

魚與熊掌得兼:Hibernate與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來最佳化查詢語句。兩者之間的優勢互補,能進一步的提升開發效率和系統性能。

TAG: MybatisHibernate框架SpringJPA