|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。本文以Oracle数据库为例,先容了在接纳JSP手艺开辟WEB使用时一种烦琐通用的表双数据存储处置办法,以加重开辟事情量,同时供应了次要的程序代码。J2EE(Java2EnterpriseEdition)手艺已普遍使用在Web使用开辟中,个中的JavaBean、Servlet手艺为开辟者供应了更加明晰的开辟情况,利用JSP手艺体现页面,利用Servlet手艺完成大批的营业处置,利用Bean来存储数据及一些营业处置。在WEB使用中,营业数据存储到数据库中的处置事情常常很沉重,个中一种次要的情势就是表双数据存储到数据库,全部使用处置历程扳连到大批的这类数据存储操纵,对每一个表单都要独自编写响应的数据存储程序,消费了开辟职员大批的工夫和精神。接纳甚么办法来加重表双数据存储的开辟事情量是值得研讨的成绩。
两种罕见的表双数据存储处置办法
1、对每表单都编写响应的程序代码
在JSP页面或JavaBean或Servlet中,利用request.getparameter()函数一一提取表单提交的数据,或编写响应的JavaBean,利用setProperty办法将数据主动取到JavaBean中,然后天生SQL语句(insert,update,delete),最初实行executeupdate()函数完成数据表存储。
2、对每数据表主动天生一个JavaBean程序代码
数据库体系必需撑持用户可以读取表布局,并辨认关头字段。使用面向对象疾速开辟工具,如PowerBuilder、Delphi等,自行开辟一个java代码主动天生程序。在该程序中读取数据库表的布局:字段名、数据范例、数据长度,主动天生一个JavaBean代码。在该代码中界说与表中字段对应的同名变量,创建一切变量的setValue和getValue办法,创建insert、update、delete函数分离处置insert、update、delete的SQL语句天生和实行。
在表单提交的数据处置页面中,编写以下代码,将表双数据存储到JavaBean中:
<jsp:useBeanid="table"class="table1_bean"/>
<jsp:setPropertyname="table"property="*"/>
(注:table1_bean为上述主动天生的对应某一个表的JavaBean)
然后挪用table1_bean中insert、update、delete函数完成数据表存储,并前往实行了局。如:
<%booleansuccess=table.insert();%>
第一种办法复杂直不雅,但对每表单都必要编写响应的数据处置程序。对略微年夜一点的使用,表双数量大概良多,开辟事情量很年夜,开辟事情效力低。表布局变化如增添、削减字段时,需修正响应的数据处置程序。
第二种办法绝对第一种烦琐很多,每数据表的数据处置由对应的JavaBean完成,JavaBean主动天生,不需编写,表布局变化时只需从头天生新的JavaBean,经java编译后掩盖原java类便可。但该办法必要开辟JavaBean主动天生程序,表布局变化时JavaBean必要从头天生和编译。
先容一种烦琐通用的办法完成表双数据存储
在WEB使用开辟中,良多表单在经由前台扫瞄器端复杂的数据校验后,提交背景服务器,服务器对数据不必作任那边理间接将数据存储到一个数据表中。对这类情形,我们能够只编写一个程序,对这些表单一致处置,将数据存储到响应的一个数据表中。该办法一样请求数据库体系撑持表布局读取和关头字段辨认。我们接纳JSP手艺编写该程序,程叙文件取名为DbdataStore.jsp。
1、挪用格局
在网页中表单的Action挪用办法以下:
<FormName=Frm1Method=PostAction="DBdataStore.jsp?tablename=table1&OperType=…">
table1为数据将要存储的数据库表的表名,OperType操纵范例分为三种:insert,update,delete。
表单中的<inputtype=textname=…>,<textareaname=…><selectname=…>等中的name值应与数据表的字段名不异,DBdataStore.jsp中一一提取表单提交的对应字段名的数据值,若表单中不决义输出,失掉的值为空值,则对该字段不作处置。
2、以oracle为例的视图界说
1)创建表各列数据范例视图
CREATEORREPLACEVIEWv_dbstruASSELECTtable_name,column_name,data_type,data_length,data_precision,data_scale,column_id
FROMall_tab_columnsWHEREowner=user1;//user1为数据表的属主。
2)创建表的关头列视图
CREATEORREPLACEVIEWv_pkey_columnAS
SELECTb.table_name,b.column_name,b.position
FROMall_constraintsa,all_cons_columnsb
WHEREa.owner=b.ownerANDa.constraint_name=b.constraint_nameANDa.owner=user1 ANDa.constraint_type=P;
3、次要程序代码
1)程序初始化
Stringtablename=request.getParameter("tablename");//提取表名
StringOperType=request.getParameter("OperType");//提取操纵范例
StringsFieldValue="";//寄存表单提交的字段数据值
Stringfieldname="",Datatype=""//寄存字段名,字段数据范例
intiFieldvalue=0;
StringupdateSql="",whereSql="where",insSql1="",insSql2="",opSql="",strSql="";
ResultSetrs1=null,rs2=null;
insSql1="insertinto"+tablename+"(";
insSql2="values(";
2)天生sql语句关头字段部分
天生insert语句关头字段部分,如:insertintotable1(id和values(100));
只利用关头字段天生update,delete语句where部分,如:whereid=100;
在操纵范例为update时,网页form表单中不合错误关头字段的数据举行修正。
rs1=Stmt.executeQuery("SELECTcolumn_nameFROMv_pkey_columnWHEREtable_name="+tablename+"");
//取关头字段字段名
while(rs1.next()){
fieldname=rs1.getString("column_name");
rs2=Stmt.executeQuery("SELECTdata_typeFROMv_dbstruWHERE table_name="+tablename+"
ANDcolumn_name="+fieldname+"");//取关头字段数据范例
if(rs2.next()){
Datatype=rs2.getString("data_type");
sFieldValue=request.getParameter(fieldname.toLowerCase());
//天生insert语句关头字段部分
if(OperType.equals("insert")){
insSql1+=fieldname+",";
if((sFieldValue==null)){
//表单未提交关头字段数据值时,本文只按数字型处置,数据值按下一流水号盘算。
rs2=Stmt.executeQuery("SELECTmax("+fieldname+")+1FROM"+tablename);
rs2.next();iFieldvalue=rs2.getInt(1);insSql2+=Integer.toString(iFieldvalue)+",";
}elseif(Datatype.equals("DATE")){
insSql2+="To_Date("+sFieldValue+",YYYY-MM-DD),";
}elseif(Datatype.equals("VARCHAR2")Datatype.equals("CHAR")){
insSql2+=""+sFieldValue+",";}
else/*NUMBER,FLOAT*/insSql2+=sFieldValue+",";}
//天生update,delete语句where部分:wherefieldname=...AND
if(OperType.equals("update")OperType.equals("delete")){
if(Datatype.equals("DATE")){
whereSql+=fieldname+"=To_Date("+sFieldValue+",YYYY-MM-DD)AND";
}elseif(Datatype.equals("VARCHAR2")Datatype.equals("CHAR")){
whereSql+=fieldname+"="+sFieldValue+"AND";}
else/*NUMBER,FLOAT*/whereSql+=fieldname+"="+sFieldValue+"AND";}
}
}
whereSql=whereSql.substring(0,whereSql.length()-4);
3)非关头字段部分sql语句天生
update语句,如:updatetable1setcolumn1=value1,…whereid=100
insert语句,如:insertintotable1(id,column1,…)values(100,value1,…)
updateSql="update"+tablename+"set";
strSql="SELECTcolumn_name,data_type,data_length,data_precision,data_scaleFROM
v_dbstrua"+"wheretable_name="+tablename+"
ANDa.column_namenotin(SELECT
b.column_nameFROMv_pkey_columnbwhereb.table_name=a.table_name)";
rs1=Stmt.executeQuery(strSql);//取非关头字段字段名和数据范例
while(rs1.next()){
fieldname=rs1.getString("column_name");Datatype=rs1.getString("data_type");
sFieldValue=request.getParameter(fieldname.toLowerCase());
//若表单未提交该字段的值,则疏忽该字段的处置
if((sFieldValue!=null)){
//天生insert语句=insSql1+insSql2即insertintotablename(…和values(…
if(OperType.equals("insert")){insSql1+=fieldname+",";
if(Datatype.equals("DATE")){
insSql2+="To_Date("+sFieldValue+",YYYY-MM-DD),";
}elseif(Datatype.equals("VARCHAR2")Datatype.equals("CHAR")){
insSql2+=""+sFieldValue+",";}else/*NUMBER,FLOAT*/insSql2+=sFieldValue+",";}
//天生update语句=updateSql+whereSql即updatetablenameset...where
fieldname=...if(OperType.equals("update")){
if(Datatype.equals("DATE")){
updateSql+=fieldname+"=To_Date("+sFieldValue+",YYYY-MM-DD),";
}elseif(Datatype.equals("VARCHAR2")Datatype.equals("CHAR")){
updateSql+=fieldname+"="+sFieldValue,1}+",";}else/*NUMBER,FLOAT*/
updateSql+=fieldname+"="+sFieldValue+",";}))
rs1.close();
4)天生完全的sql语句并实行
if(OperType.equals("insert"))
opSql=insSql1.substring(0,insSql1.length()-1)+")"+insSql2.substring(0,insSql2.length()-1)+")";
if(OperType.equals("update"))
opSql=updateSql.substring(0,updateSql.length()-1)+""+whereSql;if(OperType.equals("delete"))
opSql="deleteFROM"+tablename+""+whereSql;
//已天生完全的sql语句opSql
try{sqlnrows=Stmt.executeUpdate(opSql);}
catch(SQLExceptione){out.println("SQLException:
"+opSql);}
4、特性
该办法对一切这类间接存储的表单都一致利用本程序,具有通用性,不用对每一个表单或每一个数据表自力开辟响应程序,开辟事情量十分少,挪用也十分烦琐。同时,在表布局变化时,不必修正DBdataStore.jsp程序。本程序也可改写为Servelet,挪用格局为<FormName=Frm1Method=PostAction="DBdataStoreServelet?tablename=table1&OperType=…">。
停止语
在Web使用中,假如表双数据在提交后,还必要服务器背景作进一步的数据校验或处置,则必要接纳第二种办法。但良多情形是用户在表单中输出或修正数据,在前台扫瞄器端利用javascript对数据举行复杂校验或处置,然后提交,在背景服务器端不作任那边理,间接将表单提交的数据存储到数据库的一个表中。这时候候接纳第三种办法十分烦琐,能够年夜年夜加重开辟职员的事情量。
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。 |
|