<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    love fish大鵬一曰同風起,扶搖直上九萬里

    常用鏈接

    統計

    積分與排名

    friends

    link

    最新評論

    以2/8原則指導我們的底層框架設計 (轉)

    原創文章,轉載請注明作者:Nomad,出處: www.jialing.net ?

    ??? 我想很多人都聽說過“2/8原則,有人研究過,這世界上財富的80%集中在20%的人手里,而另外80%的人只擁用20%的財富。實際的商業中,我們應該更關注大客戶,因為客戶里20%的大客戶,對我們貢獻的利潤可能會占到80%,這些都是有統計學基礎的數據。

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

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

    ??1//CommonalityObject.java
    ??2
    ??3//用以裝載數據并輸出的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?*?報表中執行SQL查詢的模版
    ?25?*?以CommonalityObject來裝載數據,運用反射機制加載返回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獲得相對應的數據集
    ?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??//裝載數據塊
    ?61??stat?=?conn.createStatement();
    ?62??//System.out.println("------運行的SQL語句--------"+sql);
    ?63
    ?64??//獲得對應的數據集
    ?65??reset?=?stat.executeQuery(sql);
    ?66?
    ?67??return?reset;
    ?68?}

    ?69?
    ?70?/**
    ?71??*?通過反射機制講ResultSet中的數據以CommonalityObject形式載入List中,最后返回List
    ?72??*?@author?李嘉陵
    ?73??*?@since?2006-7-14
    ?74??*?@param?reset?SQL搜索出來的集合
    ?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;?//需要動態調用的函數名
    ?97????Class?cls=co.getClass();?//得到要在其中查找方法的類
    ?98????Class?partypes[]?=?new?Class[]{String.class};?//函數調用的參數類型,這里為String。
    ?99????Method?mth=cls.getMethod(method_name,?partypes);?//得到方法
    100????Object[]?objs=new?Object[]{tmp};?//生成函數要調用的數據,這里為tmp。
    101????mth.invoke(co,?objs);?//調用得到的函數。
    102???}

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

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

    109}

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

    122}

    看懂了嗎?如果項目中我們需要完成幾十個這樣的報表輸出,有了這樣的底層代碼結構,編寫起來是不是很簡單呢。

    posted on 2006-07-21 01:35 liaojiyong 閱讀(371) 評論(0)  編輯  收藏 所屬分類: Hibernate

    主站蜘蛛池模板: 18观看免费永久视频| 午夜免费福利网站| 国产亚洲精品高清在线| 鲁啊鲁在线视频免费播放| 四虎成人免费观看在线网址| 亚洲成a人无码av波多野按摩| 亚洲欧美国产国产综合一区| 久久久久国色AV免费观看| 亚洲av再在线观看| 五级黄18以上免费看| 国产日韩成人亚洲丁香婷婷| 亚洲免费一区二区| 亚洲色爱图小说专区| 免费污视频在线观看| 又大又硬又爽免费视频| 粉色视频免费入口| 亚洲国产精品成人AV无码久久综合影院| 香港特级三A毛片免费观看| 区久久AAA片69亚洲| 亚洲第一第二第三第四第五第六 | aⅴ在线免费观看| 亚洲精品无码你懂的网站| 国产大片免费观看中文字幕| 亚洲精品成人久久| 无码高潮少妇毛多水多水免费| 亚洲av日韩av天堂影片精品| 羞羞漫画登录页面免费| 国产福利电影一区二区三区,亚洲国模精品一区| 曰批全过程免费视频观看免费软件 | 自拍偷自拍亚洲精品情侣| 久久午夜无码免费| 久久国产亚洲精品| 青娱乐免费视频在线观看| 亚洲一区免费观看| 成年人免费网站在线观看| 一级毛片高清免费播放| 亚洲成人精品久久| 日韩电影免费在线| 亚洲日韩中文字幕一区| 亚洲午夜国产片在线观看| 麻豆成人久久精品二区三区免费|