1.针对更新页面表单到数据库,首先利用jQueryForm-3.09.js取到页面表单的所有属性值;
jQueryForm-3.09.js是依赖于jquery.js,所以千万别忘了在jsp页面引入这两个js;
js代码:
var formStr = $('#frmNPatrol').formSerialize();
获取到的formStr的格式:byqrl=945&ygz=154931&......
如此即可以通过页面form的id获取form表单的所有属性值,再通过$.ajxa()方法将数据传递到后台,我这里是通过struts.x的action方法中获取的,就不写出来了,别的框架或者servlet都是大同小异;
2.既然更新表,那么必然需要这张表的数据库主键值,需要提供表名、主键值和数据表所对应的实体类对象;
业务方法:
/**
* 更新任意表单数据到数据库
* @paramformStr表单数据字符串(格式:byqrl=945&ygz=154931&......)
* @paramtableName表单对应的数据库表名
* @paramformObj表单对象
* @parampkValue主键值
* @throwsSQLException
*/
public void updateFormData2DB(String formStr, StringtableName,Object formObj,String pkValue)throws SQLException{
try {
Map map = new HashMap();
String[] fieldsArr = formStr.split("&");
for(int i=0;i<fieldsArr.length;i++){
String fieldInfo = fieldsArr[i];
String[] fieldArr = fieldInfo.split("=");
String fieldValue = "";
String fieldKey = fieldArr[0];
if(fieldArr.length==2){
fieldValue = URLDecoder.decode(fieldArr[1],"utf-8");
}else{
fieldValue = "";
}
Class clzz = formObj.getClass();
Field[] fields = clzz.getDeclaredFields();
for(int j=0 ;j<fields.length;j++){
String fieldObj = fields[j].toString().substring(fields[j].toString().lastIndexOf(".")+1);
if(fieldObj.equals(fieldKey)){
Field field = fields[j];
Class clazz = field.getType();
Object newFieldValue = newFieldsTypeConduct().judgeFieldType(clazz.toString(), fieldValue.trim());
map.put(fieldKey.toUpperCase(),newFieldValue);
}
}
}
workFlowStartDao.updateFormData2DB( tableName, map, pkValue);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
3.数据库访问方法:
/**
* 更新任意表单数据到数据库
* @paramtableName表单对应的数据库表名
* @parammap表单属性键值对
* @parampkValue主键值
* @throwsSQLException
*/
public void updateFormData2DB(String tableName,Map map,StringpkValue) throws SQLException{
JdbcTemplate jdbcTemplate = this.getJdbcTemplate();
try{
Connection conn =jdbcTemplate.getDataSource().getConnection();
DatabaseMetaData metaData = conn.getMetaData();
// 取主键名
String pk_column = "";
ResultSet pkInfo =metaData.getPrimaryKeys(null,null, tableName.toUpperCase());
while(pkInfo.next()){
pk_column =pkInfo.getString("COLUMN_NAME"); }
String setContent = "";
Iterator keyIter =map.keySet().iterator();
while(keyIter.hasNext()){
Object key = keyIter.next();
String value =map.get(key).toString();
//如果用到了sql中的函数方法,则不要用‘’括起来
if(value.indexOf("to_char")!=-1 || value.indexOf("to_date")!=-1 || value.indexOf("to_timestamp")!=-1){
setContent += key.toString()+"="+value+",";
}else{
setContent += key.toString()+"='"+value+"',";
}
}
setContent =setContent.substring(0, setContent.length()-1);
//example:UPDATE Person SET Address = 'Zhongshan 23',City = 'Nanjing' WHERE LastName = 'Wilson'
String sql = "update "+tableName+" set "+setContent+"where "+pk_column+"= '"+pkValue+"'" ;
jdbcTemplate.update(sql);
}catch(Exception e){
e.printStackTrace();
}
}
4.附:
业务方法中调用的属性类型判断处理的类:
package com.adam.dev.utils;
public class FieldsTypeConduct {
public FieldsTypeConduct() {
super();
}
/**
* 处理类的属性值,并返回
* @paramfieldType 属性类型
* @paramfieldValue属性值
* @return
*/
public ObjectjudgeFieldType(String fieldType,String fieldValue){
Object newFieldValue = null;
//char
if(fieldType.equals("char")){
newFieldValue = fieldValue+"";
}
//int
if(fieldType.equals("int")){
newFieldValue = Integer.parseInt(fieldValue)+"";
}
//class java.lang.Integer
if(fieldType.equals("class java.lang.Integer")){
newFieldValue = new Integer(fieldValue).toString();
}
//float
if(fieldType.equals("float")){
newFieldValue = Float.parseFloat(fieldValue)+"";
}
//class java.lang.Float
if(fieldType.equals("class java.lang.Float")){
newFieldValue = new Float(fieldValue).toString();
}
//double
if(fieldType.equals("double")){
newFieldValue = Double.parseDouble(fieldValue)+"";
}
//class java.lang.Double
if(fieldType.equals("class java.lang.Double")){
newFieldValue = new Double(fieldValue)+"";
}
//long
if(fieldType.equals("long")){
newFieldValue = Long.parseLong(fieldValue)+"";
}
//class java.lang.Long
if(fieldType.equals("class java.lang.Long")){
newFieldValue = new Long(fieldValue)+"";
}
//class java.lang.String
if(fieldType.equals("class java.lang.String")){
newFieldValue = fieldValue+"";
}
//class java.sql.Timestamp
if(fieldType.equals("class java.sql.Timestamp")){
//newFieldValue =java.sql.Timestamp.valueOf(fieldValue);
if(fieldValue.length()==7){
newFieldValue = "to_timestamp('"+fieldValue+"-0100:00:00.00','YYYY-mm-dd HH24:mi:ss.ff')";
}else if(fieldValue.length()==10){
newFieldValue = "to_timestamp('"+fieldValue+"00:00:00.00','YYYY-mm-dd HH24:mi:ss.ff')";
}else if(fieldValue.length()==16){
newFieldValue = "to_timestamp('"+fieldValue+":00.00','YYYY-mm-ddHH24:mi:ss.ff')";
}else if(fieldValue.length()==19){
newFieldValue = "to_timestamp('"+fieldValue+".00','YYYY-mm-ddHH24:mi:ss.ff')";
}else if(fieldValue.length()>19){
newFieldValue = "to_timestamp('"+fieldValue+"','YYYY-mm-ddHH24:mi:ss.ff')";
}
}
//class java.sql.Date
if(fieldType.equals("class java.sql.Date")){
//newFieldValue =java.sql.Date.valueOf(fieldValue);
if(fieldValue.length()==7){
newFieldValue = "to_date('"+fieldValue+"','YYYY-mm')";
}else if(fieldValue.length()==10){
newFieldValue = "to_date('"+fieldValue+"','YYYY-mm-dd')";
}else if(fieldValue.length()==16){
newFieldValue = "to_date('"+fieldValue+"','YYYY-mm-ddHH24:mi')";
}else if(fieldValue.length()==19){
newFieldValue = "to_date('"+fieldValue+"','YYYY-mm-ddHH24:mi:ss')";
}
}
//class java.util.Date
if(fieldType.equals("class java.util.Date")){
/*
if(fieldValue.indexOf("-")>0){
fieldValue = fieldValue.replaceAll("-","/");
}
newFieldValue = new Timestamp(newjava.util.Date().parse(fieldValue));
*/
newFieldValue = "to_date('"+fieldValue+"','YYYY-mm-dd')";
}
return newFieldValue;
}
}
这样就提供了一种针对任何的表单进行更新的方案,那么针对任何的表单统一的插入方案应该也有眉目了吧。
数据访问层用到了spring 的JdbcTemplate获取的数据库元数据,如果你用的其它的框架或者纯jdbc 的方式也可以获取数据库元数据,具体项目具体对待吧!