4

我必须使用包含所有行的数据文件中的值来更新表。现在我正在使用 JDBC 批处理。数据文件包含 100 列和数百万行。

例如,数据文件包含 3 列两行以使其简单

1,ABC,DEF
2.GHI,JKL

PreparedStatement pstmt = connection.prepareStatement(insert);
                //how to find type
                pstmt.setInt(1, 2);
                pstmt.setString(2, "GHI");
                pstmt.setString(3, "JKL");
                pstmt.addBatch();
                pstmt.executeBatch();

现在我的问题是在运行时基于来自数据文件的数据我如何发现我需要调用setIntsetString更重要的是我需要调用多少setXXXaddBatch()。这似乎对于每个表我都需要有专门的preparedStatements。更重要的是,我需要根据数据文件中的列数找出我应该在运行时调用 setObject 多少次?无论如何我可以使这个通用吗?

我是 JDBC 新手,请指导。提前致谢。

4

3 回答 3

8

您可以使用 setObject(int index, Object obj)。然后 JDBC 确定正确的类型。

于 2013-07-05T08:45:09.890 回答
0

PreparedStatement一个方法setObject(int, Object)。该文件指出

如果需要任意参数类型转换,则方法 setObject 应与目标 SQL 类型一起使用。

如果您有类似的 SQL 语句

Select * From table Where value1 = ? and value2 = ?

你必须调用这些setXXX方法两次。它们用于为实例表示?的 SQL 语句指定通配符值(标记为 ny ) 。PreparedStatement因此,调用次数取决于变量引用的 SQL 语句insert。方法的int参数是setXXX指变量在 SQL 语句中的位置,setXXX(1, object)指的是第一个通配符,依此类推。

当然,您必须setXXX为每个查询重复相同数量的调用,以便在最后添加要执行的批处理。

于 2013-07-05T08:48:38.717 回答
-1

您可以使用如下代码段。检查 statement.setObject 文档以获取更多详细信息。下面片段中的“rs”是通过从一个表中执行一些查询获得的结果集。以下片段中的“查询”是一些插入或更新查询到不同的表。下面的示例说明从一个表中选择并插入到另一个表中,同时动态识别列类型。注意:表列类型应该匹配,否则会抛出异常。

PreparedStatement statement = connection.prepateStatement( query );
ResultSetMetaData rsmd = rs.getMetaData();
while( rs.next() )
{    
    for( int i = 1 ; i <= rsmd.getColumnCount() ; i++ )
    {
        statement.setObject( i, rs.getObject(i), rsmd.getColumnType(i) );
    }
}
于 2016-08-18T10:06:08.453 回答