结合jQueryForm-3.09.js 、jdbc metadata、java reflection 统一更新数据实现方案

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 的方式也可以获取数据库元数据,具体项目具体对待吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值