其實要承認,一個東西用久了都會有習(xí)慣心理徽千。mybatis和jpa,兩個持久層框架汤锨。從底層到用法都不同双抽。但是實現(xiàn)的功能是一樣的。所以說一直以來頗有爭議闲礼。常年混跡于各大qq技術(shù)交流群牍汹。見過jpa的死忠粉也見過mybatis的鐵桿。作為一個不到兩年工作經(jīng)驗的小菜鳥來說柬泽,你讓我分析源碼慎菲,講什么底層實現(xiàn)我是講不出來的。只能作為一個使用者锨并,來談?wù)勛约簩@兩個框架的理解露该。
首先,都知道jpa的前身是著名的ssh中的h——>Hibernate第煮。我到現(xiàn)在還記得學(xué)習(xí)Hibernate時對它產(chǎn)生的講解:一個希望不用寫sql語句來操作數(shù)據(jù)庫的懶到愿意為此開發(fā)一個框架的創(chuàng)始人解幼,其實也夠奇葩到值得記住了。而現(xiàn)在的jpa包警,我覺得主旨也確實在貫徹這個理念撵摆。你要承認,jpa的對于單表的簡單查詢確實簡單方便又實用揽趾。但是同時台汇,對于多表關(guān)聯(lián)和復(fù)雜查詢,起碼目前為止,要么把復(fù)雜查詢拆成多個簡單查詢苟呐,要么寧可直接一個nativeQuery = true來原生查詢痒芝。如果這兩點都沒能滿足你業(yè)務(wù)的需求,我不敢下定結(jié)論說你的設(shè)計有問題牵素,但是如此復(fù)雜的業(yè)務(wù)邏輯严衬,身為小白的我實在無法給你建議了。
然后說到mybatis笆呆,原諒我入行時間比較晚请琳。從我開始學(xué)習(xí)java他就已經(jīng)出現(xiàn)了。聽說過他前身好像是ibatis,但是具體就不太了解了赠幕。使用上來講俄精,在那個boot還沒有發(fā)布的年代,mybatis也曾經(jīng)是每個程序員必備的基本技能榕堰。剛接觸的時候mapper映射在我眼中簡直是神奇竖慧。也算是用了半年多,多少有一定的了解逆屡。在這里基本的使用就不多介紹了圾旨,反正我一直所應(yīng)用的也基本都是crud。沒到多高深的地步魏蔗。只能說對于多表查詢確實是比較支持砍的。尤其是在業(yè)務(wù)邏輯多是多表關(guān)聯(lián)的情況下,mybatis絕對比jpa要更加適合莺治。無論是以后的維護還是業(yè)務(wù)的變更都方便不少廓鞠。
可能我這么說大家還是不太理解什么時候用jpa什么時候用mybatis。我舉個例子:現(xiàn)在業(yè)務(wù)上A,B,C,D四個表谣旁。如果你每個表都會在業(yè)務(wù)中用到诫惭,都需要有單獨的增刪改查,雖然有一定的關(guān)聯(lián)關(guān)系蔓挖,但是這種情況用jpa就比較合適夕土。ABCD四個java實體不說,每個實體要對應(yīng)一個repository瘟判。然后再repository層進行crud的編寫怨绣。但是如果業(yè)務(wù)上A,B,C,D四個表。這四個是關(guān)聯(lián)關(guān)系拷获,你幾乎不會單獨對A,B,C進行操作篮撑,而且展現(xiàn)出來的也是D,那么這個時候jpa的使用就會很麻煩匆瓜,因為你還是要四個實體四個repository赢笨。在一個接口中四個repository挨個調(diào)用一次未蝌。雖然也能完成業(yè)務(wù)邏輯,但是復(fù)雜又麻煩茧妒。還要考慮原子性什么的萧吠。所以這個時候用mybatis比較合適了。
其實說到這大概對于什么樣的業(yè)務(wù)應(yīng)該采用哪個在思維上應(yīng)該有個簡單的區(qū)分了桐筏。不過很多時候很多項目不是能一下子分辨出來屬于哪種的纸型。所以還是需要具體判斷的。雖然工作才一年多梅忌,但是外包讓我經(jīng)歷了多個項目的經(jīng)驗告訴我狰腌,千萬別相信那些所謂的“某某大佬”隨便給你的建議。(我是指那些連具體業(yè)務(wù)都不知道就給你建議jpa好還是mybatis好的那種牧氮。如果真的是大佬而且愿意為你的項目深入分析并且給出答案琼腔,那還是值得參照的)因為以前有一次在老板給了我一個小項目讓我獨立完成的時候我選擇了咨詢?nèi)豪锏拇罄小S浀煤芮宄敃r大佬給的意見就是mybatis踱葛。還說了mybatis的好多優(yōu)點展姐。然后我就自然而然的用了。結(jié)果嘛剖毯,大家能想到我一個人能完成的項目會有多小,業(yè)務(wù)多簡潔教馆。雖然用mybatis也做完了逊谋。但是現(xiàn)在想想,要是換成jpa肯定會更加快速方便的開發(fā)土铺。我講這段經(jīng)歷絕對沒有別的意思胶滋,只是想告訴大家業(yè)務(wù)怎么樣還是自己最清楚。很多時候我們的詢問可能不是很全面悲敷,所以別人給的建議也不是很合適究恤。
然后還有一些額外的東西。比如說spring家族的態(tài)度后德。我不知道各位有沒有跟我一樣的大眾心理部宿。一個jar包。只要是org.springframework.boot這個分組的瓢湃,就比較信賴理张。畢竟有那么龐大的家族做后盾呢~~而且boot真的是封裝的越來越具體了~~~反正依稀記得以前spring創(chuàng)建個項目,還要配置這個那個的绵患,偶爾馬虎下還報個錯雾叭。一個結(jié)構(gòu)要搭好一會兒的(也可能是我當時比較菜,但是確實要配置一些東西)而現(xiàn)在呢落蝙,spring boot织狐,差不多創(chuàng)建了暂幼,依賴導(dǎo)一下就可以跑。真的是相當方便移迫。方便到前一段時間群里一個小孩子問了一個spring 配置的問題旺嬉,我居然覺得有點想不起了~~哎~~spring boot用多了,都把人用成sb了~~~哈哈起意,開玩笑的鹰服,別當真拥知。反正現(xiàn)在代碼的高度封裝讓我們用什么都更加簡單了整份。而boot對jpa的封裝,反正我個人是覺得在單純的配置上面疮胖,除了在配置文件中連接下數(shù)據(jù)庫然后添加個data-jpa的依賴亲善,搞定了就设易。這也是個人比較喜歡jpa的一點。部署是真的簡單蛹头。而且官方文檔還很全面顿肺。也在持續(xù)維護更新。我覺得單純從spring的角度渣蜗,jpa就值得一試屠尊。當然了,這個屬于個人心態(tài)耕拷,但是如果是新手在自己做練手項目的時候讼昆,我還是推薦jpa。
對了骚烧,再額外安利一下浸赫,這個就涉及到了個人的使用經(jīng)驗。以前只有mybatis有代碼生成器赃绊,所以基于這個原因有一段時間我還比較喜歡用mybatis既峡。但是現(xiàn)在jpa也有了代碼生成器。從表到實體和從實體到 表都可以自動生成的碧查。小白們別手敲啦~~~(ps:是因為我以前做過這種事所以在此提醒一下跟我一樣白的小盆友运敢,知道的可以掠過)。至于代碼生成器的使用忠售,只要你知道了這個概念去百度都能找到用法者冤,在這里我就不多說了。實在不知道的也可以問我档痪,我要是看到了會回的涉枫,雖然我覺得找我不如自己百度呢。
然后再說個題外話腐螟,其實jpa和mybatis都是很有必要學(xué)的愿汰。因為遇到的項目會各種各樣困后,所以兩者各有長短。還有就是如果自己沒話語權(quán)的時候衬廷,最好上級讓用啥就用啥摇予。注意!我說的是最好吗跋。如果說你們team氛圍比較好侧戴,然后領(lǐng)導(dǎo)比較愿意接受意見什么的,你出與實際考慮確實有不同的意見可以提出來跌宛。不然的話還是老老實實聽指揮吧酗宋。別管你以為有多不合理。我不是在宣揚什么消極理念疆拘。而且在一個team中領(lǐng)導(dǎo)所考慮的可能和你考慮的點不一樣蜕猫。或者說你知道的不太全面等哎迄。沒必要非要為了所謂的自己為正確然后最后弄的大家都不愉快回右。尤其是最后還可能結(jié)果也不會想你想的那樣。大家都是做技術(shù)的漱挚,有點自視清高或者說自己的見解很正常翔烁。但是切記人還是要謙卑。給大家講一個實際發(fā)生的故事旨涝。
我們team一直是手寫接口文檔蹬屹,然后人工維護的。確實現(xiàn)在有很多文檔生成工具颊糜,我自己也用過swagger做過demo,但是團隊里有的人不會用秃踩,而且其實維護起來也很麻煩(可能是沒用習(xí)慣的麻煩衬鱼,這不是主要的),而且我們公司接的項目都比較小憔杨。所以領(lǐng)導(dǎo)說就手工維護接口文檔吧鸟赫。然后前一段時間來了個實習(xí)的小孩,可能是學(xué)習(xí)確實很努力消别,接觸的技術(shù)很多抛蚤。然后一開始整天也干勁兒滿滿的自覺加班在公司學(xué)習(xí)到很晚那種。后來開了個項目寻狂,小孩看到我們手工維護接口可能是覺得比較low岁经,所以跟我們領(lǐng)導(dǎo)建議用swagger。然后我們領(lǐng)導(dǎo)就很委婉的說他回去了解了解蛇券,考慮考慮再說缀壤,先這么手工維護吧樊拓。然后自那以后我們再手動改接口,他就會講這樣怎么怎么塘慕,巴拉巴拉的筋夏。重點是有一次我們team中工作時間比較久的一個大哥因為接口對接沒對接好,所以測試的時候有點小bug图呢,這個孩子又開始抱怨說用手寫文檔怎么怎么不好条篷。。然后我們領(lǐng)導(dǎo)就爆發(fā)了蛤织,劈里啪啦一頓訓(xùn)斥赴叹,大概意思就是這里的人誰不比他有經(jīng)驗啊,他優(yōu)越什么啊瞳筏,之所以不改是因為要前端后端都要熟悉這個框架稚瘾,沒必要。姚炕。然后那以后這個小孩沉默多了摊欠,也不知道是頓悟了什么還是說生氣。后來不久這個小男孩就走了柱宦。辭職還是被勸退也都不知道些椒。其實單單從這個故事看,一個swagger的事掸刊,說不上誰對誰錯的免糕。非要說的話,我們一個外包公司忧侧,肯定是需求對付做完就行了石窑,老板不愿意拿時間來讓員工學(xué)習(xí)一些沒必要的技能。從小男孩的角度蚓炬,一個實習(xí)生沒有決定權(quán)卻非要堅持主見松逊。這個也算是職場經(jīng)驗了 吧~~~說著說著跑題了~~~
反正核心幾句話“:
1,jpa和mybaits各有優(yōu)缺點肯夏。
2经宏,使用哪個合適要結(jié)合具體的業(yè)務(wù)進行分析。
3驯击,當你沒有決定權(quán)的時候烁兰,最好領(lǐng)導(dǎo)讓用什么用什么。
對于咱們技術(shù)人員來講徊都,兩個都要熟悉沪斟,會用。
喏暇矫,手打不易币喧,大家動動小手分享轉(zhuǎn)發(fā)點贊評論啥的~~~~