DAO
類
+
通用持久類
+
通用動態
formBean
類,實現數據增、刪、改、查
newxy(
新坐標
)
技術運用之三
?
“DAO類”: net.newxy.dbm.BaseDAO或其子類;
“通用持久類”: net.newxy.dbm.DynaDto;
“通用動態formBean類”: net.newxy.struts_faces.DynaFormBean。
?
《
DAO
類
+
通用持久類,實現數據增、刪、改、查》
(
又名《
不同于hibernate,利用通用持久類實現數據增、刪、改、查,可極大提高開發效率
》
)
文章中介紹的數據增、刪、改、查方法比
hibernate
的方法已簡單很多,如果引入通用動態
formBean
類,開發效率會有更大提高。
?
net.newxy.struts_faces.DynaFormBean
類的類圖
一、利用通用動態formBean類,實現數據增、刪、改
struts
的
ActionServlet
將用戶
submit
來的數據綁定到
net.newxy.struts_faces.DynaFormBean
對象中,在后臺,通過調用
net.newxy.struts_faces.DynaFormBean
的
public Object getDto()
、
public Object get(String name)
方法將上傳的數據提出,
net.newxy.struts_faces.DynaFormBean
起作傳送數據的作用。
(
1
)數據插入:
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)操作。
判斷是更新還是插入操作,可以根據返回的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)數據更新:
舉例:
?
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){
??????? ......
}
......
}
數據更新方法與數據插入方法相同,需注意:如果
dynaDto
中沒有主關鍵字段值,即
dynaDto.get(“id”)==null
,或
dynaDto.get(“id”)
所得主關鍵字段值在表中不存在
,
dao.update(dynaDto)
方法仍然作插入操作。
在進行
dao.update(dynaDto)
前,可以判斷數據是否已存在于表中:
Object masterKey=dynaDto.get(“id”);
Object record=null;
if(masterKey!=null)
record=dao.load(dynaDto);
如果
masterKey==null
或
record==null
,表中不存在該條記錄,
dao.update(dynaDto)
作插入操作,否則該條記錄存在于表中,作更新操作。
那么在
jsp
頁面上如何保證用戶錄入的是新插入數據或是編輯修改的數據呢?參看本文后面部分
在
jsp
頁面上新建、編輯數據
(
3
)數據刪除
舉例:
public ActionForward remove(ActionMapping actionMapping, ActionForm actionForm,
????????????????????????????? HttpServletRequest httpServletRequest,
??????????? HttpServletResponse httpServletResponse) throws Exception{
??????????? ......
??????????? DynaFormBean form=(DynaFormBean)actionForm;
try{
??? //
刪除
formBean
當前數據對應的記錄:
Object record=form.getDto();
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
dynaDto.set_table("table1");//
設置表名,如果上傳數據的
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){
??????? ......
}
......
}
?
二、利用通用動態formBean類,實現多項查詢
??
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中包含了什么數據?下面是jsp頁面表單對上傳數據的組織。
??
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>行業</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">農、林、牧、漁業</html:option>
????????? <html:option value="B">采礦業</html:option>
????????? <html:option value="C">制造業</html:option>
??????? </html:select>
????? </td>
??? </tr>
??? <tr>
????? <td>企業名稱</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>企業地址</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>
該例是對企業表、行業表的連表查詢,查詢的基本條件是industry.code=enterprise.industry_code。
????? industry:行業代碼表
????? industry.code:行業代碼
????? enterprise:企業表
????? enterprise.industry_code:企業的行業代碼
下面是表單中包含的幾個屬性:
(1)_dao
,是DynaFormBean的保留屬性,是DAO類的別名,告訴后臺由哪個DAO類來操作數據。別名在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”關系連接。最后產生的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”關系統組織。
(4)_item開頭的屬性
,這種屬性都以一個數字跟隨其后,這樣的屬性一上傳就有三個。如果在“企業名稱”的<select name=”_item2”>...</select>項選擇“等于”,在<input type=”text” name=”_item2”/>項填入“......公司”,上傳數據后可得到如下字符串數組:
String[] itemValues=request.getParameterValues(“_item2”);
itemValues是三個字符串構成的數組,三個字符串分別是 “a.name” “=” “......公司”,拼這一起可構成”a.name=’......公司’”,它構成查詢條件的一部分。之所以這么解說,是增加對查詢條件構成的理解。可參看
newxy(新坐標)網站
范例的“多項查詢”。
三、
利用通用動態formBean類,
向前臺展現查詢結果
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> <!--行業-->
????? <td><bean:write name="rec" property="name"/></td> <!--企業名稱-->
??? </tr>
? </logic:iterate>
? </table>
</logic:notEmpty>
屬性_coll是通用動態formBean類DynaFormBean的保留屬性,保存了查詢的記錄,類型是List,其元素是
org.apache.commons.beanutils.BasicDynaBean
類型。
???????
四、通用動態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的最后追加一條記錄。同時將索引號指向最后一條。并用最后一條記錄數據填寫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中的數據填寫到以no參數值為索引號的記錄中。
4、public void setForm(java.lang.String?no)
以no參數值為索引號,查找該條記錄,如果存在,將該條記錄數據填入的formBean中,并以no值為索引號。
5、public void setForm(java.lang.Object?dto)
dto為包含數據的javaBean。將該Bean的值填入formBean中。這個javaBean類繼承自net.newxy.dbm.Dto,但在目前版本只介紹formBean類
net.newxy.struts.faces.FormBean
及持久類net.newxy.dbm.Dto,參數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參數值為序號的記錄。
9、public java.lang.Object cloneDto(java.lang.String?no)
以no參數值為索引號,得到這條記錄的克隆
10、public void empty()
將formBean數據清空,但保留屬性不會被清除,包括保存了記錄集的屬性_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頁面上新建、編輯數據
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);
?????????? .
.....
?????? }
?
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/>
? 企業名稱:<br />
? <html:text property="name" size="36"></html:text><br />
? 企業地址:<br />
? <html:text property="address" size="36"></html:text><br />
? 經營范圍:<br/>
? <textarea name="dealIn" cols="36" rows="10">
? <bean:write name="enterprise" property="dealIn"/>
? </textarea><br/>
? <html:submit value=”提交”/>
</html:form>
頁面上顯示的是每一條記錄,用戶編輯修改數據提交到后臺,綁定到formBean中,覆蓋原有數據。因為表單中沒有主關鍵字段屬性enterprise_id,數據提交后就不會改變原有的enterprise_id值,
net.newxy.util.FormBeanUtils.
createForm(form,httpServletRequest)
方法調用
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條記錄。用戶可以對其編輯上傳保存到數據庫。
?
3、新建插入記錄
本篇介紹的
數據插入:
Object update(Object dto) throws Exception
方法表明,如果
dto
不包含主關鍵字段屬性,
update(dto)
作插入操作。如果在表單提交數據前調用
net.newxy.faces.DynaFormBean
類的
empty()
方法會清空
formBean
中的數據,但不清除保留屬性,包括保存了記錄集的屬性
_coll
。這樣用戶得到的頁面表單是空白的。而且提交數據后因為已清除了主關鍵字段屬性,
Object update(Object dto) throws Exception
方法會作數據插入操作。
(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
頁面顯示的是空白表單,用戶輸入數據提交后會作插入操作。
?
?
newxy(
新坐標
)
技術網站:
http://www.newxy.net
posted on 2006-07-08 08:41
newxy新坐標 閱讀(442)
評論(0) 編輯 收藏