结合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、付费专栏及课程。

余额充值