幫助IT團隊快速構(gòu)建符合jt808協(xié)議部標的基于java技術(shù)的GPS和視頻平臺(2379423771@qq.com)

          Ibatis VS Hibernate

             近日,在JavaEye論壇中,看了Ibatis和Hibernate的帖子,看后,心里覺得的憋悶,不說不快, 這里,我想更細化一下:

              1. 庫表的復雜度,首先取決于需求,不取決于設(shè)計,設(shè)計能力強的人,也要遵守庫表設(shè)計的規(guī)范,從巴克斯三個范式上,原則上也要遵守。不能說用了Hibernate,自己的庫表設(shè)計能力就強了。不能為了用Hibernate,就去一味批判復雜的關(guān)系不對。復雜的關(guān)系設(shè)計對不對,首先取決于是否有復雜的需求,其次才取決于設(shè)計者的能力。

              2. 只要你用的是關(guān)系數(shù)據(jù)庫,就必須要明白,為什么叫關(guān)系數(shù)據(jù)庫,而不叫面向?qū)ο髷?shù)據(jù)庫,把面向?qū)ο蟮哪切┯^點,拿到庫表設(shè)計上,后期維護和調(diào)優(yōu)上,你要擔起責任,不能讓開發(fā)人員替早期決策人員擦屁股。我見過有的人,打著OO和擴展性的旗號,硬生生的把一個表,拆成了三個表,而這三個表,本來,只需要增加一個類型字段,再做一些冗余,就可以是一個表?,F(xiàn)在查詢時,還要把這三個表Union到一塊來查。當需求變更時,增加一個字段,不僅要改變?nèi)齻€類,還要改變?nèi)齻€表,簡直是亂倫。

              3.One-One的庫表設(shè)計,對于DBA來講,并不是一個best practice的設(shè)計。不能為了Hibernate,刻意把大表拆成小表,再用幾個小類,做成One-One的映射關(guān)系。整體性,是不能隨便的分割,畢竟開發(fā)人在調(diào)試、測試和維護的時候,更喜歡看數(shù)據(jù)庫里的數(shù)據(jù),本來一個SQL,就查出來,現(xiàn)在要到多個表中去查。

              4. 增刪改存的實體維護
                 Ibatis比不上Hibernate,說實在話,現(xiàn)在讓我寫SQL來維護一個多對多關(guān)系的實體維護,我都要考慮上半天,別說寫代碼了。

              5. 你需要寫原生SQL嗎
                 首先你要確認,你項目的要求不需要寫原生SQL,再來講Ibatis和Hibernate的好壞,在寫原生SQL上,特別是動態(tài)生成的SQL,ibatis比Hiberante有得一拼,ibatis就像一個模板一樣,將SQL寫在配置文件當中,集中配置,特別方便技術(shù)領(lǐng)導者監(jiān)控項目成員寫的SQL好壞,而且沒有什么學習曲線,就寫SQL就完事了。

                 有人會說,Hibernate也支持寫SQL,但是寫代碼當中,就失去了原來基于Hibernate的DAO的簡潔性。那個DAO一點也不簡潔,如果你將動態(tài)拼SQL的代碼也放在DAO當中,那個DAO就會充斥大量的If 。。Else。。之類的語句,一坨一坨的,非常的壯觀。

                 還有人會說,Hibernate也支持命名查詢,將SQL寫在映射文件當中,但是命名查詢,只支持占位符固定的情況,也就是說,where a = ? and b = ? and c=?,是三個問號,就是三個問號,傳參時,少一個都不行。但是很多項目的查詢,都是動態(tài)的,也就是說用戶選了這個查詢條件,才會生成這個占位符的。

                 Hibernate辦不到。


                 還有人會說,我自己用Hibernate寫一個框架,也可以做到,那你寫的可能比Ibatis好,也可能差,你要造輪子,誰來攔不著。
            

              5. 調(diào)優(yōu)
                 早期調(diào)優(yōu),有些Bad SQL,其實在code review階段,只要看看Ibatis的SQL配置文件,就可以扼殺掉的,如果使用HSQL,可能不會被發(fā)現(xiàn),因為它不僅隱藏在代碼當中,有的時候,還需要程序跑起來,通過日志打印出SQL或者通過其它工具如P6Spy來看的出來。

                 后期調(diào)優(yōu),既然是調(diào)優(yōu),我想就一定是遇到了瓶頸,可能要在庫表上做冗余,可能要檢查那些Bad SQL,可能要修改代碼,可能要動用DBA層次上的一些調(diào)優(yōu)手段,那么調(diào)優(yōu)越深入,Ibatis的優(yōu)勢就越能體現(xiàn)出來,比如說增加臨時表,中間表,增加冗余字段等。

              6. 開發(fā)速度
                
                 如果項目當中,沒有一個Hibernate高手,你的項目又相對的復雜,不僅有復雜的庫表關(guān)系,還有大量的報表查詢,那么使用Hibernate,速度上遜于Ibatis.

                 問題在于,怎么樣算是一個Hibernate高手,別看論壇上,那么多人,群情激奮的在說Hibernate的好,有誰真的是高手?

                 我認識一個人,連Hibernate的命名查詢、悲觀鎖、樂觀鎖之類的,都不清楚,還在那說:“說Hibernate不好的人,只是他不會用Hibernate,高手使用EJB也一樣用的很順溜“,我這輩子,最最討厭的就的這樣的人,人家明明用Spring很簡單,很快樂,為什么要用EJB,充高手。換過來,項目使用Ibatis來做動態(tài)查詢,很快的就解決問題了,為什么要去學Hibernate里面高深的東東,是不是這樣就是高手了?

              7. 平臺移植性
                 如果你的項目要做產(chǎn)品,而且打算基于多個數(shù)據(jù)庫平臺的發(fā)布,使用Hiberante是沒有說了。

              8. 維護性
                 如果不考慮移植性,Ibatis的可維護不差于Hibernate,庫表變動引起實體類變動時,HSQL也會有改動,有人說不用改,說這話的那個人可能整天只會有select * ,如果ibatis也是這樣寫,也不用動了。

                 HSQL好閱讀嗎,F(xiàn)rom order,確實很簡單,但實際當中,這跟拿HelloWord做例子,有什么區(qū)別?

               
             
              9. 我在實際項目當中的運用
              項目背景:
                 我自己從Hibernate2開始使用,我現(xiàn)在也不認為我是Hibernate高手,我也沒有時間去鉆研Hibernate,更深的東西,我也不喜歡坐在開發(fā)人員旁邊老半天,去幫他們解決Hibernate遇到的問題,因為我自己還有很多事要做。

                 我的項目當中,在Hibernate方面,還有一個比我更強的人,他也很煩去看Hibernate打印出來的sql,看上老半天,再調(diào)上老半天,項目進度,嗖嗖的過去了。

                 水平越高的人,任務(wù)越重,很少有時間和耐心去解決一般性的問題。

              最終的運用:

                 在基于Spring的容器事務(wù)管理之下,
                 增、刪、改、存及在事務(wù)中的查詢,使用Hibernate。
                 非事務(wù)性的查詢及報表,都用Ibatis,維護非常的直觀方便,開發(fā)速度上也快很多。

                 我覺得現(xiàn)在技術(shù)換代很快,使用一項技術(shù),首先是要快速的解決問題,然后要學習他的思想,那些整天死抱著Hibernate,自認為學習到ORM的設(shè)計技巧的人,就去繼續(xù)的學吧。

                 我已經(jīng)會用Hibernate的一些方面,我覺得夠用就行了,犯不上,天天鉆研HSQL,如果有時間,我覺得躺在草坪上看看Unix的編程藝術(shù),看看代碼大全,看看Oracle的編程藝術(shù),比看Hibernate的SB書要愜意多了。

                 簡單能夠帶來快樂,用過EJB,再用Spring的人,都有體會,那簡直是一種思想上的重生。


                 Ibatis的設(shè)計者認為,在新的項目當中,可以使用Hibernate,在舊的遺留項目當中,可以使用Ibatis,不明白,他為什么說這樣的話,這與新舊項目有什么區(qū)別? 新的項目就真的可以使用Hibernate嗎。

           

           

            

           

           


           

          posted on 2007-05-05 18:14 Speed 閱讀(5411) 評論(19)  編輯  收藏 所屬分類: 框架設(shè)計 、J2EE 、Hibernate & Ibatis

          評論

          # re: 不做技術(shù)的奴隸 2007-05-05 22:05 Welkin Hu

          (
          最終的運用:

          在基于Spring的容器事務(wù)管理之下,
          增、刪、改、存及在事務(wù)中的查詢,使用Hibernate。
          非事務(wù)性的查詢及報表,都用Ibatis,維護非常的直觀方便,開發(fā)速度上也快很多。
          )

          按樓主的這個做法,豈不是要同時掌握Hibernate和iBatis兩門技術(shù)?同時為一個表寫hibernate mapping和ibatis sql? 這本身已經(jīng)有很大的重復量了呢。

            回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 01:14 bigbigbig

          兄弟說得相當精彩!?。。。。?

          尤其是第二條,我深有體會?。。。。。。?!

          支持!  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 09:19 山風小子

          平衡唯美~  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 09:49 OneEyeWolf

          @Welkin Hu
          你可以不用ibatis,你可以用Hibernate來寫SQL,這沒有關(guān)系。

          我喜歡和有實踐的人爭論。

            回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 11:33 Welkin Hu

          是啊,我們現(xiàn)在的做法就是在Hibernate中寫HQL和SQL,沒有用iBatis。不過樓主的最佳實踐中講到“非事務(wù)性的查詢及報表,都用Ibatis”。我有些納悶:在已經(jīng)使用了Hibernate的前提下,直接在Hibernate中寫SQL,和在iBatis配置SQL,哪個更好呢?  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 11:44 OneEyeWolf

          兩者結(jié)合,只是表明一種觀點,技術(shù)是相宜互補的,用來解決問題的。

          也是我的項目當中的實踐,對于其它人和項目,是否適合,不得而知。

          所以不能叫best practice.

          我想,好處是自己動手實踐而來,自己找一個例子,做一下,比如動態(tài)拼SQL,寫一個Hibernate,再寫一個ibatis,比較一下,就知道了。

          空對空的討論,只能激起矛盾,沒有任何意義。

            回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 14:46 leekiang

          我認識的人里面壓根就沒有人懂悲觀鎖、樂觀鎖、事務(wù)、命名查詢、緩存等,有人只會照著寫select、insert、update、delete,還說他懂hibernate。我不知道這樣做出來的項目能不能用。  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 18:29 yeshucheng

          呵呵,很同意樓主的觀點。
          做了快5年的項目下來,真的是很有體會!
          記得以前我和一個朋友討論過:某些程度的東西不要一味的為了Hibernate而Hibernate,這個就是最可悲的事。在一個項目很緊張的時候,客戶和老板容不得你去過去思考使用什么技術(shù),他們的觀點一直就是:我能看到你的實現(xiàn)就可以!
          大家不要否認這個現(xiàn)狀,這個也是中國目前的狀況。有時候同事和我說:我能否使用JDBC完成這個(這個業(yè)務(wù)要使用到6張表)。我的態(tài)度是:完全可以。如果使用Hibernate去做,大家想象一下會怎么樣。
            回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-06 18:30 yeshucheng

          不過我覺得在以前很多朋友使用過很多SQL寫過很多報表的朋友,寫JDBC或者IBatis這些東西來做完全得心應手!既然人家寫這個能夠體現(xiàn)一個同樣的思想表達何必再去強求呢?呵呵
          一般CRUD這些東西完全可以使用Hibernate去做。但是如果真的牽涉到很強硬的readonly的業(yè)務(wù)查詢沒有必要去專牛角尖,使用諸如JDBC或者IBatis完全可以,只要實現(xiàn)得體,完全沒有問題!  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-07 09:38 Welkin Hu

          沒用過iBatis,所以不知道它對于動態(tài)SQL有多好。反正,基于不愿意為一個表做兩套O/R Mapping和儲備兩種技術(shù)的目的,我沒有在產(chǎn)品中引入iBatis。  回復  更多評論   

          # re: 不做技術(shù)的奴隸[未登錄] 2007-05-07 20:19 javacap

          我干脆就兩者都不用,自己簡單封裝一下(不要說什么重復發(fā)明輪子,每個人 都有 適合自己的項目的輪子).做得更漂亮。  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-08 09:29 Juliashine

          我見過有的人,打著OO和擴展性的旗號,硬生生的把一個表,拆成了三個表,而這三個表,本來,只需要增加一個類型字段,再做一些冗余,就可以是一個表?,F(xiàn)在查詢時,還要把這三個表Union到一塊來查。當需求變更時,增加一個字段,不僅要改變?nèi)齻€類,還要改變?nèi)齻€表,簡直是亂倫。

          -----------------------------------------------------------------

          這一段怎么好像是說我們公司一樣  回復  更多評論   

          # re: 不做技術(shù)的奴隸 2007-05-14 08:59 Welkin Hu

          @Juliashine
          嘻嘻,不管什么O/R Mapping工具,好像都沒有提倡OO式的表結(jié)構(gòu)喲。O/R mapping這個名字中,R可是三分天下有其一的。如果真的想玩OO式的表,那就玩面向?qū)ο髷?shù)據(jù)庫得了。連O/R mapping都省了。
            回復  更多評論   

          # re: Ibatis VS Hibernate 2008-07-17 08:54 lan

          我不用Hibernate就是特煩某些人拿OO的思想往關(guān)系數(shù)據(jù)庫上套,這種改變數(shù)據(jù)庫中心思想的行為,實在是太...

          我周圍支持Hibernate的人大都是些新手,因為用這個可以省下很多思考,也就是偷懶,他們平常作的都是簡單的CRUD,能寫復雜SQL的幾乎沒有。

          對于那些動輒就寫數(shù)十行甚至上百行SQL的業(yè)務(wù)應用以及為了性能反復調(diào)優(yōu)的人來說,和沒有這種經(jīng)歷的人去討論IBATIS和Hibernate就如同對牛彈琴。

          我曾遇到這么一個人,先學一樣東西時,有了解后就大呼不錯,很好,很棒,有了它天下大可以去了,改天又學了一樣,發(fā)現(xiàn)還要好,就覺得這才是闖天下的根本,以前的根本就是狗屎,改天又接觸了一樣技術(shù),發(fā)現(xiàn)這才是潮流,那些東西根本就是老掉牙的東西...云云。你能如何的評價這樣的人呢,你能說他不對嗎?由于它的認識的局限性,而發(fā)出的言論,除了會心一笑,你還能做什么?  回復  更多評論   

          # re: Ibatis VS Hibernate 2008-07-17 10:06 OneEyeWolf

          @lan
          right. 產(chǎn)生技術(shù)的爭論,很頭疼,有時候取決與誰的推動力大,而不是誰的正確,只有結(jié)果知道誰對誰錯。  回復  更多評論   

          # re: Ibatis VS Hibernate 2008-08-16 12:02 wueddie

          于我心有戚戚焉!

          類似樓主的想法和心情我兩三年前也曾有過。雖然我無意于這種爭論,但是非常同意樓主關(guān)于面向?qū)ο蠛蛿?shù)據(jù)庫關(guān)系的見地。其實只要本著實事求是的精神,要得出類似的結(jié)論是不難的。但是實際情況卻是很多人以偏蓋全。尤其是在JEE領(lǐng)域,很多人對數(shù)據(jù)庫的認識都有限。總以為面向?qū)ο笫墙鉀Q一切問題的法寶。  回復  更多評論   

          # re: Ibatis VS Hibernate 2008-11-12 13:19 zhouzhao21@gmail.com

          如果有時間,我覺得躺在草坪上看看Unix的編程藝術(shù),看看代碼大全,看看Oracle的編程藝術(shù),比看Hibernate的SB書要愜意多了。

          -----------
          同感  回復  更多評論   

          # re: Ibatis VS Hibernate[未登錄] 2008-11-28 09:27 henry1451

          LZ和大家的評論都說的非常中懇.  回復  更多評論   

          # re: Ibatis VS Hibernate 2013-08-09 13:34 鉆石風暴

          完全不用hibernate,直接無視,曾經(jīng)用過,什么垃圾玩意啊,一個簡單問題搞那么復雜。簡單查一個多表關(guān)聯(lián)列表ibatis5分鐘搞定,hibernate搞那么復雜。數(shù)據(jù)庫的二維表和oo思想表面上看好像有點像,其實如果用的深入了,二者是根本無法調(diào)和統(tǒng)一的事物,因為關(guān)系數(shù)據(jù)庫是著眼于關(guān)系,針對一個表來說每個字段歸根到底是一對一關(guān)系,才形成了表。  回復  更多評論   

          導航

          留言簿(15)

          隨筆分類

          值得一看的博客

          積分與排名

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 屯门区| 平阳县| 班玛县| 池州市| 来安县| 台江县| 伊吾县| 中西区| 罗定市| 桃园县| 弥勒县| 朝阳县| 南陵县| 育儿| 新昌县| 淮南市| 盘山县| 东乌| 昌都县| 海阳市| 吕梁市| 高尔夫| 道孚县| 苍山县| 茂名市| 白城市| 永平县| 大悟县| 扎兰屯市| 台东县| 胶南市| 霍城县| 南安市| 咸宁市| 宁陕县| 新竹县| 昌平区| 辽中县| 益阳市| 江达县| 南雄市|