隨筆-39  評論-33  文章-0  trackbacks-0

          DAO + 通用持久類 + 通用動態(tài) formBean 類,實現(xiàn)數(shù)據(jù)增、刪、改、查

          newxy( 新坐標 ) 技術運用之三

          ?

          DAO類”: net.newxy.dbm.BaseDAO或其子類;

          “通用持久類”: net.newxy.dbm.DynaDto;

          “通用動態(tài)formBean類”: net.newxy.struts_faces.DynaFormBean。

          ?

          DAO + 通用持久類,實現(xiàn)數(shù)據(jù)增、刪、改、查》 ( 又名《 不同于hibernate,利用通用持久類實現(xiàn)數(shù)據(jù)增、刪、改、查,可極大提高開發(fā)效率 ) 文章中介紹的數(shù)據(jù)增、刪、改、查方法比 hibernate 的方法已簡單很多,如果引入通用動態(tài) formBean ,開發(fā)效率會有更大提高。

          ?

          net.newxy.struts_faces.DynaFormBean 類的類圖

          一、利用通用動態(tài)formBean類,實現(xiàn)數(shù)據(jù)增、刪、改

          struts ActionServlet 將用戶 submit 來的數(shù)據(jù)綁定到 net.newxy.struts_faces.DynaFormBean 對象中,在后臺,通過調(diào)用 net.newxy.struts_faces.DynaFormBean public Object getDto() 、 public Object get(String name) 方法將上傳的數(shù)據(jù)提出, net.newxy.struts_faces.DynaFormBean 起作傳送數(shù)據(jù)的作用。

          1 )數(shù)據(jù)插入: Object update(Object dto) throws Exception;

          舉例:

          public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

          				
          						????????????????????????????? HttpServletRequest httpServletRequest,
          		
          				
          						??????????? HttpServletResponse httpServletResponse) throws Exception{
          		
          				
          						??????????? ......
          		
          				
          						??????????? net.newxy.struts_faces.DynaFormBean form=( net.newxy.struts_faces.DynaFormBean)actionForm;
          				
          						
          						
          				
          		

          try{

          net.newxy.dbm.DynaDto dynaDto=( net.newxy.dbm.DynaDto)form.getDto();

          net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

          dynaDto.set_table("table1");//設置表名

          ??????? Object result=dao.update(dynaDto);

          ??? }catch(Exception e){

          ??????? ......

          }

          ......

          }

          jsp頁面不上傳主關鍵字段值,主關鍵字段值會自動得到,是原有最大值加一。

          如果jsp頁面上傳了主關鍵字段值,如:表單中有<html:text property=”id” />用戶鍵入了id值。newxy(新坐標)會檢查賦給的主關鍵字值是否已存在,如果存在,作更新(update)操作,如果不存在,作插入(insert)操作。

          判斷是更新還是插入操作,可以根據(jù)返回的result值來判斷,如果result值為空,是作更新操作,如果result不空是作插入操作。

          Object result=dao.update(dynaDto);

          如果想需要知道自動賦給的主關鍵字段值,可以用如下方法:

          Object result=dao.update(dynaDto);

          Object idValue=null;

          If(result!=null)

          idValue=((DynaDto)result).get(“id”);

          idValue 就是自動賦給的主關鍵字段值。

          ?

          2)數(shù)據(jù)更新:

          舉例:

          ?

          public ActionForward update(ActionMapping actionMapping, ActionForm actionForm,

          ????????????????????????????? HttpServletRequest httpServletRequest,

          ??????????? HttpServletResponse httpServletResponse) throws Exception{

          ??????????? ......

          ?? DynaFormBean form=(DynaFormBean)actionForm;

          try{

          DynaDto dynaDto=(DynaDto)form.getDto();

          net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

          dynaDto.set_table("table1");

          ?????? Object result=dao.update(dynaDto);

          ?? }catch(Exception e){

          ??????? ......

          }

          ......

          }

          數(shù)據(jù)更新方法與數(shù)據(jù)插入方法相同,需注意:如果 dynaDto 中沒有主關鍵字段值,即 dynaDto.get(“id”)==null dynaDto.get(“id”) 所得主關鍵字段值在表中不存在 dao.update(dynaDto) 方法仍然作插入操作。

          在進行 dao.update(dynaDto) 前,可以判斷數(shù)據(jù)是否已存在于表中:

          Object masterKey=dynaDto.get(“id”);

          Object record=null;

          if(masterKey!=null)

          record=dao.load(dynaDto);

          如果 masterKey==null record==null ,表中不存在該條記錄, dao.update(dynaDto) 作插入操作,否則該條記錄存在于表中,作更新操作。

          那么在 jsp 頁面上如何保證用戶錄入的是新插入數(shù)據(jù)或是編輯修改的數(shù)據(jù)呢?參看本文后面部分 jsp 頁面上新建、編輯數(shù)據(jù)

          3 )數(shù)據(jù)刪除

          舉例:

          public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm,

          				
          						
          								????????????????????????????? HttpServletRequest httpServletRequest,
          				
          		
          				
          						
          								??????????? HttpServletResponse httpServletResponse) throws Exception{
          				
          		
          				
          						
          								??????????? ......
          				
          		
          				
          						
          								
          										??????????? DynaFormBean form=(DynaFormBean)actionForm;
          								
          										
          										
          								
          						
          				
          		

          try{

          ??? // 刪除 formBean 當前數(shù)據(jù)對應的記錄:

          Object record=form.getDto();

          net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

          dynaDto.set_table("table1");// 設置表名,如果上傳數(shù)據(jù)的 jsp 頁面表單中沒有 <html:hidden name=”_table” value=”table1”/>

          ??????? dao.remove(dynaDto);

          ?

          ??????? // httpServletRequest.getParameter(“_index”) 值代表記錄號,刪除該條記錄

          ??????? String index= httpServletRequest.getParameter(“_index”);

          ??????? Object record=form.getDto(index);

          ??????? dao.remove(record);

          ??? }catch(Exception e){

          ??????? ......

          }

          ......

          }

          ?

          二、利用通用動態(tài)formBean類,實現(xiàn)多項查詢

          ?? 1、后臺代碼

          ?????? public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

          ?????????????? HttpServletRequest httpServletRequest,

          ?????????????? HttpServletResponse httpServletResponse) throws Exception{

          ?????????? DynaFormBean form=(DynaFormBean)actionForm;

          ?????????? net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest);

          ?????????? . .....

          ?????? }

          ??? net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest)方法將查詢結果放在form的_coll屬性中。后臺代碼極其簡單,

          那么httpServletRequest中包含了什么數(shù)據(jù)?下面是jsp頁面表單對上傳數(shù)據(jù)的組織。

          ?? 2、前臺查詢條件的組織

          <html:form action="/myAction.do?method=find">

          ? <html:hidden property="_dao" value="dao.myDAO1"/>

          ? <html:hidden property="_sql" value="select a.industry,b.* from industry as a,enterprise as b where{a.code=b.industry_code}"/>

          ? <table border="1">

          ??? <tr>

          ????? <td>邏輯</td>

          ????? <td colspan="2">

          ??????? <html:radio property="_lg" value="1">并且</html:radio>

          ??????? <html:radio property="_lg" value="0">或者</html:radio>

          ????? </td>

          ??? </tr>

          ??? <tr>

          ????? <td>行業(yè)</td>

          ????? <td>等于</td>

          ????? <td>

          ??????? <nhtml:hidden property="_item1" value="a.code"/>

          ??????? <html:hidden property="_item1" value="="/>

          ??????? <html:select property="_item1">

          ????????? <html:option value=""></html:option>

          ????????? <html:option value="A">農(nóng)、林、牧、漁業(yè)</html:option>

          ????????? <html:option value="B">采礦業(yè)</html:option>

          ????????? <html:option value="C">制造業(yè)</html:option>

          ??????? </html:select>

          ????? </td>

          ??? </tr>

          ??? <tr>

          ????? <td>企業(yè)名稱</td>

          ????? <html:hidden property="_item2" value="b.name"/>

          ????? <td>

          ??????? <html:select property="_item2">

          ????????? <html:option value=""></html:option>

          ????????? <html:option value="=">等于</html:option>

          ????????? <html:option value="like">包含</html:option>

          ??????? </html:select>

          ????? </td>

          ????? <td>

          ??????? <html:text property="_item2" size="40">

          ??????? </html:text>

          ????? </td>

          ??? </tr>

          ??? <tr>

          ????? <td>企業(yè)地址</td>

          ????? <html:hidden property="_item3" value="b.address"/>

          ????? <td>

          ??????? <html:select property="_item3">

          ????????? <html:option value=""></html:option>

          ????????? <html:option value="=">等于</html:option>

          ????????? <html:option value="like">包含</html:option>

          ??????? </html:select>

          ????? </td>

          ????? <td>

          ??????? <html:text property="_item3" size="40">

          ??????? </html:text>

          ????? </td>

          ??? </tr>

          ??? <tr>

          ????? <td align="right" colspan="3"><html:submit value=" 查 詢 "/></td>

          ??? </tr>

          ? </table>

          </html:form>

          該例是對企業(yè)表、行業(yè)表的連表查詢,查詢的基本條件是industry.code=enterprise.industry_code。

          ????? industry:行業(yè)代碼表

          ????? industry.code:行業(yè)代碼

          ????? enterprise:企業(yè)表

          ????? enterprise.industry_code:企業(yè)的行業(yè)代碼

          下面是表單中包含的幾個屬性:

          (1)_dao ,是DynaFormBean的保留屬性,是DAO類的別名,告訴后臺由哪個DAO類來操作數(shù)據(jù)。別名在WEB-INF/classes下的newxy.properties文件中指定,假設有一DAO類如下:

          ????????? package common;

          ????????? public class MyDAO1 extends net.newxy.dbm.BaseDAO{

          ????????????? ......

          }

          ????????? 在newxy.properties文件中定義DAO類別名如下:

          ?????? ????????? dao.mydao1=common.MyDAO1

          ???? 如果DAO類common.MyDAO1的別名是dao.default,則表單無需上傳屬性_dao。

          (2)_sql ,是DynaFormBean的保留屬性,是查詢的基本條件,其中where跟隨其后的是大括號{},是最終組成查詢條件存放的地方。用戶選擇的查詢條件不管是”and”連接的還是”or”連接的,最終與_sql屬性中的初始條件都以”and”關系連接。最后產(chǎn)生的sql語句可能是這樣的:

          ????????? ???select a.industry,b.* from industry as a,enterprise as b where((a.code=b.industry_code)and (name=’....公司’ or? ......))

          ???? 其中紅色是初始條件,藍色是用戶選擇的條件,二者以”and”相連。

          ?

          (3)_lg ,是DynaFormBean的保留屬性,是“邏輯”的意思,如果_lg==”1”,上傳的查詢條件以”and”關系組織,否則以”or”關系統(tǒng)組織。

          (4)_item開頭的屬性 ,這種屬性都以一個數(shù)字跟隨其后,這樣的屬性一上傳就有三個。如果在“企業(yè)名稱”的<select name=”_item2”>...</select>項選擇“等于”,在<input type=”text” name=”_item2”/>項填入“......公司”,上傳數(shù)據(jù)后可得到如下字符串數(shù)組:

          String[] itemValues=request.getParameterValues(“_item2”);

          itemValues是三個字符串構成的數(shù)組,三個字符串分別是 “a.name” “=” “......公司”,拼這一起可構成”a.name=’......公司’”,它構成查詢條件的一部分。之所以這么解說,是增加對查詢條件構成的理解。可參看 newxy(新坐標)網(wǎng)站 范例的“多項查詢”。

          三、 利用通用動態(tài)formBean類, 向前臺展現(xiàn)查詢結果

          newxy(新坐標)查詢的記錄集保存在DynaFormBean類的_coll屬性中,DynaFormBean另有一個屬性_navigate,負責對記錄集的分頁計算。jsp頁面可以用<nlogic:navigate/>標簽為formBean的記錄集分頁導航。

          舉例:

          如果struts的myAction的name=”enterprises”,查詢后,formBean以”enterprises”為名保存的會話或其它scope中。

          <div><nlogic:navigate formName="enterprise" length="20"/></div><!--導般標簽-->

          <logic:notEmpty name="enterprises" property="_coll">

          ? <table>

          ? <logic:iterate id="rec" name="enterprises" property="_coll">

          ??? <tr>

          ????? <td><bean:write name="rec" property="industry"/></td> <!--行業(yè)-->

          ????? <td><bean:write name="rec" property="name"/></td> <!--企業(yè)名稱-->

          ??? </tr>

          ? </logic:iterate>

          ? </table>

          </logic:notEmpty>

          屬性_coll是通用動態(tài)formBean類DynaFormBean的保留屬性,保存了查詢的記錄,類型是List,其元素是 org.apache.commons.beanutils.BasicDynaBean 類型。

          ???????

          四、通用動態(tài)formBean類DynaFormBean及其父類的重要方法

          ???? net.newxy.struts_faces.DynaFormBean類繼承自net.newxy.struts_faces.FormBean,下面是net.newxy.struts.faces.DynaFormBean及其父類net.newxy.struts.faces.FormBean的幾個重要方法

          1、public void append(java.lang.Object?dto)

          在結果集_coll的最后追加一條記錄。同時將索引號指向最后一條。并用最后一條記錄數(shù)據(jù)填寫formBean。

          2、public java.lang.String setCollection(java.lang.Object?objs)

          設置結果集,與set_coll(Collection _coll)相比,該方法除了作set_coll(Collection _coll)操作外,還對與分頁瀏覽的相關屬性值進行計算,將計算結果重新填入formBean的_navigate屬性中,并重新設置索引號。

          3、public void setDto(java.lang.String?no)

          formBean中的數(shù)據(jù)填寫到以no參數(shù)值為索引號的記錄中。

          4、public void setForm(java.lang.String?no)

          no參數(shù)值為索引號,查找該條記錄,如果存在,將該條記錄數(shù)據(jù)填入的formBean中,并以no值為索引號。

          5、public void setForm(java.lang.Object?dto)

          dto為包含數(shù)據(jù)的javaBean。將該Bean的值填入formBean中。這個javaBean類繼承自net.newxy.dbm.Dto,但在目前版本只介紹formBean類 net.newxy.struts.faces.FormBean 及持久類net.newxy.dbm.Dto,參數(shù)dto暫理解成通用持久類net.newxy.dbm.DynaDto。

          6、public java.lang.Object getDto()

          formBean得到持久類實例。

          7、public java.lang.Object getDto(java.lang.String?no)

          no為序號,返回這條記錄。如果不存在,返回空。

          8、public void remove(java.lang.String?no)

          從結果集中刪除以no參數(shù)值為序號的記錄。

          9、public java.lang.Object cloneDto(java.lang.String?no)

          no參數(shù)值為索引號,得到這條記錄的克隆

          10、public void empty()

          formBean數(shù)據(jù)清空,但保留屬性不會被清除,包括保存了記錄集的屬性_coll。

          11、public java.util.Map getValues()

          獲取保存了屬性值對的HashMap,頁面表單submit上傳的屬性保存在這個Map中。

          12、public java.lang.Object get(java.lang.String?name)

          獲取以name值為屬性名的屬性值

          13、public void set(java.lang.String?name, java.lang.Object?value)

          設置屬性值。如果name是保留屬性,將不進行set操作。

          14、public void setValue(java.lang.String?name,java.lang.Object?value)

          保留屬性的set方法,通過此方法給以改變保留屬性的值。

          15、public void set_dao(java.lang.String?_dao)

          設置DAO類別名,_dao是保留屬性,也可用方法setValue(“_dao”,_dao)。

          16、public void set_index(java.lang.String?_index)

          設置記錄集的索引號,_index是保留屬性,也可用方法setValue(“_index”,_index)。

          ?

          五、在jsp頁面上新建、編輯數(shù)據(jù)

          1、后臺查詢數(shù)據(jù)

          ?????? public ActionForward find(ActionMapping actionMapping, ActionForm actionForm,

          ?????????????? HttpServletRequest httpServletRequest,

          ?????????????? HttpServletResponse httpServletResponse) throws Exception{

          ?????????? DynaFormBean form=(DynaFormBean)actionForm;

          ?????????? net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest);

          ?????????? . .....

          ?????? }

          ? 2 、編輯更新記錄

          FormBeanUtils. createForm(form,httpServletRequest) 查詢的記錄集保存在DynaFormBean的_coll屬性中并且以第一條記錄填寫到formBean的屬性中。

          jsp頁面上有下列表單及其屬性:

          <html:form action="/myAction.do?method=update">

          ? <html:hidden property="_table" value="enterprise"/>

          ? <html:hidden property="industry_code" value="A"/>

          ? 注冊號:<html:text property="register_id"></html:text><br/>

          ? 負責人:<html:text property="principal"></html:text><br/>

          ? 企業(yè)名稱:<br />

          ? <html:text property="name" size="36"></html:text><br />

          ? 企業(yè)地址:<br />

          ? <html:text property="address" size="36"></html:text><br />

          ? 經(jīng)營范圍:<br/>

          ? <textarea name="dealIn" cols="36" rows="10">

          ? <bean:write name="enterprise" property="dealIn"/>

          ? </textarea><br/>

          ? <html:submit value=”提交”/>

          </html:form>

          頁面上顯示的是每一條記錄,用戶編輯修改數(shù)據(jù)提交到后臺,綁定到formBean中,覆蓋原有數(shù)據(jù)。因為表單中沒有主關鍵字段屬性enterprise_id,數(shù)據(jù)提交后就不會改變原有的enterprise_id值, net.newxy.util.FormBeanUtils. createForm(form,httpServletRequest) 方法調(diào)用 DAO 類的 update(Object dto) 方法就會作更新操作。

          (1) 在頁面上為 formBean 選擇第 10 條記錄

          jsp 頁面 <html:form></html:form> 標簽前加入 java 腳本 <%......%>

          <%

          ??? net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);// session 中得到 formBean;

          ??? form.setForm(“9”);

          %>

          (2) 在后臺為 formBean 選擇第 10 條記錄

          public ActionForward? selectRecord(ActionMapping actionMapping, ActionForm actionForm,

          ????????????????????????????? HttpServletRequest httpServletRequest,

          ??????????? HttpServletResponse httpServletResponse) throws Exception{

          ??? ......

          DynaFormBean form=(DynaFormBean)actionForm ;

          form.set(“10”);

          ......

          }

          jsp頁面顯示的便是第10條記錄。用戶可以對其編輯上傳保存到數(shù)據(jù)庫。

          ?

          3、新建插入記錄

          本篇介紹的 數(shù)據(jù)插入: Object update(Object dto) throws Exception 方法表明,如果 dto 不包含主關鍵字段屬性, update(dto) 作插入操作。如果在表單提交數(shù)據(jù)前調(diào)用 net.newxy.faces.DynaFormBean 類的 empty() 方法會清空 formBean 中的數(shù)據(jù),但不清除保留屬性,包括保存了記錄集的屬性 _coll 。這樣用戶得到的頁面表單是空白的。而且提交數(shù)據(jù)后因為已清除了主關鍵字段屬性, Object update(Object dto) throws Exception 方法會作數(shù)據(jù)插入操作。

          (1) jsp 頁面上清空 formBean

          jsp 頁面 <html:form></html:form> 標簽前加入 java 腳本 <%......%>

          <%

          ??? net.newxy.faces.DynaFormBean form=( net.newxy.faces.DynaFormBean)pageContext.getAtribute(“enterprises”,3);// session 中得到 formBean;

          ??? form.empty();

          %>

          (2) 在后臺頁面上清空 formBean

          public ActionForward? selectRecord(ActionMapping actionMapping, ActionForm actionForm,

          ????????????????????????????? HttpServletRequest httpServletRequest,

          ??????????? HttpServletResponse httpServletResponse) throws Exception{

          ??? ......

          DynaFormBean form=(DynaFormBean)actionForm

          form.empty();

          ......

          }

          jsp 頁面顯示的是空白表單,用戶輸入數(shù)據(jù)提交后會作插入操作。

          ?

          ?

          newxy( 新坐標 ) 技術網(wǎng)站: http://www.newxy.net

          posted on 2006-07-08 08:41 newxy新坐標 閱讀(444) 評論(0)  編輯  收藏

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 伊春市| 左权县| 吉木萨尔县| 两当县| 凤庆县| 定兴县| 姚安县| 临安市| 湖南省| 庆阳市| 资中县| 阿克陶县| 奉新县| 合阳县| 瑞安市| 灌南县| 青浦区| 镇雄县| 阜康市| 苗栗市| 海原县| 墨江| 福贡县| 石首市| 黎川县| 米林县| 孝昌县| 铁力市| 平泉县| 陕西省| 安溪县| 长治市| 拉萨市| 饶河县| 忻城县| 南皮县| 新蔡县| 墨竹工卡县| 澜沧| 江华| 伊春市|