Nomad & His Life

          博觀而約取,厚積而薄發(fā)
          posts - 15, comments - 88, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明作者:Nomad,出處: www.jialing.net ?

          ??? 我想很多人都聽(tīng)說(shuō)過(guò)“2/8原則,有人研究過(guò),這世界上財(cái)富的80%集中在20%的人手里,而另外80%的人只擁用20%的財(cái)富。實(shí)際的商業(yè)中,我們應(yīng)該更關(guān)注大客戶,因?yàn)榭蛻衾?/span>20%的大客戶,對(duì)我們貢獻(xiàn)的利潤(rùn)可能會(huì)占到80%,這些都是有統(tǒng)計(jì)學(xué)基礎(chǔ)的數(shù)據(jù)。

          ??? 在應(yīng)用軟件的研發(fā)中同樣遵守這個(gè)原則,我們寫(xiě)的20%底層代碼將會(huì)起到80%的作用。做過(guò)Web項(xiàng)目的人應(yīng)該都知道,大多數(shù)程序都是圍繞增、刪、改、條件查詢等主題實(shí)現(xiàn)的,只是需求不同,具體的實(shí)現(xiàn)不同罷了。當(dāng)項(xiàng)目重復(fù)性太高的時(shí)候,我們開(kāi)始學(xué)習(xí)、使用框架技術(shù),比如Hibernate就幫我們提取了很多對(duì)數(shù)據(jù)庫(kù)操作的程序,目的也是減少程序員編寫(xiě)代碼的數(shù)量與時(shí)間。而框架技術(shù)并不能包含我們工作的方方面面,我們依然需要在工作中不斷總結(jié)、不斷歸納,猶如Template設(shè)計(jì)模式,我們需要將重復(fù)的工作總結(jié)提煉出來(lái),做成一個(gè)個(gè)模版,以此來(lái)不斷簡(jiǎn)化我們的工作。所以我們需要以2/8原則指導(dǎo)開(kāi)發(fā)設(shè)計(jì),讓更多的活交給框架去工作,讓各種業(yè)務(wù)流做成模版類,做足底層的工作,將20%的底層代碼發(fā)揮出80%貢獻(xiàn)。

          ??? 下面以我熟悉的平臺(tái)框架舉個(gè)模版的例子。在Hibernate框架下編寫(xiě)DAO層代碼,我們需要從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),以列表形式顯示在頁(yè)面上。這個(gè)例子將向你展示,只要做好底層工作,上層的業(yè)務(wù)邏輯就會(huì)變得非常簡(jiǎn)單(只有短短兩行)。

          ??1//CommonalityObject.java
          ??2
          ??3//用以裝載數(shù)據(jù)并輸出的Java?Bean
          ??4
          ??5public?class?CommonalityObject?{
          ??6???private?String?str1;
          ??7???private?String?str2;
          ??8???private?String?str3;
          ??9???private?String?str4;
          ?10???private?String?str5;
          ?11???private?String?str6;
          ?12???private?String?str7;
          ?13???private?String?str8;
          ?14
          ?15?
          ?16
          ?17????setters?&?getters
          ?18
          ?19}

          ?20
          ?21//SQLTemplate.java
          ?22
          ?23/**
          ?24?*?報(bào)表中執(zhí)行SQL查詢的模版
          ?25?*?以CommonalityObject來(lái)裝載數(shù)據(jù),運(yùn)用反射機(jī)制加載返回List
          ?26?*
          ?27?*?@author?李嘉陵
          ?28?*?@since?2006-7-14
          ?29?*/

          ?30
          ?31public?class?SQLTemplate?{
          ?32?
          ?33?private?static?Log?logger?=?LogFactory.getLog(SQLTemplate.class);
          ?34?
          ?35?public?List?getQueryList(String?sql,?Session?session)?throws?DAOException{
          ?36??logger.info(sql);
          ?37??
          ?38??try?{
          ?39???ResultSet?reset?=?getReset(session,sql);
          ?40???logger.info("r="+reset);
          ?41???return?reflectList(reset);
          ?42??}

          ?43??catch?(Exception?e1)?{
          ?44???//?TODO?Auto-generated?catch?block
          ?45???e1.printStackTrace();
          ?46???throw?new?DAOException(e1);
          ?47??}

          ?48?}

          ?49?
          ?50?//?插入SQL獲得相對(duì)應(yīng)的數(shù)據(jù)集
          ?51?public?ResultSet?getReset(Session?s,?String?sql)?throws?Exception?{
          ?52??
          ?53??Connection?conn?=?null;
          ?54??Statement?stat?=?null;
          ?55??ResultSet?reset?=?null;
          ?56???
          ?57??//獲得連接
          ?58??conn?=?s.connection();
          ?59??
          ?60??//裝載數(shù)據(jù)塊
          ?61??stat?=?conn.createStatement();
          ?62??//System.out.println("------運(yùn)行的SQL語(yǔ)句--------"+sql);
          ?63
          ?64??//獲得對(duì)應(yīng)的數(shù)據(jù)集
          ?65??reset?=?stat.executeQuery(sql);
          ?66?
          ?67??return?reset;
          ?68?}

          ?69?
          ?70?/**
          ?71??*?通過(guò)反射機(jī)制講ResultSet中的數(shù)據(jù)以CommonalityObject形式載入List中,最后返回List
          ?72??*?@author?李嘉陵
          ?73??*?@since?2006-7-14
          ?74??*?@param?reset?SQL搜索出來(lái)的集合
          ?75??*?@return?List<CommonalityObject>
          ?76??*?@throws?Exception
          ?77??*/

          ?78?public?List?reflectList(ResultSet?reset)?throws?Exception{
          ?79??List?list?=?new?ArrayList();
          ?80??
          ?81??ResultSetMetaData?meta?=?reset.getMetaData();
          ?82??
          ?83??while(reset.next())
          ?84??{
          ?85???CommonalityObject?co?=?new?CommonalityObject();
          ?86???String?tmp="0";
          ?87???
          ?88???for(int?i=1;i<=meta.getColumnCount();i++)?{
          ?89????if?(reset.getString(i)?==?null||?reset.getString(1).equals("")??){
          ?90?????tmp="0";
          ?91????}

          ?92????else{
          ?93?????tmp=reset.getString(i);??????
          ?94????}

          ?95????
          ?96????String?method_name?=?"setStr"+i;?//需要?jiǎng)討B(tài)調(diào)用的函數(shù)名
          ?97????Class?cls=co.getClass();?//得到要在其中查找方法的類
          ?98????Class?partypes[]?=?new?Class[]{String.class};?//函數(shù)調(diào)用的參數(shù)類型,這里為String。
          ?99????Method?mth=cls.getMethod(method_name,?partypes);?//得到方法
          100????Object[]?objs=new?Object[]{tmp};?//生成函數(shù)要調(diào)用的數(shù)據(jù),這里為tmp。
          101????mth.invoke(co,?objs);?//調(diào)用得到的函數(shù)。
          102???}

          103???
          104???list.add(co);
          105??}

          106??
          107??return?list;
          108?}

          109}

          110
          111//最終只要簡(jiǎn)單的兩句就能完成報(bào)表的輸出工作
          112public?class?OrderQryDAOImpl?extends?BaseDAOImpl?implements?OrderQryDAO?{
          113
          114?public?List?getList(String?cond)?throws?DAOException??{
          115??
          116??//SQL語(yǔ)句
          117??String?sqlStr?=?""?+?cond;
          118
          119??return?new?SQLTemplate().getQueryList(sqlStr,getSession());
          120?????
          121?}

          122}

          看懂了嗎?如果項(xiàng)目中我們需要完成幾十個(gè)這樣的報(bào)表輸出,有了這樣的底層代碼結(jié)構(gòu),編寫(xiě)起來(lái)是不是很簡(jiǎn)單呢。

          評(píng)論

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-18 23:09 by Dragonofson
          你牛比~Hibernate是這樣用~那還不于直接用JDBC

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-19 00:19 by 綠色使者、綠色心情
          確實(shí),還是好好看看Hibernate再說(shuō)吧

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-19 08:37 by Nomad
          @Dragonofson
          我這里做的是報(bào)表任務(wù),和ORM沒(méi)有關(guān)系。當(dāng)你的項(xiàng)目數(shù)據(jù)庫(kù)中有五六百?gòu)埍恚憔蜁?huì)發(fā)現(xiàn)Hibernate并不能完成所有的活

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-19 09:28 by JustRun
          講的挺好的,不過(guò)hibernate中是如何實(shí)現(xiàn)的,我現(xiàn)在還不大清楚.
          明白了作者要講的東西,只是自己在使用這種方法的時(shí)候,該不該用,什么時(shí)候用,如何用還不能夠很好的把握.

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-19 12:10 by 坎井之蛙
          不錯(cuò),不錯(cuò),希望以后可以看到,兄臺(tái)更多的好文章,加油....

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-19 20:17 by badqiu
          一看呀,原來(lái)hibernate是個(gè)數(shù)據(jù)庫(kù)連接池````

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-07-20 11:28 by 三寶弟子
          要午餐了,灌幾句!

          e1.printStackTrace();
          throw new DAOException(e1);
          打印異常內(nèi)容,然后又拋出,好像不好啊

          reset.getString(i) 提出來(lái)作為一個(gè)local variable把

          reset.getString(i).equals("")
          這個(gè)沒(méi)問(wèn)題,不過(guò)使用string.getLength()==0 更好些把

          Class cls=co.getClass();
          Class partypes[] = new Class[]{String.class};
          這些放到循環(huán)里面,好像很差勁哪!
          會(huì)死人的,還是扔到循環(huán)外面把

          meta.getColumnCount() 這個(gè)不好,
          不如明確使用str1等屬性名稱,
          比如我們的數(shù)據(jù)庫(kù)數(shù)據(jù)需要導(dǎo)來(lái)導(dǎo)去,
          數(shù)據(jù)庫(kù)的表里可能有些字段,本程序根本不會(huì)用到....
          這個(gè)說(shuō)錯(cuò)了,收回!!!!!!僅供參考

          恩,不錯(cuò), 加油啊


          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-08-05 00:04 by DrummerStyle
          值得學(xué)習(xí),頂了

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-08-05 00:06 by DrummerStyle
          js的高級(jí)用法估計(jì)以后都很難接觸到啊。。

          # re: 以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì)  回復(fù)  更多評(píng)論   

          2006-08-18 13:03 by 雨人
          分析的不錯(cuò),可惜還不理解hibernate
          主站蜘蛛池模板: 台中县| 毕节市| 陆良县| 玉门市| 仪征市| 乡城县| 延长县| 石泉县| 开平市| 垦利县| 水城县| 通化市| 喀什市| 乳山市| 稷山县| 灵川县| 镇沅| 德州市| 理塘县| 固镇县| 新河县| 大渡口区| 临沂市| 十堰市| 日土县| 临潭县| 绥化市| 郁南县| 犍为县| 嘉禾县| 札达县| 天柱县| 个旧市| 沙坪坝区| 新绛县| 台中市| 呼和浩特市| 河源市| 沾化县| 承德县| 志丹县|