实现通用的PreparedStatement插入记录的方法

        准确的说是实现通用的PreparedStatement通配符对应的赋值方法。在合成PreparedStatement插入语句、找到SQL字段类型与Java类的对应关系之后,就可以实现通用的PreparedStatement插入数据的方法了。

        在实现通用的PreparedStatement插入记录的方法过程中,JadePool已经解决好了以下的现实需求:

        1、支持不同的数据类型的表单录入,除了流文件类型外,其它任何类型的数据均可以用字符串的形式表达;
        2、支持图片、多媒体等所有流文件的录入;
        3、支持主键键值的自动生成;
        4、支持空值录入;
        5、针对不同的数据录入,如有异常,则统一抛出SQLException异常;

        6、拆分条件语句,更精准地表达逻辑,优先安排高频度数据类型进行条件判断;

        7、提供了灵活方便的日期型数据的录入。


        以下是实现PreparedStatement通配符对应的赋值方法的核心代码

            pstmt = con.prepareStatement(preparedStatementInsert);//多记录共享prepareStatement插入语句
            long firstStringKey = (new java.util.Date()).getTime();

            //为了提高运算效率,规定判断条件优先顺序:常用标准条件精确匹配、标准条件精确匹配、非标准条件精确匹配、非标准条件概略匹配、非标准条件概略小写匹配
            for (Map record : listRecord) {

                if (autoInsertKey) {
                    if (tableKeys.length > 0) {
                        Field keyF = db.getField(tableName, tableKeys[0]);
                        if ("java.lang.Long".equals(keyF.getTypeClassName())) {//时间+4位整数
                            record.put(tableKeys[0], db.getTable(tableName).makeLongKeyValue());
                        } else if ("java.lang.String".equals(keyF.getTypeClassName())) {
                            if (Integer.parseInt(keyF.getSize()) > 13) {
                                record.put(tableKeys[0], "" + (firstStringKey + 1));//自动插入字符型主键值//if (className.equals("java.lang.String") && Integer.parseInt(f.getSize()) > 13) 
                            } else {
                                return num;
                            }
                        } else {
                            maxFieldValue = db.getTable(tableName).makeObjectKeyValue(keyF, maxFieldValue);
                            record.put(tableKeys[0], maxFieldValue);//自动插入数值型主键值
                        }
                    } else {
                        Field keyF = db.getField(tableName, tableFields[0]);
                        if ("java.lang.Long".equals(keyF.getTypeClassName())) {//时间+4位整数
                            record.put(tableFields[0], db.getTable(tableName).makeLongKeyValue());
                        } else if ("java.lang.String".equals(keyF.getTypeClassName())) {
                            if (Integer.parseInt(keyF.getSize()) > 13) {
                                record.put(tableFields[0], "" + (firstStringKey + 1));//自动插入字符型主键值//if (className.equals("java.lang.String") && Integer.parseInt(f.getSize()) > 13) 
                            } else {
                                return num;
                            }
                        } else {
                            maxFieldValue = db.getTable(tableName).makeObjectKeyValue(keyF, maxFieldValue);
                            record.put(tableFields[0], maxFieldValue);//自动插入数值型主键值
                        }
                    }
                }

                for (int i = 0; i < fields.length; i++) {
                    Field f = db.getField(tableName, fields[i].toString());
                    String className = f.getTypeClassName();
                    int sqlType = f.getSqlType();
                    Object v = record.get(fields[i].toString());

                    if (v == null) {
                        pstmt.setNull(i + 1, sqlType);//continue;
                    } else if (v != null) {
                        String _c = ((Class) v.getClass()).getName(); //增加对表单数据的支持,在表单中获取的数据均为String型,固应对其进行转换.
                        if ((_c.equals("java.lang.String")) && ("".equals(((String) v).trim()))) {
                            pstmt.setNull(i + 1, sqlType);//continue;
                        } else {
                            if (className.equals("java.lang.String")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setString(i + 1, (String) v);
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Integer")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setInt(i + 1, Integer.parseInt((String) v));
                                } else {
                                    if (_c.equals("java.lang.Integer")) {
                                        pstmt.setInt(i + 1, ((Integer) v).intValue());
                                    } else {
                                        Integer n = new Integer(v.toString());
                                        pstmt.setInt(i + 1, n);
                                    }
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Long")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setLong(i + 1, Long.parseLong((String) v));
                                } else {
                                    if (_c.equals("java.lang.Long")) {
                                        pstmt.setLong(i + 1, ((Long) v).longValue());
                                    } else {
                                        Long l = new Long(v.toString());
                                        pstmt.setLong(i + 1, l);
                                    }
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Short")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setShort(i + 1, Short.parseShort((String) v));
                                } else {
                                    pstmt.setShort(i + 1, ((Short) v).shortValue());
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Float")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setFloat(i + 1, Float.parseFloat((String) v));
                                } else {
                                    pstmt.setFloat(i + 1, ((Float) v).floatValue());
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Double")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setDouble(i + 1, Double.parseDouble((String) v));
                                } else {
                                    pstmt.setDouble(i + 1, ((Double) v).doubleValue());
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Boolean")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setBoolean(i + 1, (Boolean.valueOf((String) v)).booleanValue());
                                } else {
                                    pstmt.setBoolean(i + 1, ((Boolean) v).booleanValue());
                                }
                                continue;
                            }

                            if (className.equals("java.sql.Timestamp")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    String _s = ((String) v).trim();
                                    if (tool.matches(RegexType.chinaDate, _s)) {//如:2012-01-24
                                        Time t = new Time(0l);
                                        _s = _s + " " + t.toString();
                                        pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf(_s));
                                    } else {
                                        pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf((String) v));
                                    }
                                } else if (className.equals("java.sql.Date")) {
                                    java.sql.Date _v = (java.sql.Date) v;
                                    pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
                                } else if (className.equals("java.util.Date")) {
                                    java.util.Date _v = (java.util.Date) v;
                                    pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
                                } else if (className.equals("java.sql.Time")) {
                                    java.sql.Time _v = (java.sql.Time) v;
                                    pstmt.setTimestamp(i + 1, new Timestamp(_v.getTime()));
                                } else {
                                    pstmt.setTimestamp(i + 1, new Timestamp(((java.util.Date) v).getTime()));//能支持更多的应用
                                    //pstmt.setTimestamp(i + 1,  (java.sql.Timestamp) v);//使用jsf日期转换后获得的结果可能不完整,这时会出现转换异常
                                }
                                continue;
                            }

                            if (className.equals("java.sql.Date") || className.equals("java.util.Date")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setDate(i + 1, java.sql.Date.valueOf((String) v));
                                } else if (className.equals("java.util.Date")) {
                                    java.util.Date _v = (java.util.Date) v;
                                    pstmt.setDate(i + 1, new java.sql.Date(_v.getTime()));
                                } else {
                                    pstmt.setDate(i + 1, (java.sql.Date) v);
                                }
                                continue;
                            }

                            if (className.equals("java.sql.Time")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setTime(i + 1, java.sql.Time.valueOf((String) v));
                                } else {
                                    pstmt.setTime(i + 1, (java.sql.Time) v);
                                }
                                continue;
                            }

                            if (className.equals("[B") || className.equals("byte[]")) {
                                //SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setBytes(i + 1, ((String) v).getBytes());
                                } else {
                                    pstmt.setBytes(i + 1, (byte[]) v);
                                }
                                continue;
                            }
                            if (className.equals("java.sql.Blob")) {
                                //SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setBytes(i + 1, ((String) v).getBytes());
                                } else {
                                    pstmt.setBlob(i + 1, (java.sql.Blob) v);
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Object")) {
                                //SQL Server 的image\timestamp\binary类型是byte[],MySQL 的blob系列是java.lang.Object,Sybase的image是[B
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setBytes(i + 1, ((String) v).getBytes());
                                } else {
                                    pstmt.setObject(i + 1, v);
                                }
                                continue;
                            }

                            if (className.equals("java.lang.Byte")) {
                                //MySQL的tinyint是java.lang.Byte
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setByte(i + 1, java.lang.Byte.parseByte((String) v));
                                } else {
                                    pstmt.setByte(i + 1, java.lang.Byte.parseByte(v.toString()));
                                }
                                continue;
                            }

                            if (className.equals("java.math.BigDecimal")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setBigDecimal(i + 1, new BigDecimal((String) v));
                                } else {
                                    pstmt.setBigDecimal(i + 1, (BigDecimal) v);
                                }
                                continue;
                            }

                            //以下部分将根据具体的数据库需要而定,有待验证
                            if (className.equals("java.sql.Clob")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setString(i + 1, (String) v);//给clob类型的字段赋予字符串型
                                } else {
                                    pstmt.setClob(i + 1, (java.sql.Clob) v);
                                }
                                continue;
                            }

                            //以下部分将根据具体的数据库需要而定,有待验证
                            if (className.equals("java.sql.Array")) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    //
                                } else {
                                    pstmt.setArray(i + 1, (java.sql.Array) v);
                                }
                                continue;
                            }

                            //特殊类型,非常用,置后
                            if (className.equals("com.sybase.jdbc2.tds.SybTimestamp") || className.toLowerCase().indexOf("timestamp") > 0) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setTimestamp(i + 1, java.sql.Timestamp.valueOf((String) v));
                                } else {
                                    pstmt.setTimestamp(i + 1, (java.sql.Timestamp) v);
                                }
                                continue;
                            }

                            //概略匹配
                            if (className.toLowerCase().indexOf("date") > 0) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setDate(i + 1, java.sql.Date.valueOf((String) v));
                                } else {
                                    pstmt.setDate(i + 1, new java.sql.Date(((java.util.Date) v).getTime()));
                                }
                                continue;
                            }

                            if (className.toLowerCase().indexOf("time") > 0) {
                                if ((_c.equals("java.lang.String")) && (!"".equals(((String) v).trim()))) {
                                    pstmt.setTime(i + 1, java.sql.Time.valueOf((String) v));
                                } else {
                                    pstmt.setTime(i + 1, (java.sql.Time) v);
                                }
                                continue;
                            }

                            if (_c.equals("java.io.FileInputStream")) {
                                //调用如:FileInputStream in = new FileInputStream("D:\\test.jpg");的结果
                                pstmt.setBinaryStream(i + 1, (FileInputStream) v, ((FileInputStream) v).available());
                                continue;
                            }//java.io.FileInputStream

                            //其它特殊类型,非常用,置后

                        }
                    }
                }
                num = num + pstmt.executeUpdate();
            }




        附:应当实现的PreparedStatement插入记录的赋值方法清单

                            //以下列出所有的PreparedStatement支持的数据类型,大约28个数据类型,近50个方法
                            
                            java.util.Calendar calendar = new GregorianCalendar(2013, 3 - 1, 13);
                            Object value = new Object();
                            int index = 1;
                            int int_sqlType = java.sql.Types.INTEGER;//4
                            int int_scaleOrLength = 4;
                            int bytes_size = 256;
                            int int_length = 10;
                            long long_length = 10l;
                            String str_sqlTypeName = "LONG";
                            pstmt.setArray(index, (java.sql.Array) value);
                            pstmt.setAsciiStream(index, (java.io.InputStream) value);
                            pstmt.setAsciiStream(index, (java.io.InputStream) value, int_length);
                            pstmt.setAsciiStream(index, (java.io.InputStream) value, long_length);
                            pstmt.setBigDecimal(index, (java.math.BigDecimal) value);
                            pstmt.setBinaryStream(index, (java.io.InputStream) value);
                            pstmt.setBinaryStream(index, (java.io.InputStream) value, int_length);
                            pstmt.setBinaryStream(index, (java.io.InputStream) value, long_length);
                            pstmt.setBlob(index, (java.sql.Blob) value);
                            pstmt.setBlob(index, (java.io.InputStream) value);
                            pstmt.setBlob(index, (java.io.InputStream) value, long_length);
                            pstmt.setBoolean(index, (Boolean) value);
                            pstmt.setByte(index, (byte) 30);
                            pstmt.setBytes(index, (byte[]) value);
                            pstmt.setCharacterStream(index, (java.io.Reader) value);
                            pstmt.setCharacterStream(index, (java.io.Reader) value, int_length);
                            pstmt.setCharacterStream(index, (java.io.Reader) value, long_length);
                            pstmt.setClob(index, (java.sql.Clob) value);
                            pstmt.setClob(index, (java.io.Reader) value);
                            pstmt.setClob(index, (java.io.Reader) value, long_length);
                            pstmt.setDate(index, (java.sql.Date) value);
                            pstmt.setDate(index, (java.sql.Date) value, calendar);
                            pstmt.setDouble(index, (java.lang.Double) value);
                            pstmt.setFloat(index, (java.lang.Float) value);
                            pstmt.setInt(index, (java.lang.Integer) value);
                            pstmt.setLong(index, (java.lang.Long) value);
                            pstmt.setNCharacterStream(index, (java.io.Reader) value);
                            pstmt.setNCharacterStream(index, (java.io.Reader) value, 123l);
                            pstmt.setNClob(index, (java.sql.NClob) value);
                            pstmt.setNClob(index, (java.io.Reader) value);
                            pstmt.setNClob(index, (java.io.Reader) value, 123l);
                            pstmt.setNString(index, (String) value);
                            pstmt.setNull(index, int_sqlType);
                            pstmt.setNull(index, int_sqlType, str_sqlTypeName);
                            pstmt.setObject(index, value);
                            pstmt.setObject(index, value, int_sqlType);
                            pstmt.setObject(index, value, int_sqlType, int_scaleOrLength);
                            pstmt.setRef(index, (java.sql.Ref) value);
                            pstmt.setRowId(index, (java.sql.RowId) value);
                            pstmt.setSQLXML(index, (java.sql.SQLXML) value);
                            pstmt.setShort(index, (java.lang.Short) value);
                            pstmt.setString(index, (java.lang.String) value);
                            pstmt.setTime(index, (java.sql.Time) value);
                            pstmt.setTimestamp(index, (java.sql.Timestamp) value);
                            pstmt.setTimestamp(index, (java.sql.Timestamp) value, calendar);
                            pstmt.setURL(index, (java.net.URL) value);
                            pstmt.setUnicodeStream(index, (java.io.InputStream) value, int_length);

        今后的建议
        对于未实现的赋值方法,在需要的时候,可以既有的代码的条件部分加以实现;
        对于未来未知的数据库供应商定义的Java类,如:com.sybase.jdbc2.tds.SybTimestamp,可以参照核心代码的相应部分实现







  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值