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

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

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

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    friends

    link

    最新評論

    以2/8原則指導(dǎo)我們的底層框架設(shè)計(jì) (轉(zhuǎn))

    原創(chuàng)文章,轉(zhuǎn)載請注明作者:Nomad,出處: www.jialing.net ?

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

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

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

    ??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來裝載數(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獲得相對應(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語句--------"+sql);
    ?63
    ?64??//獲得對應(yīng)的數(shù)據(jù)集
    ?65??reset?=?stat.executeQuery(sql);
    ?66?
    ?67??return?reset;
    ?68?}

    ?69?
    ?70?/**
    ?71??*?通過反射機(jī)制講ResultSet中的數(shù)據(jù)以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;?//需要?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//最終只要簡單的兩句就能完成報(bào)表的輸出工作
    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}

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

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

    主站蜘蛛池模板: 羞羞网站免费观看| 99爱视频99爱在线观看免费| 亚洲精品无码AV人在线播放 | 中文字幕在线免费观看| 在线观看亚洲AV日韩A∨| 亚洲第一页日韩专区| 国产成人AV免费观看| 亚洲日韩一区精品射精| 国产亚洲精AA在线观看SEE| 青苹果乐园免费高清在线| igao激情在线视频免费| 免费观看久久精彩视频| 亚洲偷偷自拍高清| 国产亚洲精品影视在线产品| 久草视频免费在线| 中文在线免费观看| 亚洲AV永久无码精品网站在线观看| 亚洲国产精品成人精品无码区 | 999任你躁在线精品免费不卡| 亚洲成a人无码亚洲成www牛牛 | mm1313亚洲精品无码又大又粗 | 特级毛片aaaa级毛片免费| 777亚洲精品乱码久久久久久| 一本色道久久88亚洲综合| 在线观看日本免费a∨视频| 日批视频网址免费观看| 亚洲aⅴ无码专区在线观看| 亚洲色成人网一二三区| 亚洲综合精品香蕉久久网| 天天拍拍天天爽免费视频| 精品一区二区三区免费毛片爱| 免费看黄福利app导航看一下黄色录像| 亚洲精品在线免费观看| 亚洲国产精彩中文乱码AV| 亚洲不卡无码av中文字幕| 成人免费视频一区| 999国内精品永久免费视频| 久久精品视频免费播放| 手机看片国产免费永久| fc2免费人成在线| 免费在线观看自拍性爱视频|