`
Java_Fan
  • 浏览: 81704 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    Teigha TX-SDK-3.09.10 + 运行时动态库bin.rar ##

    标题中的"Teigha TX-SDK-3.09.10 + 运行时动态库bin.rar"指的是Teigha技术开发套件(TX-SDK)的一个版本,具体为3.09.10版,它包含了运行时所需的动态链接库(DLL)。这个SDK主要是为了支持对DWG文件格式的操作,是...

    AvyL-V3.09.zip

    《AvyL-V3.09插件与电梯调试技术详解》 在现代建筑中,电梯作为不可或缺的垂直交通工具,其稳定性和安全性至关重要。为了确保电梯系统的高效运行,工程师们常常需要借助专业的软件和插件进行调试。本文将重点讨论...

    PyYAML-3.09-5.el6.x86_64.rpm

    PyYAML-3.09-5.el6.x86_64.rpm

    openstack安装包(二)

    python-yaml-3.09-3.el6.rf.x86_64.rpm pytz-2010h-2.el6.noarch.rpm pyxattr-0.5.0-1.el6.x86_64.rpm qemu-img-0.12.1.2-2.415.el6_5.8.x86_64.rpm qemu-kvm-0.12.1.2-2.415.el6_5.8.x86_64.rpm qpid-cpp-client-...

    openstack安装包(一)

    python-yaml-3.09-3.el6.rf.x86_64.rpm pytz-2010h-2.el6.noarch.rpm pyxattr-0.5.0-1.el6.x86_64.rpm qemu-img-0.12.1.2-2.415.el6_5.8.x86_64.rpm qemu-kvm-0.12.1.2-2.415.el6_5.8.x86_64.rpm qpid-cpp-client-...

    ftpserver-3.09.jar

    实测可用

    Teigha_NET_SDK_3.09.10

    8. RecomputeDimBlock_3.09_10.tx - 可能与重新计算尺寸块有关,尺寸块在AutoCAD中是可重用的、包含尺寸的图块,这个文档可能解释了如何动态更新这些尺寸。 9. libidn-11.dll - 这是一个与国际域名(IDN)处理相关的...

    联想工程师专用小工具 windows小工具V3.09.1

    联想工程师专用小工具 windows小工具V3.09.1联想工程师专用小工具 windows小工具V3.09.1联想工程师专用小工具 windows小工具V3.09.1联想工程师专用小工具 windows小工具V3.09.1联想工程师专用小工具 windows小工具V...

    ZTE_eReader_3.09.210510_lite.zip

    【标题】"ZTE_eReader_3.09.210510_lite.zip" 指的是中兴公司推出的电子阅读器软件的一个轻量级版本,版本号为3.09.210510。这个压缩包包含了该软件的安装程序和其他相关文件。 【描述】"ZTE_eReader_3.09.210510_...

    rh-perl524-perl-Thread-Queue-3.09-379.el7.noarch.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    opam-repository-master.zip

    opam-repository-master.zip ocaml-4.02.3 源码 Objective Caml(OCaml)是Caml编程语言的主要实现 截至2017.11.14 ocaml最新稳定版本 md5: 356b2f7587a3d0255e4c110b46207370 大小:12.3 MB

    Odin3 v3.09.3.

    【标题】"Odin3 v3.09.3." 是一款专为三星(Samsung)智能手机设计的刷机工具,用于解决设备在升级或自定义ROM时遇到的问题,特别是当设备“刷机失败”或者被称作“救砖”状态时。 在Android系统中,刷机是指更换手机...

    Odin3 v3.09.3

    【Odin3 v3.09.3】是一款专为三星(Samsung)智能手机设计的刷机工具,主要用于实现设备的ROOT权限获取、固件升级、系统恢复等高级操作。这款软件在Android爱好者和开发者中非常流行,因为它提供了一个简单易用的界面...

    Odin3 v3.09.exe

    刷机工具,安卓经常用到的刷机工具,简单易用,刷机必备之工具

    TX_SDK_3.09.1.0.part3 共 part3

    Teigha — C++ development environment with full support for .dwg, .dxf, and .dgn files, a powerful object-oriented C++ API, and a rich feature set for editing, manipulating and ...TX_SDK_3.09.1.0

    TX_SDK_3.09.0.0.part02.rar

    Teigha — C++ development environment with full support for .dwg, .dxf, and .dgn files, a powerful object-oriented C++ API, and a rich feature set for editing, manipulating and ...TX_SDK_3.09.0.0

    nsis-3.09-setup

    nsis-3.09-setup

    TeighaViewer_vc10dll_3.09.1.msi

    ODA开发用于技术图形应用程序的核心平台Teigha™, Teigha支持dwg、dgn、stl、pdf之间的数据交换。Teigha支持的多个平台:Windows、Mac、Unix、Linux等。

    TX_SDK_3.09.10 + 运行时动态库bin.rar

    1)Platforms\vc10dll\ODA_vc10dll.sln ==&gt; 生成: TD_ExamplesCommon.lib 2)TD_FLAGS = -D_TOOLKIT_IN_DLL_ TD_INCLUDE = -I$(TD_BASE)\TD\Include...3)运行时dll在bin.rar或者安装TeighaViewer_vc10dll_3.09.1.msi

Global site tag (gtag.js) - Google Analytics