介绍一种精练通用的体例实现表单数据存储 , |) s1 j- C/ Q! N. c
在WEB应用开发中,良多表单在经由前台浏览器端简单的数据校验后,提交后台处事器,处事器对数据不用作任何措置直接将数据存储到一个数据表中。对这种情形,我们可以只编写一个轨范,对这些表单统一措置,将数据存储到响应的一个数据表中。该体例同样要求数据库系统撑持表结构篡夺和关头字段识别。我们采用JSP手艺编写该轨范,轨范文件取名为DbdataStore.jsp。
. C' h3 M2 M; l! W; i7 Z 1、挪用名目 5 ~& L3 J& ?2 r9 S
在网页中表单的Action挪用体例如下:
9 T8 t4 Z' V4 ] w6 u! C% T <Form Name=Frm1 Method=Post Action="DBdataStore.jsp? tablename=table1&OperType=…"> * t r! G a- E4 `' ]
table1为数据将要存储的数据库表的表名,OperType操作类型分为三种:insert,update,delete。 表单中的<input type=text name=…>,<textarea name=…><select name=…>等中的name值应与数据表的字段名不异,DBdataStore.jsp中一一提取表单提交的对应字段名的数据值,若表单中不决义输入,获得的值为空值,则对该字段不作措置。 2、以oracle为例的视图界说 3 v! M T4 j2 P O
, z" }. F* D( `% `& R
1) 成立表各列数据类型视图 ' A- X! j/ ~% O( N' w( a% f
CREATE OR REPLACE VIEW v_dbstru AS SELECT table_name,column_name,data_type,data_length,data_precision,data_scale,column_id FROM all_tab_columns WHERE owner='user1';//user1为数据表的属主; z! v6 k1 Q- u7 L/ C- u6 Z- c
2) 成立表的关头列视图 3 t; `2 O; k" [ y
CREATE OR REPLACE VIEW v_pkey_column AS SELECT b.table_name,b.column_name,b.position FROM all_constraints a,all_cons_columns b WHERE a.owner=b.owner AND a.constraint_name=b.constraint_name AND a.owner='user1' AND a.constraint_type='P';
! }5 C7 p2 N! w0 h; O5 Q 3、首要轨范代码 2 H+ Y+ X8 f6 d3 Q+ T( N& g
1) 轨范初始化 ( |- Z$ s- b% m* Z! R1 V' o
String tablename=request.getParameter("tablename");//提取表名 String OperType=request.getParameter("OperType");//提取操作类型 String sFieldValue="";//存放表单提交的字段数据值 String fieldname="",Datatype="" //存放字段名,字段数据类型 int iFieldvalue=http://www.qnr.cn/pc/java/fudao/jichu/201004/0;String updateSql="",whereSql=" where ",insSql1="",insSql2="",opSql="",strSql ="";ResultSet rs1=null,rs2=null;insSql1="insert into "+tablename+" (";insSql2="values(";0 y0 g. p( y% K. n
2)生成sql语句关头字段部门
1 V# t" A2 a1 r. @0 U% V4 H 生成insert语句关头字段部门,如:insert into table1(id 和 values(100)); 5 F" a) c/ h8 Z4 R& `
只使用关头字段生成update,delete语句where部门,如:where id=100;
' u6 l1 R% U- ]) W- W. N 在操作类型为update时,网页form表单中不合错误关头字段的数据进行改削。 3 s7 X7 C' \9 T, n0 q$ q
- x. j7 }, C. `rs1=Stmt.executeQuery("SELECT column_name FROM v_pkey_column WHERE table_name='"+tablename+"'");//取关头字段字段名while(rs1.next()){ fieldname=rs1.getString("column_name"); rs2=Stmt.executeQuery("SELECT data_type FROM v_dbstru WHERE table_name='"+tablename+"' AND column_name='"+fieldname+"'");//取关头字段数据类型 if(rs2.next()){Datatype=rs2.getString("data_type");sFieldValue=http://www.qnr.cn/pc/java/fudao/jichu/201004/request.getParameter(fieldname.toLowerCase());//生成insert语句关头字段部门 if(OperType.equals("insert")){ insSql1+=fieldname+","; if((sFieldValue=http://www.qnr.cn/pc/java/fudao/jichu/201004/=null) ){//表单未提交关头字段数据制瘫,本文只按数字型措置,数据值按下一流水号计较。 rs2= Stmt. executeQuery("SELECT max("+fieldname+")+1 FROM "+tablename); rs2. next();iFieldvalue=http://www.qnr.cn/pc/java/fudao/jichu/201004/rs2.getInt(1); insSql2+=Integer.toString(iFieldvalue)+","; }else if(Datatype.equals("DATE")){insSql2+= "To_Date('" + sFieldValue + "','YYYY-MM-DD'),";}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){insSql2+="'" + sFieldValue+"',";}else /*NUMBER,FLOAT */ insSql2+=sFieldValue+",";} //生成update,delete语句where部门:where fieldname=... AND if(OperType.equals("update") || OperType.equals("delete")){ if(Datatype.equals("DATE")){ whereSql+=fieldname+"=To_Date('" + sFieldValue + "','YYYY-MM-DD') AND ";}else if(Datatype.equals("VARCHAR2") || Datatype.equals("CHAR")){whereSql+=fieldname+"='" + sFieldValue+"' AND ";}else /*NUMBER,FLOAT */ whereSql+=fieldname+"="+ sFieldValue+" AND ";} } }whereSql=whereSql.substring(0,whereSql.length()-4); |