posts - 11,  comments - 28,  trackbacks - 0
               摘要: JpetStore提供了一個整套的測試代碼對于想進(jìn)行單元測試卻不知道如何進(jìn)行單元測試的人(me)來說,是一個很好的學(xué)習(xí)機會。
          JpetStore的單元測試代碼與它的系統(tǒng)源文件是獨立分離的,在test文件夾中。打開文件夾可以很清楚的發(fā)現(xiàn)該文件夾的內(nèi)容組成結(jié)構(gòu)與源文件基本一致。
          JpetStore分為領(lǐng)域?qū)樱╠omain),持久層(peristence),服務(wù)層(service),表現(xiàn)層(presentation),它的測試也分這幾個層來進(jìn)行。  閱讀全文
          posted @ 2007-01-22 15:18 滌生 閱讀(3340) | 評論 (0)編輯 收藏
               摘要: 本文是在參閱了http://ivanl.javaeye.com/blog/24739基礎(chǔ)上完成的
          在看JPetStore的代碼時,發(fā)現(xiàn)它的分頁處理主要是通過返回PaginatedList對象來完成的。如:在CatalogService類中
          public PaginatedList getProductListByCategory(String categoryId) {
          return productDao.getProductListByCategory(categoryId);
          }
          分頁是操作數(shù)據(jù)庫型系統(tǒng)常遇到的問題。分頁實現(xiàn)方法很多,但效率的差異就很大了。iBatis是通過什么方式來實現(xiàn)這個分頁的了。查看它的實現(xiàn)部分:   閱讀全文
          posted @ 2007-01-18 16:27 滌生 閱讀(8462) | 評論 (6)編輯 收藏
          關(guān)鍵字: OO ? UML,泛化,依賴,關(guān)聯(lián),聚合????

          類與類之間的關(guān)系對于理解面向?qū)ο缶哂泻苤匾淖饔茫郧霸诿嬖嚨臅r候也經(jīng)常被問到這個問題,在這里我就介紹一下。
          類與類之間存在以下關(guān)系:
          (1)泛化(Generalization)
          (2)關(guān)聯(lián)(Association)
          (3)依賴(Dependency)
          (4)聚合(Aggregation)

          UML圖與應(yīng)用代碼例子:
          1.泛化(Generalization)
          [泛化]
          表示類與類之間的繼承關(guān)系,接口與接口之間的繼承關(guān)系,或類對接口的實現(xiàn)關(guān)系。一般化的關(guān)系是從子類指向父類的,與繼承或?qū)崿F(xiàn)的方法相反。
          [具體表現(xiàn)]
          父類 父類實例=new 子類()
          [UML圖](圖1.1)

          圖1.1Animal類與Tiger類,Dog類的泛化關(guān)系

          [代碼表現(xiàn)]

          1. class ?Animal{} ??
          2. class ?Tiger? extends ?Animal{} ??
          3. public ? class ?Test ??
          4. { ??
          5. ???? public ? void ?test() ??
          6. ????{ ??
          7. ????????Animal?a= new ?Tiger(); ??
          8. ????} ??
          9. }??

          2.依賴(Dependency)
          [依賴]
          對于兩個相對獨立的對象,當(dāng)一個對象負(fù)責(zé)構(gòu)造另一個對象的實例,或者依賴另一個對象的服務(wù)時,這兩個對象之間主要體現(xiàn)為依賴關(guān)系。
          [具體表現(xiàn)]
          依賴關(guān)系表現(xiàn)在局部變量方法的參數(shù),以及對靜態(tài)方法的調(diào)用
          [現(xiàn)實例子]
          比如說你要去擰螺絲,你是不是要借助(也就是依賴)螺絲刀(Screwdriver)來幫助你完成擰螺絲(screw)的工作
          [UML表現(xiàn)](圖1.2)


          圖1.2 Person類與Screwdriver類的依賴關(guān)系

          [代碼表現(xiàn)]

          1. public?class?Person{ ??
          2. ????/**?擰螺絲?*/??
          3. ????public?void?screw(Screwdriver?screwdriver){ ??
          4. ????????screwdriver.screw(); ??
          5. ????} ??
          6. }??

          3.關(guān)聯(lián)(Association)
          [關(guān)聯(lián)]
          對于兩個相對獨立的對象,當(dāng)一個對象的實例與另一個對象的一些特定實例存在固定的對應(yīng)關(guān)系時,這兩個對象之間為關(guān)聯(lián)關(guān)系。
          [具體表現(xiàn)]
          關(guān)聯(lián)關(guān)系是使用實例變量來實現(xiàn)
          [現(xiàn)實例子]
          比如客戶和訂單,每個訂單對應(yīng)特定的客戶,每個客戶對應(yīng)一些特定的訂單;再例如公司和員工,每個公司對應(yīng)一些特定的員工,每個員工對應(yīng)一特定的公司
          [UML圖] (圖1.3)

          圖1.3 公司和員工的關(guān)聯(lián)關(guān)系


          [代碼表現(xiàn)]
          1. public?class?Company{ ??
          2. ????private?Employee?employee; ??
          3. ????public?Employee?getEmployee(){ ??
          4. ????????return?employee; ??
          5. ????} ??
          6. ????public?void?setEmployee(Employee?employee){ ??
          7. ????????this.employee=employee; ??
          8. ????} ??
          9. ????//公司運作 ??
          10. ????public?void?run(){ ??
          11. ????????employee.startWorking(); ??
          12. ????} ??
          13. }??
          (4)聚合(Aggregation)
          [聚合]
          當(dāng)對象A被加入到對象B中,成為對象B的組成部分時,對象B和對象A之間為聚集關(guān)系。聚合是關(guān)聯(lián)關(guān)系的一種,是較強的關(guān)聯(lián)關(guān)系,強調(diào)的是整體部分之間的關(guān)系。
          [具體表現(xiàn)]
          與關(guān)聯(lián)關(guān)系一樣,聚合關(guān)系也是通過實例變量來實現(xiàn)這樣關(guān)系的。關(guān)聯(lián)關(guān)系和聚合關(guān)系來語法上是沒辦法區(qū)分的,從語義上才能更好的區(qū)分兩者的區(qū)別。
          [關(guān)聯(lián)與聚合的區(qū)別]
          (1)關(guān)聯(lián)關(guān)系所涉及的兩個對象是處在同一個層次上的。比如人和自行車就是一種關(guān)聯(lián)關(guān)系,而不是聚合關(guān)系,因為人不是由自行車組成的。
          聚合關(guān)系涉及的兩個對象處于不平等的層次上,一個代表整體,一個代表部分。比如電腦和它的顯示器、鍵盤、主板以及內(nèi)存就是聚集關(guān)系,因為主板是電腦的組成部分。
          (2)對于具有聚集關(guān)系(尤其是強聚集關(guān)系)的兩個對象,整體對象會制約它的組成對象的生命周期。部分類的對象不能單獨存在,它的生命周期依賴于整體類的對象的生命周期,當(dāng)整體消失,部分也就隨之消失。比如張三的電腦被偷了,那么電腦的所有組件也不存在了,除非張三事先把一些電腦的組件(比如硬盤和內(nèi)存)拆了下來。
          [UML圖](圖1.4)

          圖1.3 電腦和組件的聚合關(guān)系

          [代碼表現(xiàn)]
          1. public?class?Computer{ ??
          2. ????private?CPU?cpu; ??
          3. ????public?CPU?getCPU(){ ??
          4. ????????return?cpu; ??
          5. ????} ??
          6. ????public?void?setCPU(CPU?cpu){ ??
          7. ????????this.cpu=cpu; ??
          8. ????} ??
          9. ????//開啟電腦 ??
          10. ????public?void?start(){ ??
          11. ????????//cpu運作 ??
          12. ????????cpu.run(); ??
          13. ????} ??
          14. }??

          posted @ 2007-01-17 10:07 滌生 閱讀(579) | 評論 (0)編輯 收藏
               摘要: 本文參考了
          iBatis DAO入門與進(jìn)階(http://www.matrix.org.cn/resource/article/44/44058_iBatis+DAO.html)
          iBatis DAO事務(wù)探索(http://www.aygfsteel.com/RongHao/archive/2006/01/20/28817.html)

          今天繼續(xù)研究了JPetStore的持久層,其中由于看了一篇文章的誤導(dǎo),導(dǎo)致我對其中的事務(wù)處理深表懷疑。通過閱讀源代碼與看上面兩篇文章,對這個問題才認(rèn)識清楚。和我當(dāng)初預(yù)想的一致。
            閱讀全文
          posted @ 2007-01-16 21:15 滌生 閱讀(2810) | 評論 (2)編輯 收藏
               摘要: 問題就出現(xiàn)在這,Item類中包含了Product類,出現(xiàn)NestedSqlException錯誤。
          查閱了ibatis幫助,此處sql_map的嵌套類寫法是正確的。我又將這個sql語句拷貝到MsSqlServer中執(zhí)行,結(jié)果也是正確的。陷入困惑。
            閱讀全文
          posted @ 2007-01-16 13:38 滌生 閱讀(3369) | 評論 (6)編輯 收藏
          今天在看JPetStore代碼時,對他的鏈接中的請求參數(shù)感到疑惑,最后發(fā)現(xiàn)是自己的對Struts框架不熟悉導(dǎo)致的。
          我是從Net陣營中剛轉(zhuǎn)入Java里的,在Net中對請求參數(shù)的名稱無特殊限制,只要在頁面中取參數(shù)的值即可。當(dāng)然這個功能在Java中也具備。即request.Getparameter()

          今天我在看JpetStore代碼時,在點擊
          http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?categoryId=BIRDS
          時,當(dāng)跟蹤函數(shù)viewCategory時發(fā)現(xiàn)此時categoryID已經(jīng)賦值了,我卻找不到在什么地方賦值的,好是花費了一番周執(zhí)。
          查看此段鏈接對應(yīng)的struts.xml

          ????
          <action?path="/shop/viewCategory"?type="org.apache.struts.beanaction.BeanAction"
          ????????????name
          ="catalogBean"?scope="session"
          ????????????validate
          ="false">
          ??????
          <forward?name="success"?path="/catalog/Category.jsp"/>
          我首先跟蹤BeanAction的excute函數(shù)發(fā)現(xiàn)在此之前就已經(jīng)賦值,說明和BeanAction無關(guān),是Struts系統(tǒng)本身的結(jié)構(gòu)。我故意將鏈接修改,修改成
          http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?category=BIRDS
          此時出現(xiàn)錯誤,錯誤如下:
          java.lang.IllegalArgumentException:?Cannot?invoke?com.ibatis.jpetstore.presentation.CatalogBean.setCategory?-?argument?type?mismatch
          ????org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:
          1778)
          ????org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:
          1759)
          ????org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:
          1648)
          ????org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:
          1677)
          ????org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:
          1022)
          ????org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:
          811)
          ????org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:
          298)
          ????org.apache.struts.util.RequestUtils.populate(RequestUtils.java:
          493)
          ????org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:
          805)
          ????org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:
          203)
          ????org.apache.struts.action.ActionServlet.process(ActionServlet.java:
          1194)
          ????org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:
          414)
          ????javax.servlet.http.HttpServlet.service(HttpServlet.java:
          689)
          ????javax.servlet.http.HttpServlet.service(HttpServlet.java:
          802)
          根據(jù)這個錯誤堆棧可知,它實際上采用的是反射,setProperty,此時找不到category的Setter函數(shù)報錯。然后我查看了一下RequestProcessor的默認(rèn)實現(xiàn)代碼
          //?Process?any?ActionForm?bean?related?to?this?request
          ActionForm?form?=?processActionForm(request,?response,?mapping);
          processPopulate(request,?response,?form,?mapping);
          這段函數(shù)功能為:
          1)調(diào)用processActionForm( )方法檢查是否存在為ActionMapping配置的ActionForm 。如果存在,則在有效區(qū)
          域內(nèi)查找是否存在該ActionForm 的實例,存在,則復(fù)用,不存在,則創(chuàng)建一個實例。然后將實例保存與再配置
          文件中配置好的有效區(qū)域(request,session,application)內(nèi),并用Action元素的name屬性作為該實例的關(guān)鍵字。
          2)調(diào)用processPopulate( )方法,如果存來存在為ActionMapping配置的ActionForm,則封裝請求對象中的數(shù)據(jù)
          到ActionForm 中,在進(jìn)行封裝之前,先調(diào)用ActionForm 的reset( )方法進(jìn)行屬性值的默認(rèn)化。

          根據(jù)以上的分析,可得知,在調(diào)用鏈接前struts框架會自動的將所有的請求參數(shù)封裝入指定的formbean中。所以請求參數(shù)的名稱應(yīng)該是對應(yīng)formbean的一個屬性。

          這就是struts中請求參數(shù)的處理過程。主要是我對struts還沒有完全掌握,加上Net的影響,才花費了一圈發(fā)現(xiàn)這個原因。
          posted @ 2007-01-15 20:56 滌生 閱讀(973) | 評論 (0)編輯 收藏

          JpetStore中的Action與普通Struts的Action處理方式不一樣。遍歷JpetStore的src文件夾,并無一個具體的Action,那么它是如何來完成普通Struts的Action工作了?
          查看JpetStore的Struts.xml可以發(fā)現(xiàn),它的Action只有一個,即“org.apache.stuts.beanaction.Beanaction”。通過Eclipse查看beanaction.jar的源代碼,可以發(fā)現(xiàn)Beanaction繼承與普通Action,即具備普通的action的功能。那么它無具體Action的奧妙在哪,繼續(xù)研究BeanAction的代碼,截取BeanAction的excute方法中核心部分代碼如下:?
          /*遍歷此方法的業(yè)務(wù)邏輯可知,*的優(yōu)先級最高,如果是*,則不調(diào)用任何方法直接Forward,類似于ForwardAction*/?
          private?static?final?String?NO_METHOD_CALL?=?"*";?
          …….?
          /*所有的FormBean都繼承于BaseBean*/?
          BaseBean?bean?
          =?(BaseBean)?form;?
          ??????ActionContext.initCurrentContext(request,?response);?
          ??????
          if?(bean?!=?null)?{?
          ????????
          //?Explicit?Method?Mapping?
          /*下面是檢查struts.xml配置中是否有parameter屬性*/?
          ????????Method?method?
          =?null;?
          ????????String?methodName?
          =?mapping.getParameter();?
          ????????
          if?(methodName?!=?null?&&?!NO_METHOD_CALL.equals(methodName))?{?
          ??????????
          try?{?
          /*通過反射,根據(jù)得到的方法名稱取得方法的句柄*/?
          ????????????method?
          =?bean.getClass().getMethod(methodName,?null);?
          ????????????
          synchronized?(bean)?{?
          /*下面是關(guān)鍵一句,調(diào)用basebean擁有的接口ActionInterceptor的實現(xiàn)DefaultActionInterceptor,來完成具體方法的調(diào)用*/?
          ??????????????forward?
          =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
          ????????????}
          ?
          ?????????……..?
          /*無Parameter屬性,檢查path路徑的最后一個/后的名稱,即為調(diào)用的方法名*/?
          ????????
          //?Path?Based?Method?Mapping?
          ????????if?(method?==?null?&&?!NO_METHOD_CALL.equals(methodName))?{?
          ??????????methodName?
          =?mapping.getPath();?
          ??????????
          if?(methodName.length()?>?1)?{?
          ????????????
          int?slash?=?methodName.lastIndexOf("/")?+?1;?
          ????????????methodName?
          =?methodName.substring(slash);?
          ????????????
          if?(methodName.length()?>?0)?{?
          ??????????????
          try?{?
          ????????????????method?
          =?bean.getClass().getMethod(methodName,?null);?
          ????????????????
          synchronized?(bean)?{?
          ??????????????????forward?
          =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
          ????????????????}
          ?
          ?????????????……..?
          /*根據(jù)調(diào)用方法返回的String,得到頁面的轉(zhuǎn)移路徑*/?
          return?mapping.findForward(forward);?
          ?
          通過研究上面這段代碼,我們可知,JpetStore中沒有具體Action實現(xiàn)的關(guān)鍵原因即在于下面這幾句
          /*通過反射,根據(jù)得到的方法名稱取得方法的句柄*/?
          ????????????method?
          =?bean.getClass().getMethod(methodName,?null);?
          ????????????
          synchronized?(bean)?{?
          /*下面是關(guān)鍵一句,調(diào)用basebean擁有的接口ActionInterceptor的實現(xiàn)DefaultActionInterceptor,來完成具體方法的調(diào)用*/?
          ??????????????forward?
          =?bean.getInterceptor().intercept(new?ActionInvoker(bean,?method));?
          ????????????}
          ?
          即將原來Action中的excute方法的實現(xiàn)轉(zhuǎn)移到FormBean中,這樣實現(xiàn)顯得更為簡捷,方便。研究ActionInvoke,它的核心代碼如下:
          public?String?invoke()?{?
          ????
          try?{?
          ??????
          return?(String)?method.invoke(bean,?null);?
          ????}
          ?catch?(Exception?e)?{?
          ??????
          throw?new?BeanActionException("Error?invoking?Action.??Cause:?"?+?e,?e);?
          ????}
          ?
          ??}
          ?
          至此可知,它調(diào)用的是formbean中的函數(shù)。且從這段代碼可知,formbean的這類特殊函數(shù),此處稱為action方法,要符合兩個特征:1)無參數(shù);2)返回值為string,此返回string即是Struts-config.xml的全局或局部的forward。
          以上是整個beanaction的實現(xiàn)機制。個人感覺此種實現(xiàn)方法對于開發(fā)者而言已經(jīng)類似于ASP.NET的.aspx與.cs開發(fā)模式了。下面是通過實例來說明一下BeanAction如何控制formbean的
          ?
          Struts-config.xml的配置里有3種映射方式,來告訴BeanAction把控制轉(zhuǎn)到哪個form bean對象的哪個方法來處理。
          (1)parameter=”*’直接跳轉(zhuǎn);(2)Parameter中含具體的方法名;(3)Path中最后一個/后的方法名
          以這個請求連接為例http://localhost/jpetstore4/shop/viewOrder.shtml
          1. URL Pattern

          ???
          <action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
          ????name
          ="orderBean"?scope="session"
          ????validate
          ="false">
          ????
          <forward?name="success"?path="/order/ViewOrder.jsp"/>
          ??
          </action>

          ?
          此種方式表示,控制將被轉(zhuǎn)發(fā)到"orderBean"這個form bean對象 的"viewOrder"方法(行為)來處理。方法名取"path"參數(shù)的以"/"分隔的最后一部分。
          2. Method Parameter?
          <action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
          ????name
          ="orderBean"?parameter="viewOrder"?scope="session"
          ????validate
          ="false">
          ????
          <forward?name="success"?path="/order/ViewOrder.jsp"/>
          ??
          </action>

          ?
          此種方式表示,控制將被轉(zhuǎn)發(fā)到"orderBean"這個form bean對象的"viewOrder"方法(行為)來處理。配置中的"parameter"參數(shù)表示form bean類上的方法。"parameter"參數(shù)優(yōu)先于"path"參數(shù)。
          3. No Method call
          ?<action?path="/shop/viewOrder"?type="com.ibatis.struts.BeanAction"
          ????name
          ="orderBean"?parameter="*"?scope="session"
          ????validate
          ="false">
          ????
          <forward?name="success"?path="/order/ViewOrder.jsp"/>
          ??
          </action>

          此種方式表示,form bean上沒有任何方法被調(diào)用。如果存在"name"屬性,則struts把表單參數(shù)等數(shù)據(jù)填充到form bean對象后,把控制轉(zhuǎn)發(fā)到"success"。否則,如果name為空,則直接轉(zhuǎn)發(fā)控制到"success"。
          這就相當(dāng)于struts內(nèi)置的org.apache.struts.actions.ForwardAction的功能
          <action?path="/shop/viewOrder"?type="org.apache.struts.actions.ForwardAction"
          ????parameter
          ="/order/ViewOrder.jsp?"?scope="session"?validate="false">
          ?
          </action>
          ?

          ?
          posted @ 2007-01-12 16:34 滌生 閱讀(3887) | 評論 (8)編輯 收藏
          對初接觸者來說,到底如何開始使用abator,資源比較少,本文記載了我今日初次使用的過程,希望對和我一樣的初學(xué)者有所幫助

          獲得
          ????? http://ibatis.apache.org/abator.html
          ???? Eclipse可以自動的進(jìn)行Update獲取此Plugin,官方的安裝步驟

          Automatic Eclipse Install

          If you've already installed a prior version of Abator, simply run the Eclipse Install/Update tool and the new version will be found automatically.

          If you've not already installed Abator, then you can use the built in Eclipse install support by following these steps:

          1. Take the "Help>Software Updates>Find and Install" Menu Option
          2. Select the "Search for new features to install" radio button, press "Next"
          3. Press the "New Remote Site" button
          4. Enter the following information:
            Name:
            Abator for Eclipse Update Site
            URL:
            http://ibatis.apache.org/tools/abator
          5. Press OK
          6. Check the box next to "Abator for Eclipse Update Site"
          7. Follow the remainder of the install wizard

          2、安裝好后將在New菜單中看到一個新的文件類型Abator for iBATIS Configuration File,此是Abator的配置文件,配置文件的詳細(xì)說明見http://ibatis.apache.org/docs/tools/abator/

          3、新建一個配置文件,進(jìn)行修改,根據(jù)自己的實際需求進(jìn)行修改
          關(guān)鍵點:
          1)jdbcconnection,按照一般的配置即可,需要說明的是它需要指定訪問JdbcDriver的classPathEntry,對于MsSqlServer而言,要將這三個jar文件均包含在內(nèi),否則會出現(xiàn)jdbc訪問錯誤。
          2)配置三個Pakage
          3)配置表,此處需說明的是對于MsSqlServer不能寫TableSchema,我初次指定TableSchema,結(jié)果未找到對應(yīng)的表
          簡單的配置如下,復(fù)雜的見配置文件的詳細(xì)說明。示例配置文件如下
          <abatorConfiguration>
          ? <abatorContext>??? <!-- TODO: Add Database Connection Information -->
          ??? <jdbcConnection driverClass="com.microsoft.jdbc.sqlserver.SQLServerDriver"
          ??????? connectionURL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor"
          ??????? userId="sa"
          ??????? password="sa">
          ????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/mssqlserver.jar" />
          ????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msutil.jar" />
          ????? <classPathEntry location="C:/Program Files/Apache Software Foundation/Tomcat 5.0/common/lib/msbase.jar" />
          ??? </jdbcConnection>

          ??? <javaModelGenerator targetPackage="com.dwerp.itatis.domain" targetProject="BhbManage" />
          ??? <sqlMapGenerator targetPackage="com.dwerp.itatis.persistence.xml" targetProject="BhbManage" />
          ??? <daoGenerator type="IBATIS" targetPackage="com.dwerp.itatis.persistence.sqlmapdao" targetProject="BhbManage" />

          ??? <table tableName="BHBGL">
          ????
          ??? </table>

          ? </abatorContext>
          </abatorConfiguration>

          4、右鍵單擊配置文件,點擊Generate iBatis Artifacts,生成文件。

          ?

          posted @ 2007-01-11 21:37 滌生 閱讀(2016) | 評論 (1)編輯 收藏
          學(xué)習(xí)的最好方法莫過于研究示例程序。本文是鄙人今日在Eclipse中運行iBATIS的JpetStore的記錄,供同仁參考

          1、下載iBAITS(http://ibatis.apache.org/javadownloads.cgi)
          2、下載JPetStore-5.0(http://ibatis.apache.org/javadownloads.cgi)

          準(zhǔn)備工作完成,下面開始將示例程序轉(zhuǎn)移到Eclipse中
          1、在Eclipse中新建一個空的WebProject,如:JPetStore
          2、將下載的JPetStore-5.0文件夾的內(nèi)容拷貝至JPetStore,其中由于Eclipse默認(rèn)的Web文件夾是WebRoot所以JPetStore-5.0中的Web文件單獨拷貝到新建的Project的Web文件夾WebRoot下。簡單的是說,就是要保證空的WebProject中的所擁有文件模型不動,將下載的內(nèi)容拷貝到相應(yīng)的文件夾下
          3、刷新Eclipse,此時會看到src下顯示為錯誤,錯誤的原因是此時對應(yīng)的包未引入,由于Eclipse默認(rèn)的是WebRoot/lib下的包文件,所以將主目錄下即JPetStore/devlib與JPetStore/lib引入到項目中
          有兩種方法:直接將此兩個文件夾下的內(nèi)容直接拷貝到JPetStore/WebRoot/lib下,或者,通過Import命令引入
          4、至此就已經(jīng)完成項目遷移工作,下面就是
          1)建數(shù)據(jù)庫,鄙人用的是MsSqlServer,在JPetStore/src/ddl中有各種數(shù)據(jù)庫的sql文件
          2)修改iBATIS的database.propertis,見上篇拙作
          3)在Eclipse通過Tomcat部署
          即可看到PetShop的網(wǎng)站了
          http://127.0.0.1:8083/JPetStore

          希望對和我一樣的初學(xué)者有所幫助
          posted @ 2007-01-11 21:22 滌生 閱讀(4284) | 評論 (4)編輯 收藏

          希望此文能對初次使用ibatis訪問MsSqlserver的朋友起個借鑒

          1、在http://ibatis.apache.org/javadownloads.cgi下載ibatis,我下載的是2.2.0,由于還沒有看Spring,所以下載此版本,帶 iBATIS DAO 框架。以后版本都不再含有此框架。見網(wǎng)站說明:
          Note: iBATIS 2.2.0 is the last release that includes the iBATIS DAO framework. After 2.2.0, the DAO iBATIS framework is removed from the downloads. We suggest converting iBATIS framework DAOs to the Spring Framework.
          2、下載后將lib文件夾下的三個jar文件加入機器的Classpath中
          此時,iBATIS 的框架已經(jīng)搭建好

          下面介紹一下如何訪問MsSqlServer。
          1、機器已經(jīng)下載了Jdbc for MSsqlServer的jar文件,共三個文件,微軟網(wǎng)站有下載。
          2、可以通過Eclipse自帶的DataBase Explorer測試是否能訪問MsSqlServer

          此時,通過iBATIS訪問MsSqlServer的前期條件均已經(jīng)準(zhǔn)備好,下面進(jìn)行配置
          1、配置sql-map-config.xml文件,核心部分如下
          <sqlMapConfig>

          ? <properties resource="com/zyque/struts/database.properties"/>

          ? <transactionManager type="JDBC">
          ??? <dataSource type="SIMPLE">
          ????? <property value="${driver}" name="JDBC.Driver"/>
          ????? <property value="${url}" name="JDBC.ConnectionURL"/>
          ????? <property value="${username}" name="JDBC.Username"/>
          ????? <property value="${password}" name="JDBC.Password"/>
          ????? <property name="JDBC.DefaultAutoCommit" value="true" />
          ??? </dataSource>
          ? </transactionManager>

          ? <sqlMap resource="com/zyque/ibatis/BhbGl.xml"/>
          ?
          </sqlMapConfig>

          2、從上可以看出數(shù)據(jù)庫讀取的是database.properties,此配置如下
          driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
          url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor
          username=sa
          password=sa
          此處注意的是在訪問MsSqlServer時候,需將SelectMethod=cursor,原因見上篇博客

          通過這兩步就可以通過ibatis訪問MsSqlServer了
          訪問示例代碼(參考的ibatis的入門指南,ibatis官方網(wǎng)站有下載),此處未對代碼進(jìn)行功能隔離封裝,便于向嬖人之流的初學(xué)者學(xué)習(xí)
          Bhbm elm = null;
          String p_mc = "FM_BHJLDW";

          String resource = "com/zyque/ibatis/sql-map-config.xml";
          ?Reader reader = Resources.getResourceAsReader(resource);
          sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);


          elm = (Bhbm) sqlMap.queryForObject ("getBhbByName", p_mc);

          上面演示的一個簡單查詢,其余的示例可以看入門指南。并非本文的重點。

          ?????

          posted @ 2007-01-11 21:01 滌生 閱讀(991) | 評論 (1)編輯 收藏
          僅列出標(biāo)題  下一頁
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(5)

          隨筆檔案

          UML

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 大理市| 冕宁县| 马山县| 满洲里市| 赤峰市| 岑溪市| 辽宁省| 玉田县| 项城市| 驻马店市| 大足县| 师宗县| 米脂县| 会泽县| 那坡县| 确山县| 新民市| 昌黎县| 綦江县| 绥阳县| 内江市| 苏尼特左旗| 四川省| 县级市| 炎陵县| 普宁市| 河东区| 平远县| 育儿| 无为县| 永德县| 天祝| 兴隆县| 嫩江县| 广安市| 保康县| 克拉玛依市| 建瓯市| 汉中市| 麻阳| 安康市|