PreparedStatement 插入数据的问题

PreparedStatement,在插入一组数据时,哪个方法能自动判断插入的数据类型和数据库中的匹配呢?谢谢
比如插入字符串是setString(i, Sql);
语句是insert into (表名)(a,b,c)values(?,?,?)

我想说的是,“?”在使用setString()方法时,如果传入的值多,想做一个for循环自动插进去,插的过程中自己判断数据类型。谢谢

6个回答

        用setObject, 可以参考spring源代码StatementCreatorUtils

        if (isStringValue(inValue.getClass())) {
            ps.setString(paramIndex, inValue.toString());
        }
        else if (isDateValue(inValue.getClass())) {
            ps.setTimestamp(paramIndex, new java.sql.Timestamp(((java.util.Date) inValue).getTime()));
        }
        else if (inValue instanceof Calendar) {
            Calendar cal = (Calendar) inValue;
            ps.setTimestamp(paramIndex, new java.sql.Timestamp(cal.getTime().getTime()), cal);
        }
        else {
            // Fall back to generic setObject call without SQL type specified.
            ps.setObject(paramIndex, inValue);
        }


            /**
 * Check whether the given value can be treated as a String value.
 */
private static boolean isStringValue(Class<?> inValueType) {
    // Consider any CharSequence (including StringBuffer and StringBuilder) as a String.
    return (CharSequence.class.isAssignableFrom(inValueType) ||
            StringWriter.class.isAssignableFrom(inValueType));
}

/**
 * Check whether the given value is a {@code java.util.Date}
 * (but not one of the JDBC-specific subclasses).
 */
private static boolean isDateValue(Class<?> inValueType) {
    return (java.util.Date.class.isAssignableFrom(inValueType) &&
            !(java.sql.Date.class.isAssignableFrom(inValueType) ||
                    java.sql.Time.class.isAssignableFrom(inValueType) ||
                    java.sql.Timestamp.class.isAssignableFrom(inValueType)));
}
u014416842
u54782509 回复wuruize888: setString 替换成setObject
3 年多之前 回复
u014353911
wuruize888 还是有点不明白,能写完整些吗
3 年多之前 回复

自动判断类型不行,需要人工对应上或者用工具读取数据库meta信息后生成对应的类型语句,如codeSmith可以读取数据库meta,然后生成你定义好模板后会自动生成代码,楼主可以研究下这个,建立实例类和代码插入模型

数据库表转为C#类模型

好像没有,但是有一种就是泛型,对数据进行检查,约束的。专门防范这种问题的。若有不对,请多指教。

让程序自动判断?你不认为这样效率很低?程序实现应该没有问题

首先,编程过程中你自己应该知道每个参数的类型而选择核实的方法来设置每个参数的。
其次,如果不匹配,运行时会报运行时异常的。

参数位置i实际是可以对应任何字段的,客户端操作完全提交到数据库执行的时候才知道类型。
这个思路反过来,sql和操作的java代码都用工具生成,生成的时候就把类型做进去。复杂sql在这个基础上改,类型也是可以检查的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐