隨筆 - 20  文章 - 12  trackbacks - 0
          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(1)

          隨筆檔案(20)

          java論壇

          我的朋友

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 15136
          • 排名 - 2000

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          newxy技術(shù)網(wǎng)站:http://www.newxy.net
          ??? 在java的web開(kāi)發(fā)領(lǐng)域較麻煩的是數(shù)據(jù)庫(kù)操縱,如果有工具能像delphi開(kāi)發(fā)數(shù)據(jù)庫(kù)運(yùn)用系統(tǒng)那樣高效,它一定會(huì)受到開(kāi)發(fā)者的歡迎。

          ??? 經(jīng)過(guò)五個(gè)方面的比較,newxy+struts WEB開(kāi)發(fā)與deiphi桌面開(kāi)發(fā)相比,速度更快,能力更強(qiáng)。

          ??? newxy是hibernate的替代者,struts+newxy是struts+hibernate的替代方案。

          ??? struts的不足,下面一篇文章有代表性:《Struts的巨大煩惱 真的不適合大系統(tǒng)?》http://dev.csdn.net/develop/article/85/85114.shtm
          主要觀點(diǎn)是:
           ??? 一、轉(zhuǎn)到展示層時(shí),需要配置forward,每一次轉(zhuǎn)到展示層,相信大多數(shù)都是直接轉(zhuǎn)到j(luò)sp, 而涉及到轉(zhuǎn)向,需要配置forward,如果有十個(gè)展示層的jsp,需要配置十次struts, 而且還不包括有時(shí)候目錄、文件變更,需要重新修改forward,注意,每次修改配置之后, 要求重新部署整個(gè)項(xiàng)目,而tomcate這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器,如果業(yè)務(wù)變更復(fù)雜頻繁的系統(tǒng), 這樣的操作簡(jiǎn)單不可想象。現(xiàn)在就是這樣,幾十上百個(gè)人同時(shí)在線使用我們的 系統(tǒng), 大家可以想象一下,我的煩惱有多大。
          ??? 二、當(dāng)頁(yè)面表單需要自動(dòng)變化或者頻繁變化時(shí)。
          ??? 對(duì)于一個(gè)成熟的MIS系統(tǒng)來(lái)說(shuō),頁(yè)面表單肯定是不固定的,甚至象有些系統(tǒng),頁(yè)面表單是存在數(shù)據(jù)庫(kù)中, 需要填寫(xiě)的表單在頁(yè)面自動(dòng)生成,比如填寫(xiě)一個(gè)人員基本信息,本來(lái)只需要填寫(xiě) 姓名、性別、出生年月 三個(gè)指標(biāo), 而我后來(lái)需要增加籍貫這樣的指標(biāo),我只需要在數(shù)據(jù)庫(kù)中添加籍貫這個(gè)記錄,并在頁(yè)面就能自動(dòng)增加籍貫這樣的表單。 而 struts在這方面,其優(yōu)勢(shì)反而變成了不足,我參考了非常多的人力資源管理系統(tǒng),這些系統(tǒng)幾乎都能夠做系統(tǒng)里面就可以控制人員信息的指示, 進(jìn)行使展示層能隨之靈活變化,如果使用了struts,這些靈活性就根本用不上。 同時(shí),如果頁(yè)面表單頻繁變化時(shí),就需要頻繁修改formbean對(duì)應(yīng)的方法和屬性,而每次修改之后,就要求重新部署,或者重新啟動(dòng)服務(wù)器……。
          ??? hibernate的不足,下面是一位網(wǎng)友的看法,具有代表性:
          ??? 一、對(duì)象與數(shù)據(jù)庫(kù)的映射,關(guān)鍵在于對(duì)象關(guān)系的映射,但是沒(méi)做到很理想,配置過(guò)多,控制復(fù)雜, 另外還會(huì)出錯(cuò)。其實(shí)本質(zhì)在于對(duì)象不夠自由。
          ??? 二、事務(wù)處理。這點(diǎn)上更容易出問(wèn)題,相對(duì)于各種各樣的事務(wù)管理器,要兼容是一個(gè)大問(wèn)題, 總歸在各種應(yīng)用服務(wù)器上有很多問(wèn)題。其本質(zhì)在于創(chuàng)建了一個(gè)自我數(shù)據(jù)存取小環(huán)境,必然面臨各種兼容問(wèn)題。
          ??? 三、HQL語(yǔ)言。建立對(duì)象查詢語(yǔ)言,類(lèi)SQL,但是不同于任何一種SQL,調(diào)試環(huán)境復(fù)雜。本質(zhì)在于創(chuàng)建了一種語(yǔ)言,增加學(xué)習(xí)成本。
          ??? 這位網(wǎng)友還提出了減化和退化方案。

          ??? struts+newxy至所以在開(kāi)發(fā)效率上比struts+hibernate能提高十倍、甚至幾十倍,是因?yàn)榭朔藄truts與hiberate的不足。
          ??? 利用newxy DAO類(lèi),標(biāo)簽, struts+newxy可以在以下幾個(gè)方面不用寫(xiě)java代碼,不用配置struts。

          ??? 1.數(shù)據(jù)庫(kù)的增、刪、改;
          ??? 2.對(duì)查詢所得數(shù)據(jù)緩存,指定緩存時(shí)長(zhǎng);
          ??? 3.數(shù)據(jù)庫(kù)字符編碼與本地字符編碼轉(zhuǎn)換;
          ??? 4.文件上傳,上傳大小控制;
          ??? 5.文件下載,下載記數(shù);
          ??? 6.圖片顯示;
          ??? 7.數(shù)據(jù)分頁(yè)顯示;
          ??? 8.客戶端標(biāo)記記錄集哪條記錄被選擇;

          ??? 因?yàn)榭梢圆粚?xiě)java代碼,不用建立ActionForm類(lèi)、Action類(lèi),因而不用配置struts,不用重新編譯類(lèi)文件、不用重新打包、不用重啟服務(wù)器。 可以克服struts的不足。
          ??? 在克服hibernate的不足方面,newxy采用“退化”和“進(jìn)化”并用的方案。
          ??? newxy在進(jìn)行數(shù)據(jù)的查詢、增、刪、改時(shí)都會(huì)調(diào)用一注冊(cè)方法,根據(jù)業(yè)務(wù)涉及到的數(shù)據(jù)庫(kù)相關(guān)數(shù)據(jù)源名和表名進(jìn)行注冊(cè), 注冊(cè)的目的是要獲得表字段對(duì)應(yīng)的java類(lèi)名,主關(guān)鍵字段名,主關(guān)鍵字段長(zhǎng)度等數(shù)據(jù),保存在一個(gè)單子實(shí)例中,以供DAO類(lèi)調(diào)用。 如果已注冊(cè)不再注冊(cè)。
          ??? 可以對(duì)多表查詢語(yǔ)句注冊(cè),如:“select a.field1,b.field2 from table1 as a,table2 as b where ...";
          ??? 可以對(duì)跨數(shù)據(jù)源的查詢注冊(cè)。如:"select a.field1,b.field2 from table1 as a,DB3.dto.table2 as b where ...";
          ??? 如果是數(shù)據(jù)增、刪、改,則是對(duì)單一表注冊(cè);
          ??? 由于struts+newxy用即時(shí)注冊(cè)的方法,可以不象hibernate那樣用靜態(tài)文件影射數(shù)據(jù)庫(kù)到值對(duì)象類(lèi)。開(kāi)發(fā)者不用配置任何文件。可以使用任意查詢語(yǔ)句,克服“對(duì)象不夠自由”問(wèn)題。
          ??? hibernate通過(guò)配置文件設(shè)置表之間的關(guān)系,有一定意義,newxy在這方面算是“退化”的,但struts+newxy在處理數(shù)據(jù)庫(kù)表之間關(guān)系方面是很容易的。
          ??? 在事務(wù)處理方面,newxy提供了一事務(wù)類(lèi)net.newxy.dbm.Transaction。它可以將多個(gè)數(shù)據(jù)庫(kù)的操作放在一個(gè)事務(wù)中。由于DAO類(lèi)對(duì)數(shù)據(jù)操作前的注冊(cè)方法得到的表及其字段各種特性都是與數(shù)據(jù)庫(kù)直接相關(guān)的,而不是事先用靜態(tài)文件影射, 因而極少發(fā)生錯(cuò)誤;開(kāi)發(fā)者可以通過(guò)Transaction的方法為不同的數(shù)據(jù)庫(kù)設(shè)置不同的隔離等級(jí);可以設(shè)置操時(shí)回滾時(shí)間,在設(shè)置的時(shí)間內(nèi)事務(wù)沒(méi)有完成,會(huì)有一線程進(jìn)行干預(yù),將事務(wù)回滾。
          ??? hibernate的HQL語(yǔ)言是和數(shù)據(jù)庫(kù)與對(duì)象影射規(guī)則相適應(yīng)的,它沒(méi)有特別功能,主要是利用值對(duì)象類(lèi)來(lái)查詢數(shù)據(jù)。 newxy也提供了一種查詢語(yǔ)言NQL。開(kāi)發(fā)者不需用特殊的語(yǔ)法來(lái)構(gòu)建查詢語(yǔ)句。非常容易理解,不會(huì)增加學(xué)習(xí)成本。

          struts一旦與newxy結(jié)合到一起運(yùn)用是如此簡(jiǎn)單,下列是struts+newxy代替struts+hibernate的例子。

          ??????? struts配置中,formBean的type是“net.newxy.struts_faces.DynaFormBean”,開(kāi)發(fā)者不需另外設(shè)計(jì)ActionForm類(lèi)。如:
          ??????????? <form-bean name="myFormBean" type="net.newxy.struts_faces.DynaFormBean" />

          ??????? 用戶從頁(yè)面表單submit數(shù)據(jù)后,在Action類(lèi)的方法中,開(kāi)發(fā)者可以用DynaFormBean代替struts ActionForm,用DynaDto代替hibernate 對(duì)象類(lèi)。
          ??????? public ActionForward methodName(ActionMapping actionMapping, ActionForm actionForm,
          ????????????????????????????? HttpServletRequest httpServletRequest,
          ??????????? HttpServletResponse httpServletResponse) throws Exception{
          ??????????? ......
          ??????????? DynaFormBean form=(DynaFormBean)actionForm;
          ??????????? DynaDto dto=(DynaDto)form.getDto();
          ??????????? dto.set_table("table1");//如果用戶頁(yè)面沒(méi)有傳來(lái)數(shù)據(jù)庫(kù)表名。
          ??????????? try{
          ??????????????? IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"),
          ????????????????????? httpServletRequest.getLocale());? //絕大多數(shù)情況是:IFacade ifacade=IFacadeFactory.getFacade();

          ??????????????? //更新或插入,如果result==null,為update,否則為insert。
          ??????????????? result = ifacade.update(dto);//或:FormBeanUtils.update(ifacade, form);

          ??????????????? //刪除記錄
          ??????????????? ifacade.remove(dto);//或:FormBeanUtils.remove(ifacade, form);

          ??????????????? //數(shù)據(jù)查詢,如果上傳了符合newxy多項(xiàng)查詢規(guī)則的數(shù)據(jù)。查詢記錄集放在newForm 的_coll屬性中。
          ??????????????? DynaFormBean newForm=new DynaFormBean();
          ??????????????? FormBeanUtils.createForm(newForm, httpServletRequest);
          ??????????????? ......
          ??????????????? //開(kāi)發(fā)者如果想知道生成的sql語(yǔ)句,可以這樣:
          ??????????????? //string sql=form.get_sql();
          ??????????????? //由于開(kāi)發(fā)者在對(duì)數(shù)據(jù)進(jìn)行操作時(shí)完全不需知道sql語(yǔ)句,所以沒(méi)有提供方法讓開(kāi)發(fā)者直接得到sql語(yǔ)句來(lái)控制數(shù)據(jù)操作。
          ??????????????? //未來(lái)版本可能提供這樣的方法。
          ??????????? }catch(Exception e){
          ??????????????? ......
          ??????????? }
          ??????? }
          ??????? 如果使用newxy的標(biāo)簽可以不建立Action類(lèi),不設(shè)置struts的formBean及action,可以不寫(xiě)代碼。
          ???

          newxy也提供了一些實(shí)用類(lèi)。本文檔就是用newxy自身工具類(lèi)輕松建立的。

          posted on 2006-09-11 20:14 閱讀(333) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # re: struts+hibernate的替代方案:struts+newxy? 2006-09-21 14:06 
          hibernate連接數(shù)據(jù)庫(kù)的速度"暴慢"  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阜南县| 岫岩| 秦皇岛市| 汶川县| 仪征市| 富阳市| 泊头市| 即墨市| 博罗县| 鄢陵县| 宜丰县| 自贡市| 武定县| 弥勒县| 和田市| 司法| 临漳县| 台南市| 太原市| 湟源县| 共和县| 军事| 普格县| 富顺县| 营口市| 花莲县| 绥阳县| 孙吴县| 景洪市| 阿鲁科尔沁旗| 招远市| 喀什市| 灵璧县| 易门县| 克什克腾旗| 班戈县| 屏边| 奈曼旗| 灵璧县| 平原县| 汝州市|