Kela's Blog

                      前面的路很坎坷,但畢竟是條路.也許走過這一段就會發(fā)現(xiàn),走過去就是夢想中的地方.因此堅(jiān)持成為此刻唯一能做且必須去做的事情.
          posts - 9, comments - 27, trackbacks - 0, articles - 15

                  Hibernate有那么多的優(yōu)點(diǎn),那么這些優(yōu)點(diǎn)在我們的應(yīng)用開發(fā)中是如何體現(xiàn)呢,確切的說我們不是因?yàn)樗餍卸盟且驗(yàn)樗芙o我們的開發(fā)帶來幫助,能提高系統(tǒng)的性能。
                  Hibernate是持久層的框架,那就的先從持久層說起。看看我們通常的持久層是如何做的。
                  1. 關(guān)于持久層的介紹:
                  MVC作為主流的系統(tǒng)架構(gòu)模式,已被越來越多的開發(fā)者所使用。MVC中的M,也就是Model則包含著大量的業(yè)務(wù)邏輯和數(shù)據(jù)邏輯,持久層作為Model中的重要組成,其設(shè)計的優(yōu)劣將對系統(tǒng)的整體表現(xiàn)產(chǎn)生至關(guān)重要的影響。
                 “持久層”,也就是在系統(tǒng)邏輯層面上,專注于實(shí)現(xiàn)數(shù)據(jù)持久化(對內(nèi)存的數(shù)據(jù)進(jìn)行固化,通常指保存至住據(jù)庫)的一個相對獨(dú)立的領(lǐng)域。也就意味著,我們的系統(tǒng)架構(gòu)中,因該有一個相對獨(dú)立的邏輯層面,專注于數(shù)據(jù)持久化邏輯的實(shí)現(xiàn),與系統(tǒng)其他部門相對而言,這個層面應(yīng)該擁有一個較為清晰和嚴(yán)格的邏輯邊界。
                  2. 持久層的設(shè)計
                  場景:(在“深入淺出Hibernate”中一個非常好的例子),用戶進(jìn)入網(wǎng)上商店進(jìn)行購物結(jié)算,那么他有以下的業(yè)務(wù)處理邏輯。
                      1)根據(jù)客戶ID取出客戶當(dāng)前等級(如,普通會員,VIP)
                      2)根據(jù)客戶等級獲得打折比率。
                      3)根據(jù)總金額 × 打著比率計算到實(shí)際支付的金額。
                      4)將本次實(shí)際的支付的金額累積到客戶累計消費(fèi)金額的字段中。
                      5)返回實(shí)際金額。
                  A方法,有的朋友可能這樣處理:
                    public calss NetShop {
                         ......

                         /*
                          * 購物結(jié)算
                          */
                          public BigDecimal balance(String userID) {
                                conn = ......
                                try {
                                      //獲取當(dāng)前等級, select
                                      ......
                               } catch () { }
                               try {
                                    //獲得打折比率, select
                                    //計算實(shí)際支付金額
                                    ......
                              } catch () { }

                             try {
                                  //將支付的金額累計到累積消費(fèi)中, update
                                  //修改客戶現(xiàn)有的余額
                                  ......
                            } catch () {}


                            //返回實(shí)際的消費(fèi)金額
                            return new BigDecimal(****);
                       }
                   }
                   B. 那另外的一些朋友他們會說,在A里面混雜的業(yè)務(wù)邏輯和數(shù)據(jù)訪問代碼極大的干擾了閱讀程序的人,而且這樣的代碼將給日后的維護(hù)帶來極大的困難(我也是這樣認(rèn)為哦 ~ ~)。如果我們的實(shí)際應(yīng)用當(dāng)中的業(yè)務(wù)邏輯變得非常龐大和復(fù)雜的時候,A的做法顯然有憂缺點(diǎn)的。于是,就有了下面的改造:
                   public calss NetShop {
                        ......

                        /*
                         * 購物結(jié)算
                         */
                       public BigDecimal balance(String userID) {
                          A a = new A();
                          String gradeStr = null;  //客戶級別
                          long agioLong = 0.0;

                         //獲取當(dāng)前等級
                         gradeStr = a.getUserGarde(userID);

                         //根據(jù)等級計算打折比率
                         agioLong = a.getAgio(gradeStr);

                         //累計客戶消費(fèi)金額
                         a.updateCustMoney(userID, agioLong);

                         //修改客戶余額
                         a.updateUserBalance(userID, agioLong);
                  
                        //返回消費(fèi)金額
                        return new BigDecimal(****);

                      }
                   }

                    public class A {
                         //去實(shí)現(xiàn)上面對方法
                    }
                    可以說B的實(shí)現(xiàn)方式,是我(呵呵,大多數(shù)可不敢亂說)經(jīng)常使用的方式,在實(shí)際的應(yīng)用當(dāng)中結(jié)合一些數(shù)據(jù)庫性能上的優(yōu)化(連接池,預(yù)編譯語句之類的),基本上已經(jīng)實(shí)現(xiàn)了,業(yè)務(wù)和數(shù)據(jù)層的分離。
                    然而,在現(xiàn)在客戶的應(yīng)用需求和公司考慮可重用等因素的影響下,我們有不得不去考慮,我們的應(yīng)用能不能實(shí)現(xiàn)嚴(yán)格意義上的跨數(shù)據(jù)庫使用,或者說,我們的應(yīng)用從一個數(shù)據(jù)遷移到另外一個數(shù)據(jù)的時候,是不是只做很少的改動(因?yàn)椋F(xiàn)在有很多的項(xiàng)目需要引入第三方的產(chǎn)品,它山之石可以攻玉嘛)。帶著這樣的疑問,那我們是不是會寫很多的基于特定數(shù)據(jù)庫的數(shù)據(jù)層處理代碼(當(dāng)然了,這也是個好辦法)。現(xiàn)在我們就要引入Hibernate了,我覺得選擇一個比我們自己的實(shí)現(xiàn)方式更好的實(shí)現(xiàn)方式,是一個更加聰明的決策。那么Hibernate能干什么?
                     1)減少乏味的代碼
                          無論是A方法還是B方法我們都少不了大量的數(shù)據(jù)庫連接,查詢,關(guān)閉等代碼,寫得多了也就覺得煩了,Hibernate封裝了數(shù)據(jù)庫持久層大多數(shù)技術(shù)細(xì)節(jié),如事物管理,連接管理,sql執(zhí)行等。
                          至少這點(diǎn),我們是需要的。
                     2)更加面向?qū)ο蟮脑O(shè)計
                           就是說像設(shè)計對象一樣的去設(shè)計和操作數(shù)據(jù)庫。這條可能現(xiàn)在還不能理解。
                     3)更好的性能
                            我覺得這條好理解多了,系出名門和專家之手的框架,肯定提供了非常優(yōu)秀的性能優(yōu)化機(jī)制。比如,對連接池,PreparedSatatement 緩存,數(shù)據(jù)緩存等。這點(diǎn)我們可以大可放心,因?yàn)槭褂谜邲Q定了它的優(yōu)秀。
                      4)更好的移植性
                             我們只需要簡單得修改其的配置參數(shù),即可實(shí)現(xiàn)底層數(shù)據(jù)庫的良好切換(這也是有前提的哦,可不能使用特定數(shù)據(jù)庫都有的特性)。這條的好處是顯而易見的。

                      關(guān)于引入Hibernate有什么好處,我覺得以上就足夠了,它確實(shí)能幫助我們。

          分享到:
          主站蜘蛛池模板: 屏东市| 长寿区| 嵊州市| 乌鲁木齐县| 彩票| 定西市| 龙州县| 侯马市| 贵德县| 赤城县| 虞城县| 定西市| 华池县| 龙陵县| 永宁县| 临洮县| 合山市| 光山县| 汤阴县| 当涂县| 平湖市| 保德县| 贡觉县| 天等县| 临西县| 宜君县| 新密市| 上虞市| 遵义县| 太和县| 东光县| 金沙县| 桃园市| 巴林左旗| 广西| 张家口市| 江油市| 东丽区| 互助| 射阳县| 上栗县|