Hibernate 與 Mybatis 的共存問(wèn)題,打破你的認(rèn)知!(兩個(gè)ORM框架)
很長(zhǎng)一段時(shí)間,網(wǎng)上有很多關(guān)于Hibernate與Mybatis孰優(yōu)孰劣的爭(zhēng)論,兩個(gè)陣營(yíng)的人誰(shuí)也不能說(shuō)服誰(shuí),每個(gè)人的理由都很有道理。
今天,我分享的主題是:在一個(gè)項(xiàng)目中同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架。
作為一個(gè)開(kāi)發(fā)者,沒(méi)有必要花費(fèi)過(guò)多的時(shí)間去證明技術(shù)無(wú)用論,當(dāng)你開(kāi)始指責(zé)某個(gè)框架垃圾,另外一個(gè)框架最好時(shí),隱性的暴露出你對(duì)某個(gè)框架沒(méi)有深入的研究,無(wú)知的指責(zé)對(duì)于技術(shù)的提升沒(méi)有任何的幫助。
框架本身沒(méi)有對(duì)錯(cuò)一說(shuō),只有適合和更適合項(xiàng)目的選擇。任何框架都有自身的能力范圍,就拿Hibernate和Mybatis這兩個(gè)ORM框架來(lái)說(shuō)。
Hibernate封裝了很多有用的API給開(kāi)發(fā)者,降低了操作數(shù)據(jù)庫(kù)的難度和復(fù)雜度,同時(shí)也減少了模板代碼的數(shù)量,但Hibernate留給開(kāi)發(fā)者可操作的空間相對(duì)Mybatis少了很多。
Mybatis框架使用起來(lái)很靈活,開(kāi)發(fā)者可以自定義查詢語(yǔ)句,但增加了模板代碼的數(shù)量,看起來(lái)沒(méi)有Hibernate那么便捷。
兩種框架在便捷與靈活兩個(gè)指標(biāo)上做出了取舍與妥協(xié),這不能說(shuō)是框架的錯(cuò)。對(duì)于一個(gè)框架而言,需要有自身專注的領(lǐng)域和設(shè)計(jì)愿景,不可能面面俱到。
使用任何一種技術(shù)框架,都需要貼合現(xiàn)實(shí)的業(yè)務(wù)需求以及自身的技術(shù)能力。當(dāng)你還沒(méi)有深入的去了解一門(mén)技術(shù)或者當(dāng)前業(yè)務(wù)需求無(wú)法與框架契合時(shí),不要盲目的批判框架的好壞。
今天,我不再去對(duì)比Hibernate與Mybatis兩者之間的優(yōu)劣,而是給出一個(gè)比較中庸的放方案,將兩個(gè)ORM框架同時(shí)整合在一個(gè)項(xiàng)目中。
一、準(zhǔn)備開(kāi)發(fā)環(huán)境
如果你想成功運(yùn)行本文中的源代碼,需要滿足一下的幾個(gè)條件:
- 1、JDK : JDK 1.8.x及以上版本
- 2、Maven : Maven 3.x或更高版本
- 3、Git:版本控制工具,選擇一個(gè)你喜歡的
- 4、IDE : 選擇你比較喜歡的一個(gè)代碼編輯器,如STS、IntelliJ IDEA。筆者使用的是IntelliJ IDEA
- 5、Databases : 選擇一個(gè)你熟練使用的數(shù)據(jù)庫(kù)系統(tǒng)。筆者在本文中使用的是MySQL 5.1.x版本的數(shù)據(jù)庫(kù)系統(tǒng)
二、搭建項(xiàng)目
2-1、引入依賴
為了快速構(gòu)建項(xiàng)目,筆者采用Spring Boot來(lái)構(gòu)建項(xiàng)目,同時(shí)使用加入Spring Data JPA和Mybatis兩個(gè)ORM框架的依賴包。關(guān)注Java技術(shù)棧公眾號(hào)在后臺(tái)回復(fù)boot可以獲取系列Spring Boot教程。
在此需要特別說(shuō)明,Hibernate是一個(gè)JPA標(biāo)準(zhǔn)的實(shí)現(xiàn),而Spring Data JPA是一個(gè)JPA數(shù)據(jù)訪問(wèn)抽象,通過(guò)Spring Data JPA,可以輕松使用Hibernate框架。
你可以通過(guò)Spring Initializer來(lái)初始化項(xiàng)目,也可以通過(guò)IDEA自帶的Spring Initializer功能構(gòu)建項(xiàng)目,項(xiàng)目構(gòu)建完成之后,pom.xml文件中的配置如下(包含但不限于文中給出的依賴項(xiàng)):
2-2、定義實(shí)體類-User.java
為了演示同時(shí)使用Hibernate和Mybatis操作數(shù)據(jù)庫(kù),需要提供一個(gè)實(shí)體類User.java,代碼如下所示:
說(shuō)明:
在本次演示的項(xiàng)目中,使用到了Lombok插件,它可以讓開(kāi)發(fā)者減少模板代碼的書(shū)寫(xiě),提高開(kāi)發(fā)速度。@Data注解可以自動(dòng)生成類屬性的getter、setter和toString方法。@NoArgsConstructor會(huì)自動(dòng)為類生成無(wú)參構(gòu)造函數(shù),@AllArgsConstructor則會(huì)生成帶全部屬性的構(gòu)造函數(shù)。
2-3、定義數(shù)據(jù)持久化接口
在本次課程中,將使用Spring Data JPA來(lái)完成寫(xiě)操作,如新增、修改、刪除;使用Mybatis來(lái)完成讀操作,如根據(jù)用戶ID查詢、查詢所有的用戶等。
Spring Data JPA和MyBatis的持久化接口都位于com.ramostear.hm.orm包下,Spring Data JPA的持久化接口相對(duì)比較簡(jiǎn)單,之間繼承JpaRepository類即可,代碼如下:
說(shuō)明:因?yàn)镴PA只負(fù)責(zé)寫(xiě)操作,所以直接繼承并使用JpaRepository提供的API即可,不需要額外的定義其他的接口方法。
下面是Mybatis的映射接口,定義了兩個(gè)方法:根據(jù)ID查詢用戶信息和查詢所有的用戶信息。代碼如下所示:
說(shuō)明:
此接口需要注意的地方是@Component和@Mapper注解,@Component注解標(biāo)注此接口后,Spring會(huì)自動(dòng)掃描并配置此類;@Mapper注解是把這個(gè)mapper的DAO交由Spring進(jìn)行管理。
定義完Mybatis 映射接口后,需要提供一個(gè)進(jìn)行數(shù)據(jù)庫(kù)查詢的xml配置文件。該文件位于resources/mapper文件夾中,UserMapper.xml完整代碼如下:
2-4、定義UserService
在UserService接口中,提供三個(gè)方法:保存用戶信息、根據(jù)ID查詢用戶、查詢所有的用戶。UserService接口代碼如下:
在UserService接口的實(shí)現(xiàn)類中,需要同時(shí)注入U(xiǎn)serRepository和UserMapper兩個(gè)依賴。我們使用構(gòu)造函數(shù)的方式來(lái)注入這兩個(gè)依賴。代碼如下:
說(shuō)明:
@Transactional注解用于設(shè)置每個(gè)方法的事務(wù)控制方式。@Service注解聲明該類是一個(gè)服務(wù)提供類,且設(shè)置了該類被Spring初始化時(shí)Bean對(duì)象的名稱為“userService”。
2-5、定義控制器
最后,提供一個(gè)控制器,用于處理客戶端的相關(guān)請(qǐng)求。在控制器中,提供了三個(gè)請(qǐng)求處理方法,分別處理客戶端新增用戶、根據(jù)ID查詢用戶和查詢所有用戶的請(qǐng)求。控制器代碼如下:
說(shuō)明:
在本次教程中,為了編碼IDEA報(bào)警告,所有的依賴注入都采用構(gòu)造函數(shù)的方式注入相關(guān)的依賴。
三、配置Hibernate和Mybatis
網(wǎng)絡(luò)上有很多關(guān)于在Spring Boot項(xiàng)目中配置Hibernate和Mybatis的教程,但同時(shí)配置Hibernate和Mybatis的文章很少,有一些是通過(guò)Java代碼的方式對(duì)這兩個(gè)ORM框架進(jìn)行配置,采用的是多數(shù)據(jù)源的方法來(lái)整合兩個(gè)框架。
其實(shí)整合這兩個(gè)框架沒(méi)有想象中的那么難,只需要在application.yml或者application.properties配置文件中加入幾行代碼,就可以完成兩個(gè)框架的整合。
以application.yml配置文件為例,配置代碼如下:
是不是很簡(jiǎn)單,并為沒(méi)有太多復(fù)雜的配置,這是一種較為簡(jiǎn)單的整合方式。Hibernate和Mybatis共用一個(gè)數(shù)據(jù)源,如果是JPA的忠實(shí)粉絲,現(xiàn)在想要使用Mybatis,只需要額外加入mybatis的配置即可。
四、測(cè)試
通過(guò)以上的幾個(gè)步驟,整個(gè)項(xiàng)目已經(jīng)搭建完畢,接下來(lái)將使用Postman測(cè)試工具對(duì)Controller的三個(gè)方法進(jìn)行測(cè)試,驗(yàn)證兩個(gè)ORM框架在同一個(gè)項(xiàng)目中是否能共存。
首先測(cè)試 POST http://localhost/users ,驗(yàn)證Hibernate是否能夠成功將用戶信息持久化。打開(kāi)Postman工具,在地址欄輸入http://localhost/users請(qǐng)求地址,請(qǐng)求方式選擇POST,在Body欄輸入如下的信息:
{"username":"譚朝紅","alias":"ramostear","age":28}
點(diǎn)擊“Send”按鈕發(fā)送請(qǐng)求,觀察服務(wù)端響應(yīng)信息,測(cè)試結(jié)果如下圖所示:
可以看到,服務(wù)端成功返回用戶信息,且用戶ID=3。接下來(lái),我們請(qǐng)求 GET http://localhost/users/3 ,驗(yàn)證Mybatis是否能夠成功查詢出用戶信息,測(cè)試結(jié)果如下:
通過(guò)測(cè)試,服務(wù)端成功返回了用戶ID=3的用戶信息:
{"id": 3,"username": "譚朝紅","alias": "ramostear","age": 28}
由此證明,在同一個(gè)項(xiàng)目中,Hibernate和Mybatis均能正常工作,整合方案有效,解決了在同一項(xiàng)目中Hibernate與Mybatis共存的問(wèn)題。
五、總結(jié)
本次課程驗(yàn)證了同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架的方案可行,且采用了一種比較簡(jiǎn)單的方式來(lái)整合兩個(gè)框架,摒棄了多數(shù)據(jù)源的復(fù)雜配置,快速實(shí)現(xiàn)兩個(gè)框架并用的需求。
在一個(gè)項(xiàng)目中同時(shí)使用兩個(gè)ORM框架有沒(méi)有實(shí)際的意義呢?
**我的答案是肯定的。**同時(shí)使用兩個(gè)ORM框架,兩者之間可以相互彌補(bǔ)自身的不足,以達(dá)到靈活性和便捷性同時(shí)兼顧,另外一方面,在單獨(dú)使用Mybatis時(shí),開(kāi)發(fā)者需要手動(dòng)或者借助其他的工具生成數(shù)據(jù)庫(kù)表信息,而采用本文的整合方案,Mybatis可以借助JPA自動(dòng)生成數(shù)據(jù)庫(kù)表的能力,從而簡(jiǎn)化使用Mybatis的步驟。
最后,對(duì)于一些讀多于寫(xiě)的系統(tǒng),完全可以將這兩個(gè)框架同時(shí)使用,寫(xiě)操作少的模塊,可以使用Spring Data JPA快速完成相關(guān)功能的實(shí)現(xiàn),對(duì)于讀操作部分,則可以利用Mybatis來(lái)優(yōu)化查詢語(yǔ)句。兩者之間的優(yōu)勢(shì)互補(bǔ),能進(jìn)一步的提升開(kāi)發(fā)效率和系統(tǒng)性能。
版權(quán)申明:本作品系作者譚朝紅原創(chuàng) , 采用《署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際》許可協(xié)議來(lái)源:segmentfault.com/a/1190000019476544
推薦去我的博客閱讀更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構(gòu)、阿里巴巴等大廠最新面試題
到此這篇關(guān)于Hibernate 與 Mybatis 的共存問(wèn)題,打破你的認(rèn)知!(兩個(gè)ORM框架)的文章就介紹到這了,更多相關(guān)Hibernate 與 Mybatis 共存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Java數(shù)組查詢的相關(guān)問(wèn)題及實(shí)例
這篇文章主要介紹了關(guān)于Java數(shù)組查詢的相關(guān)問(wèn)題及實(shí)例,需要的朋友可以參考下。2017-08-08Maven包沖突導(dǎo)致NoSuchMethodError錯(cuò)誤的解決辦法
web 項(xiàng)目 能正常編譯,運(yùn)行時(shí)也正常啟動(dòng),但執(zhí)行到需要調(diào)用 org.codehaus.jackson 包中的某個(gè)方法時(shí),產(chǎn)生運(yùn)行異常,這篇文章主要介紹了Maven包沖突導(dǎo)致NoSuchMethodError錯(cuò)誤的解決辦法,需要的朋友可以參考下2024-05-05使用springcloud+oauth2攜帶token去請(qǐng)求其他服務(wù)
這篇文章主要介紹了使用springcloud+oauth2攜帶token去請(qǐng)求其他服務(wù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java程序員必須知道的4個(gè)書(shū)寫(xiě)代碼技巧
本篇文章主要給大家講述了作為JAVA程序員如何能寫(xiě)出高效的代碼以及運(yùn)行效率更高的代碼,一起學(xué)習(xí)分享下吧。2017-12-12idea配置全局變量Jdk、maven倉(cāng)庫(kù)以及maven詳解(全文圖解)
這篇文章主要給大家介紹了關(guān)于idea配置全局變量Jdk、maven倉(cāng)庫(kù)以及maven的相關(guān)資料,在配置JDK和Maven之前,需要確保已經(jīng)正確安裝了JDK和Maven,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Springboot下載excel文件中文名亂碼問(wèn)題及解決
這篇文章主要介紹了Springboot下載excel文件中文名亂碼問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05SpringBoot實(shí)現(xiàn)初始化的三種策略模式
本文主要介紹了SpringBoot實(shí)現(xiàn)初始化的三種策略模式,包括默認(rèn)初始化策略、懶加載初始化策略和自定義初始化策略,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟
這篇文章主要介紹了SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10