<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>

          Spring Data JPA 與 MyBatis 對(duì)比,你喜歡用哪個(gè)?

          共 3216字,需瀏覽 7分鐘

           ·

          2021-08-10 02:33

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 5 分鐘。

          來(lái)自:jianshu.com/p/3927c2b6acc0

          概述

          Spring Data JPA是Spring Data的子模塊。使用Spring Data,使得基于“repositories”概念的JPA實(shí)現(xiàn)更簡(jiǎn)單和容易。Spring Data JPA的目標(biāo)是大大簡(jiǎn)化數(shù)據(jù)訪問(wèn)層代碼的編碼。
          作為使用者,我們只需要編寫(xiě)自己的repository接口,接口中包含一些個(gè)性化的查詢(xún)方法,Spring Data JPA將自動(dòng)實(shí)現(xiàn)查詢(xún)方法。JPA默認(rèn)使用hibernate作為ORM實(shí)現(xiàn),所以,一般使用Spring Data JPA即會(huì)使用hibernate。
          我們?cè)倏纯磆ibernate的官方概念,Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernate可以自動(dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。
          MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
          這樣看,Spring Data JPA與MyBatis對(duì)比,起始也就是hibernate與MyBatis對(duì)比。所以,我們直接來(lái)比較后兩者。

          Hibernate 與 MyBatis 簡(jiǎn)單對(duì)比

          從基本概念和框架目標(biāo)上看,兩個(gè)框架差別還是很大的。hibernate是一個(gè)自動(dòng)化更強(qiáng)、更高級(jí)的框架,畢竟在java代碼層面上,省去了絕大部分sql編寫(xiě),取而代之的是用面向?qū)ο蟮姆绞讲僮麝P(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)。
          而MyBatis則是一個(gè)能夠靈活編寫(xiě)sql語(yǔ)句,并將sql的入?yún)⒑筒樵?xún)結(jié)果映射成POJOs的一個(gè)持久層框架。
          所以,從表面上看,hibernate能方便、自動(dòng)化更強(qiáng),而MyBatis 在Sql語(yǔ)句編寫(xiě)方面則更靈活自由。
          但這只是從使用層面上看兩者的區(qū)別,并未涉及的本質(zhì)。但如果看問(wèn)題,值看淺層次、表象問(wèn)題的話,就不能理解技術(shù)本質(zhì),也不能發(fā)揮技術(shù)的最多效用。
          所以,如果更上一個(gè)抽象層次去看,對(duì)于數(shù)據(jù)的操作,hibernate是面向?qū)ο蟮?,而MyBatis是面向關(guān)系的 。
          當(dāng)然,用hibernate也可以寫(xiě)出面向關(guān)系代碼和系統(tǒng),但卻得不到面向關(guān)系的各種好處,最大的便是編寫(xiě)sql的靈活性,同時(shí)也失去面向?qū)ο笠饬x和好處——一句話,不倫不類(lèi)。
          那么,面向?qū)ο蠛完P(guān)系型模型有什么不同,體現(xiàn)在哪里呢?實(shí)際上兩者要面對(duì)的領(lǐng)域和要解決的問(wèn)題是根本不同的:面向?qū)ο笾铝τ诮鉀Q計(jì)算機(jī)邏輯問(wèn)題,而關(guān)系模型致力于解決數(shù)據(jù)的高效存取問(wèn)題。
          我們不妨對(duì)比一下面向?qū)ο蟮母拍钤瓌t和關(guān)系型數(shù)據(jù)庫(kù)的不同之處:
          1. 面向?qū)ο罂紤]的是對(duì)象的整個(gè)生命周期包括在對(duì)象的創(chuàng)建、持久化、狀態(tài)的改變和行為等,對(duì)象的持久化只是對(duì)象的一種狀態(tài),而面向關(guān)系型數(shù)據(jù)庫(kù)的概念則更關(guān)注數(shù)據(jù)的高效存儲(chǔ)和讀?。?/section>
          2. 面向?qū)ο蟾鼜?qiáng)調(diào)對(duì)象狀態(tài)的封裝性,對(duì)象封裝自己的狀態(tài)(或數(shù)據(jù))不允許外部對(duì)象隨意修改,只暴露一些合法的行為方法供外部對(duì)象調(diào)用;而關(guān)系型數(shù)據(jù)庫(kù)則是開(kāi)放的,可以供用戶(hù)隨意讀取和修改關(guān)系,并可以和其他表任意的關(guān)聯(lián)(只要sql正確允許的情況下);
          3. 面向?qū)ο笤噲D為動(dòng)態(tài)的世界建模,他要描述的是世界的過(guò)程和規(guī)律,進(jìn)而適應(yīng)發(fā)展和變化,面向?qū)ο罂偸窃谧兓刑幚砀鞣N各樣的變化。而關(guān)系型模型為靜態(tài)世界建模,它通過(guò)數(shù)據(jù)快照記錄了世界在某一時(shí)候的狀態(tài),它是靜態(tài)的。
          從上面兩者基本概念和思想的對(duì)比來(lái)看,可以得出結(jié)論hibernate和MyBatis兩個(gè)框架的側(cè)重點(diǎn)完全不同。所以我們就兩個(gè)框架選擇上,就需要根據(jù)不同的項(xiàng)目需求選擇不同的框架。
          在框架的使用中,也要考慮考慮框架的優(yōu)勢(shì)和劣勢(shì),揚(yáng)長(zhǎng)避短,發(fā)揮出框架的最大效用,才能真正的提高項(xiàng)目研發(fā)效率、完成項(xiàng)目的目標(biāo)。
          但相反,如果使用Spring Data JPA和hibernate等ORM的框架而沒(méi)有以面向?qū)ο笏枷牒头椒ㄈシ治龊驮O(shè)計(jì)系統(tǒng),而是抱怨框架不能靈活操作sql查詢(xún)數(shù)據(jù),那就是想讓狗去幫你拿耗子了。

          Hibernate 使用步驟

          那么,話題再說(shuō)回來(lái),使用兩個(gè)框架時(shí)候的時(shí)候,也要注意最佳的步驟和流程。下面我們來(lái)分別討論一下,hibernate的一般使用步驟如下:
          1. 分析、抽象和歸納出系統(tǒng)中的業(yè)務(wù)概念,并梳理出各個(gè)業(yè)務(wù)概念之間的關(guān)系——?jiǎng)?chuàng)建概念模型
          2. 根據(jù)概念模型,進(jìn)一步細(xì)化設(shè)計(jì)系統(tǒng)中的對(duì)象類(lèi)以及類(lèi)的依賴(lài)關(guān)系——?jiǎng)?chuàng)建設(shè)計(jì)模型
          3. 將設(shè)計(jì)好的類(lèi)映射到數(shù)據(jù)庫(kù)的表和字段配置好
          4. hibernate可以根據(jù)配置信息自動(dòng)生成數(shù)據(jù)庫(kù)表,這個(gè)時(shí)候也可以集中精力去梳理一下表關(guān)系,看看表結(jié)構(gòu)是否合理,并適當(dāng)調(diào)整一下類(lèi)和表的映射關(guān)系,重新生成表結(jié)構(gòu)
          完成以上步驟,基本上完成了體統(tǒng)中主要的業(yè)務(wù)概念類(lèi)和表結(jié)構(gòu)的設(shè)計(jì)工作,只是完成表結(jié)構(gòu)設(shè)計(jì)的出發(fā)點(diǎn)事如何持久化系統(tǒng)的對(duì)象,同時(shí)兼顧數(shù)據(jù)庫(kù)表、字段、字段類(lèi)型、表的關(guān)聯(lián)關(guān)系的合理性和合規(guī)性,而不是單純表設(shè)計(jì)。這兩者思考和關(guān)注點(diǎn)還是有很大差別的。
          另外,需要說(shuō)明一點(diǎn),這只是使用hibernate的最通用步驟,實(shí)際操作過(guò)程中還是需要根據(jù)具體項(xiàng)目情況來(lái)安排。

          MyBatis 是使用步驟

          而MyBatis對(duì)于面向?qū)ο蟮母拍顝?qiáng)調(diào)比較少,更適用于靈活的對(duì)數(shù)據(jù)進(jìn)行增、刪、改、查,所以在系統(tǒng)分析和設(shè)計(jì)過(guò)程中,要最大的發(fā)揮MyBatis的效用的話,一般使用步驟則與hibernate有所區(qū)別:
          1. 綜合整個(gè)系統(tǒng)分析出系統(tǒng)需要存儲(chǔ)的數(shù)據(jù)項(xiàng)目,并畫(huà)出E-R關(guān)系圖,設(shè)計(jì)表結(jié)構(gòu)
          2. 根據(jù)上一步設(shè)計(jì)的表結(jié)構(gòu),創(chuàng)建數(shù)據(jù)庫(kù)、表
          3. 編寫(xiě)MyBatis的SQL 映射文件、Pojos以及數(shù)據(jù)庫(kù)操作對(duì)應(yīng)的接口方法
          這樣看來(lái)MyBatis更適合于面向關(guān)系(或面向數(shù)據(jù)、或面向過(guò)程)的系統(tǒng)設(shè)計(jì)方法,這樣的系統(tǒng)一般稱(chēng)為“事務(wù)腳步”系統(tǒng)(事務(wù)腳步(Transaction Script) 出自Martin Fowler 2004年所著的企業(yè)應(yīng)用架構(gòu)模式(Patterns of Enterprise Application Architecture))。
          而hibernate(也可以說(shuō)Spring Data JPA)更適合于構(gòu)建領(lǐng)域模型類(lèi)的系統(tǒng)。當(dāng)然,我們也不能說(shuō)MyBatis無(wú)法構(gòu)建領(lǐng)域模型驅(qū)動(dòng)的系統(tǒng),而hibernate無(wú)法構(gòu)建事務(wù)腳步系統(tǒng)。
          只是用MyBatis構(gòu)建領(lǐng)域模型要做更多、更臟、更累的工作;而用hibernate構(gòu)建一個(gè)事務(wù)腳本系統(tǒng)有些大材小用,數(shù)據(jù)的查詢(xún)反而沒(méi)那么靈活。

          小結(jié)

          綜合上面所有描述和對(duì)比,我們對(duì)這兩個(gè)框架的本質(zhì)區(qū)別應(yīng)該有所了解了。
          我們了解了這些區(qū)別,可以幫助我們選擇更合適的框架,同時(shí),也可以利用不同的框架,讓他們?nèi)プ龈线m事,這也是所謂的物盡其用吧,更不至于我們“為物所役”。
          <END>

          推薦閱讀:

          記一個(gè)自己項(xiàng)目上線的全過(guò)程

          這可能是對(duì) IOC 和 DI 解釋的最清楚的一篇文章了!

          最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點(diǎn)個(gè)「在看」,點(diǎn)擊上方小卡片,進(jìn)入公眾號(hào)后回復(fù)「面試題」領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          朕已閱 

          瀏覽 77
          點(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>
                  99re99在线视频最新 | 亚洲美国日本中文字幕 | 97豆花精品视频在线观看 | 国产aaa级三级毛片 | 欧美精品黄色 |