<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Hibernate 與 Mybatis 如何共存?打破你的認(rèn)知!

          共 4184字,需瀏覽 9分鐘

           ·

          2020-07-27 19:17

          Java技術(shù)棧

          www.javastack.cn

          關(guān)注閱讀更多優(yōu)質(zhì)文章



          很長(zhǎng)一段時(shí)間,網(wǎng)上有很多關(guān)于Hibernate與Mybatis孰優(yōu)孰劣的爭(zhēng)論,兩個(gè)陣營(yíng)的人誰也不能說服誰,每個(gè)人的理由都很有道理。


          今天,我分享的主題是:在一個(gè)項(xiàng)目中同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架。


          作為一個(gè)開發(fā)者,沒有必要花費(fèi)過多的時(shí)間去證明技術(shù)無用論,當(dāng)你開始指責(zé)某個(gè)框架垃圾,另外一個(gè)框架最好時(shí),隱性的暴露出你對(duì)某個(gè)框架沒有深入的研究,無知的指責(zé)對(duì)于技術(shù)的提升沒有任何的幫助。
          框架本身沒有對(duì)錯(cuò)一說,只有適合和更適合項(xiàng)目的選擇。任何框架都有自身的能力范圍,就拿Hibernate和Mybatis這兩個(gè)ORM框架來說。
          Hibernate封裝了很多有用的API給開發(fā)者,降低了操作數(shù)據(jù)庫的難度和復(fù)雜度,同時(shí)也減少了模板代碼的數(shù)量,但Hibernate留給開發(fā)者可操作的空間相對(duì)Mybatis少了很多。
          Mybatis框架使用起來很靈活,開發(fā)者可以自定義查詢語句,但增加了模板代碼的數(shù)量,看起來沒有Hibernate那么便捷。
          兩種框架在便捷與靈活兩個(gè)指標(biāo)上做出了取舍與妥協(xié),這不能說是框架的錯(cuò)。對(duì)于一個(gè)框架而言,需要有自身專注的領(lǐng)域和設(shè)計(jì)愿景,不可能面面俱到。
          使用任何一種技術(shù)框架,都需要貼合現(xiàn)實(shí)的業(yè)務(wù)需求以及自身的技術(shù)能力。當(dāng)你還沒有深入的去了解一門技術(shù)或者當(dāng)前業(yè)務(wù)需求無法與框架契合時(shí),不要盲目的批判框架的好壞。
          今天,我不再去對(duì)比Hibernate與Mybatis兩者之間的優(yōu)劣,而是給出一個(gè)比較中庸的放方案,將兩個(gè)ORM框架同時(shí)整合在一個(gè)項(xiàng)目中。

          一、準(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ù)棧公眾號(hào)在后臺(tái)回復(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會(huì)自動(dòng)為類生成無參構(gòu)造函數(shù),@AllArgsConstructor則會(huì)生成帶全部屬性的構(gòu)造函數(shù)。

          2-3、定義數(shù)據(jù)持久化接口

          在本次課程中,將使用Spring Data JPA來完成寫操作,如新增、修改、刪除;使用Mybatis來完成讀操作,如根據(jù)用戶ID查詢、查詢所有的用戶等。
          Spring Data JPA和MyBatis的持久化接口都位于com.ramostear.hm.orm包下,Spring Data JPA的持久化接口相對(duì)比較簡(jiǎn)單,之間繼承JpaRepository類即可,代碼如下:

          說明:因?yàn)镴PA只負(fù)責(zé)寫操作,所以直接繼承并使用JpaRepository提供的API即可,不需要額外的定義其他的接口方法。

          下面是Mybatis的映射接口,定義了兩個(gè)方法:根據(jù)ID查詢用戶信息和查詢所有的用戶信息。代碼如下所示:

          說明:

          此接口需要注意的地方是@Component和@Mapper注解,@Component注解標(biāo)注此接口后,Spring會(huì)自動(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對(duì)象的名稱為“userService”。

          2-5、定義控制器

          最后,提供一個(gè)控制器,用于處理客戶端的相關(guān)請(qǐng)求。在控制器中,提供了三個(gè)請(qǐng)求處理方法,分別處理客戶端新增用戶、根據(jù)ID查詢用戶和查詢所有用戶的請(qǐng)求??刂破鞔a如下:

          說明:

          在本次教程中,為了編碼IDEA報(bào)警告,所有的依賴注入都采用構(gòu)造函數(shù)的方式注入相關(guān)的依賴。

          三、配置Hibernate和Mybatis

          網(wǎng)絡(luò)上有很多關(guān)于在Spring Boot項(xiàng)目中配置Hibernate和Mybatis的教程,但同時(shí)配置Hibernate和Mybatis的文章很少,有一些是通過Java代碼的方式對(duì)這兩個(gè)ORM框架進(jìn)行配置,采用的是多數(shù)據(jù)源的方法來整合兩個(gè)框架。
          其實(shí)整合這兩個(gè)框架沒有想象中的那么難,只需要在application.yml或者application.properties配置文件中加入幾行代碼,就可以完成兩個(gè)框架的整合。
          以application.yml配置文件為例,配置代碼如下:

          是不是很簡(jiǎn)單,并為沒有太多復(fù)雜的配置,這是一種較為簡(jiǎn)單的整合方式。Hibernate和Mybatis共用一個(gè)數(shù)據(jù)源,如果是JPA的忠實(shí)粉絲,現(xiàn)在想要使用Mybatis,只需要額外加入mybatis的配置即可。

          四、測(cè)試

          通過以上的幾個(gè)步驟,整個(gè)項(xiàng)目已經(jīng)搭建完畢,接下來將使用Postman測(cè)試工具對(duì)Controller的三個(gè)方法進(jìn)行測(cè)試,驗(yàn)證兩個(gè)ORM框架在同一個(gè)項(xiàng)目中是否能共存。
          首先測(cè)試 POST http://localhost/users ,驗(yàn)證Hibernate是否能夠成功將用戶信息持久化。打開Postman工具,在地址欄輸入http://localhost/users請(qǐng)求地址,請(qǐng)求方式選擇POST,在Body欄輸入如下的信息:
          1. {

          2. "username":"譚朝紅",

          3. "alias":"ramostear",

          4. "age":28

          5. }

          點(diǎn)擊“Send”按鈕發(fā)送請(qǐng)求,觀察服務(wù)端響應(yīng)信息,測(cè)試結(jié)果如下圖所示:

          可以看到,服務(wù)端成功返回用戶信息,且用戶ID=3。接下來,我們請(qǐng)求 GET http://localhost/users/3 ,驗(yàn)證Mybatis是否能夠成功查詢出用戶信息,測(cè)試結(jié)果如下:

          通過測(cè)試,服務(wù)端成功返回了用戶ID=3的用戶信息:
          1. {

          2. "id": 3,

          3. "username": "譚朝紅",

          4. "alias": "ramostear",

          5. "age": 28

          6. }

          由此證明,在同一個(gè)項(xiàng)目中,Hibernate和Mybatis均能正常工作,整合方案有效,解決了在同一項(xiàng)目中Hibernate與Mybatis共存的問題。

          五、總結(jié)

          本次課程驗(yàn)證了同時(shí)使用Hibernate和Mybatis兩個(gè)ORM框架的方案可行,且采用了一種比較簡(jiǎn)單的方式來整合兩個(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ù)庫表的能力,從而簡(jiǎn)化使用Mybatis的步驟。
          最后,對(duì)于一些讀多于寫的系統(tǒng),完全可以將這兩個(gè)框架同時(shí)使用,寫操作少的模塊,可以使用Spring Data JPA快速完成相關(guān)功能的實(shí)現(xiàn),對(duì)于讀操作部分,則可以利用Mybatis來優(yōu)化查詢語句。兩者之間的優(yōu)勢(shì)互補(bǔ),能進(jìn)一步的提升開發(fā)效率和系統(tǒng)性能。

          版權(quán)申明:本作品系作者譚朝紅原創(chuàng) ,?采用《署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際》許可協(xié)議

          來源:segmentfault.com/a/1190000019476544

          最近熱文:
          1、Spring Cloud 2020 版本重大變革!
          2、Spring Boot 干掉了 Maven 擁抱 Gradle!
          3、Mybatis 框架 SQL 注入攻擊的 3 種方式!
          4、寫了個(gè)全局變量的bug,被同事們打臉!
          5、Java 14 祭出神器,Lombok 被干掉了?
          6、Java 14 祭出增強(qiáng)版 switch,真香??!
          7、Spring Boot 2.3 優(yōu)雅關(guān)閉新姿勢(shì),真香!
          8、日志系統(tǒng)新貴 Loki,真香?。?/a>
          9、公司來了個(gè)新同事不會(huì)用 Lombok!
          10、Tomcat 又爆出高危漏洞!8.5 ~ 10 中招…
          掃碼關(guān)注Java技術(shù)棧公眾號(hào)閱讀更多干貨。

          點(diǎn)擊「閱讀原文」獲取面試題大全~

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月天黄色电影播放 | 播播影院在线特别黄色视频看看你 | 国产麻豆黄色有码 | 亚洲午夜成人天堂精品 | 内射视频免费观看网站免费 |