Java 如何根据列值的类型使PreparedStatement.setXXX()动态

Java 如何根据列值的类型使PreparedStatement.setXXX()动态,java,jdbc,Java,Jdbc,我必须使用包含所有行的数据文件中的值更新表。现在我正在使用JDBC批处理。数据文件包含100列和数百万行 例如,数据文件包含3列两行,使其更简单 1,ABC,DEF 2.GHI,JKL PreparedStatement pstmt = connection.prepareStatement(insert); //how to find type pstmt.setInt(1, 2); pstmt.

我必须使用包含所有行的数据文件中的值更新表。现在我正在使用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();
现在我的问题是,在运行时,基于数据文件中的数据,我如何发现我需要调用
setInt
setString
,更重要的是,我需要为该
addBatch()
调用
setXXX
多少次。似乎对于每个表,我都需要有专门的preparedStatements。更重要的是,我需要根据数据文件中的列数确定在运行时调用setObject的次数?有什么方法可以让这个通用的吗


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

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

这个
PreparedStatement
有一个方法
setObject(int,Object)
。文件说明

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

如果您有一个SQL语句,如

Select * From table Where value1 = ? and value2 = ?
您必须调用
setXXX
方法两次。它们用于为
PreparedStatement
实例表示的SQL语句指定通配符值(标记为ny
)。因此,调用的数量取决于变量
insert
引用的SQL语句。
setXXX
方法的
int
参数引用变量在SQL语句中的位置,其中
setXXX(1,object)
引用第一个通配符,依此类推


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

您可以使用下面的代码片段。有关更多详细信息,请查看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) );
    }
}
PreparedStatement=connection.preparetstatement(查询);
ResultSetMetaData rsmd=rs.getMetaData();
while(rs.next())
{    

对于(int i=1;i),您仍然需要生成类似于“插入表(column1,column2,….columnX)值(?,,,…)的查询。您是否为每个数据文件生成特定的查询?我知道您需要一种通用的方法将数据插入表中,而不必在代码中使用固定的查询,这就是您需要的吗?是的@Martin您做得对。我需要一些具有动态查询的通用解决方案,这对于不同的文件是不同的。好吧,似乎Casey已经为您提供了您需要的第一部分,然后您只需要生成插入查询,以计算字段的数量…问题是您不会进行任何验证,对您的问题的正确回答将在很大程度上取决于您的要求。。。