Java技術(shù)棧 www.javastack.cn 關(guān)注閱讀更多優(yōu)質(zhì)文章
很長一段時(shí)間,,網(wǎng)上有很多關(guān)于Hibernate與Mybatis孰優(yōu)孰劣的爭論,,兩個(gè)陣營的人誰也不能說服誰,每個(gè)人的理由都很有道理,。 今天,,我分享的主題是:在一個(gè)項(xiàng)目中同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架。
一,、準(zhǔn)備開發(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ù)庫系統(tǒng),。筆者在本文中使用的是MySQL 5.1.x版本的數(shù)據(jù)庫系統(tǒng)
二、搭建項(xiàng)目2-1,、引入依賴為了快速構(gòu)建項(xiàng)目,,筆者采用Spring Boot來構(gòu)建項(xiàng)目,同時(shí)使用加入Spring Data JPA和Mybatis兩個(gè)ORM框架的依賴包,。關(guān)注Java技術(shù)棧公眾號在后臺回復(fù)boot可以獲取系列Spring Boot教程,。在此需要特別說明,Hibernate是一個(gè)JPA標(biāo)準(zhǔn)的實(shí)現(xiàn),,而Spring Data JPA是一個(gè)JPA數(shù)據(jù)訪問抽象,,通過Spring Data JPA,可以輕松使用Hibernate框架,。你可以通過Spring Initializer來初始化項(xiàng)目,,也可以通過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ù)庫,需要提供一個(gè)實(shí)體類User.java,,代碼如下所示:說明: 在本次演示的項(xiàng)目中,,使用到了Lombok插件,它可以讓開發(fā)者減少模板代碼的書寫,,提高開發(fā)速度,。@Data注解可以自動(dòng)生成類屬性的getter、setter和toString方法,。@NoArgsConstructor會自動(dòng)為類生成無參構(gòu)造函數(shù),,@AllArgsConstructor則會生成帶全部屬性的構(gòu)造函數(shù)。
2-3,、定義數(shù)據(jù)持久化接口在本次課程中,,將使用Spring Data JPA來完成寫操作,如新增,、修改,、刪除;使用Mybatis來完成讀操作,,如根據(jù)用戶ID查詢,、查詢所有的用戶等。Spring Data JPA和MyBatis的持久化接口都位于com.ramostear.hm.orm包下,,Spring Data JPA的持久化接口相對比較簡單,,之間繼承JpaRepository類即可,代碼如下:說明:因?yàn)镴PA只負(fù)責(zé)寫操作,,所以直接繼承并使用JpaRepository提供的API即可,,不需要額外的定義其他的接口方法,。 下面是Mybatis的映射接口,定義了兩個(gè)方法:根據(jù)ID查詢用戶信息和查詢所有的用戶信息,。代碼如下所示:說明: 此接口需要注意的地方是@Component和@Mapper注解,,@Component注解標(biāo)注此接口后,,Spring會自動(dòng)掃描并配置此類,;@Mapper注解是把這個(gè)mapper的DAO交由Spring進(jìn)行管理。 定義完Mybatis 映射接口后,,需要提供一個(gè)進(jìn)行數(shù)據(jù)庫查詢的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ù)的方式來注入這兩個(gè)依賴,。代碼如下:
說明: @Transactional注解用于設(shè)置每個(gè)方法的事務(wù)控制方式。@Service注解聲明該類是一個(gè)服務(wù)提供類,,且設(shè)置了該類被Spring初始化時(shí)Bean對象的名稱為“userService”,。
2-5、定義控制器最后,,提供一個(gè)控制器,,用于處理客戶端的相關(guān)請求。在控制器中,,提供了三個(gè)請求處理方法,,分別處理客戶端新增用戶、根據(jù)ID查詢用戶和查詢所有用戶的請求,??刂破鞔a如下:說明: 在本次教程中,為了編碼IDEA報(bào)警告,,所有的依賴注入都采用構(gòu)造函數(shù)的方式注入相關(guān)的依賴,。
三、配置Hibernate和Mybatis四,、測試通過以上的幾個(gè)步驟,整個(gè)項(xiàng)目已經(jīng)搭建完畢,,接下來將使用Postman測試工具對Controller的三個(gè)方法進(jìn)行測試,,驗(yàn)證兩個(gè)ORM框架在同一個(gè)項(xiàng)目中是否能共存。首先測試 POST http://localhost/users ,,驗(yàn)證Hibernate是否能夠成功將用戶信息持久化,。打開Postman工具,在地址欄輸入http://localhost/users請求地址,,請求方式選擇POST,在Body欄輸入如下的信息:{
"username":"譚朝紅",
"alias":"ramostear",
"age":28
}
點(diǎn)擊“Send”按鈕發(fā)送請求,,觀察服務(wù)端響應(yīng)信息,測試結(jié)果如下圖所示:可以看到,,服務(wù)端成功返回用戶信息,且用戶ID=3,。接下來,,我們請求 GET http://localhost/users/3 ,驗(yàn)證Mybatis是否能夠成功查詢出用戶信息,測試結(jié)果如下:通過測試,,服務(wù)端成功返回了用戶ID=3的用戶信息:{
"id": 3,
"username": "譚朝紅",
"alias": "ramostear",
"age": 28
}
由此證明,,在同一個(gè)項(xiàng)目中,Hibernate和Mybatis均能正常工作,,整合方案有效,,解決了在同一項(xiàng)目中Hibernate與Mybatis共存的問題。五,、總結(jié)本次課程驗(yàn)證了同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架的方案可行,,且采用了一種比較簡單的方式來整合兩個(gè)框架,摒棄了多數(shù)據(jù)源的復(fù)雜配置,,快速實(shí)現(xiàn)兩個(gè)框架并用的需求,。在一個(gè)項(xiàng)目中同時(shí)使用兩個(gè)ORM框架有沒有實(shí)際的意義呢?我的答案是肯定的,。同時(shí)使用兩個(gè)ORM框架,,兩者之間可以相互彌補(bǔ)自身的不足,以達(dá)到靈活性和便捷性同時(shí)兼顧,,另外一方面,,在單獨(dú)使用Mybatis時(shí),開發(fā)者需要手動(dòng)或者借助其他的工具生成數(shù)據(jù)庫表信息,,而采用本文的整合方案,,Mybatis可以借助JPA自動(dòng)生成數(shù)據(jù)庫表的能力,從而簡化使用Mybatis的步驟,。最后,,對于一些讀多于寫的系統(tǒng),,完全可以將這兩個(gè)框架同時(shí)使用,寫操作少的模塊,,可以使用Spring Data JPA快速完成相關(guān)功能的實(shí)現(xiàn),,對于讀操作部分,則可以利用Mybatis來優(yōu)化查詢語句,。兩者之間的優(yōu)勢互補(bǔ),,能進(jìn)一步的提升開發(fā)效率和系統(tǒng)性能。版權(quán)申明:本作品系作者譚朝紅原創(chuàng) ,, 采用《署名-非商業(yè)性使用-禁止演繹 4.0 國際》許可協(xié)議 來源:segmentfault.com/a/1190000019476544
|