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版,它包含了运行时所需的动态链接库(DLL)。这个SDK主要是为了支持对DWG文件格式的操作,是...
《AvyL-V3.09插件与电梯调试技术详解》 在现代建筑中,电梯作为不可或缺的垂直交通工具,其稳定性和安全性至关重要。为了确保电梯系统的高效运行,工程师们常常需要借助专业的软件和插件进行调试。本文将重点讨论...
PyYAML-3.09-5.el6.x86_64.rpm
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-...
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-...
实测可用
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小工具V...
【标题】"ZTE_eReader_3.09.210510_lite.zip" 指的是中兴公司推出的电子阅读器软件的一个轻量级版本,版本号为3.09.210510。这个压缩包包含了该软件的安装程序和其他相关文件。 【描述】"ZTE_eReader_3.09.210510_...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
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." 是一款专为三星(Samsung)智能手机设计的刷机工具,用于解决设备在升级或自定义ROM时遇到的问题,特别是当设备“刷机失败”或者被称作“救砖”状态时。 在Android系统中,刷机是指更换手机...
【Odin3 v3.09.3】是一款专为三星(Samsung)智能手机设计的刷机工具,主要用于实现设备的ROOT权限获取、固件升级、系统恢复等高级操作。这款软件在Android爱好者和开发者中非常流行,因为它提供了一个简单易用的界面...
刷机工具,安卓经常用到的刷机工具,简单易用,刷机必备之工具
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
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
ODA开发用于技术图形应用程序的核心平台Teigha™, Teigha支持dwg、dgn、stl、pdf之间的数据交换。Teigha支持的多个平台:Windows、Mac、Unix、Linux等。
1)Platforms\vc10dll\ODA_vc10dll.sln ==> 生成: 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