如何将 PreparedStatements 列表转换为 addbatch 并立即执行

问题描述 投票:0回答:1

我有一个插入查询,其中的值动态变化但表保持不变。我正在尝试使用 getObject setObject 为这些字段设置值。当我尝试使用 addBatch() 时设置一次。问题是因为 preparedStatement 查询每次都在动态变化,因此以前添加到批处理中的数据没有维护,只有最后一条记录被更新到数据库中。我也尝试每次提交,但如果假设有大量数据,那会花费很长时间。所以我尝试将所有准备好的语句添加到一个列表中,但我不知道如何将这些列表添加到一个批处理中并一次执行它们,我还需要收集执行时失败的记录。

rs = first.executeQuery() /// this query willl fetch data from one table that need to be inserted into another DB
List<String> columns = new ArrayList<>();
ResultSetMetaData metadata = rs.getMetaData() // getting metadata of the resultset
String tablename = metadata.getTableName(1);
List<PreparedStatemnt> list = new ArrayList<>();
while(rs.next()){
for(int i=0;i<= metadata.getColumnCount();i++)
columns.add(metadata.getColumnName(i));
String Query = "Insert into " + tablename + "(" + columns.stream().collect(Collectors.joining(", ") + ") values (" + columns.stream().map(c -> "?").collect(Collectors.joining(", ")) +")";

rs2 = second.prepareStatment(query);
for(int i=0;i<column.size();i++) rs2.setObject(i, rs.getObject(columns.get(i-1)));
rs2.addBatch();  /// this does not maintain the batch history for each itertation and only holds the last.
list.add(rs2) //

不确定如何在此列表上执行批处理 我想在每个查询之后插入可能会很耗时。请帮助我高效地解决问题。

java jdbc java-8 prepared-statement resultset
1个回答
0
投票

如果我理解正确的话,这里有一些代码片段可以帮助你

你只需要创造

    // Create a List of PreparedStatements.
List<PreparedStatement> preparedStatements = new ArrayList<>();

// Create your PreparedStatements and add them to the list.
PreparedStatement ps1 = //your query 1
preparedStatements.add(ps1); //add to the list

PreparedStatement ps2 = //your query 2

preparedStatements.add(ps2); //add to the list

// Execute the batch.
for (PreparedStatement ps : preparedStatements) {
    ps.addBatch();
    
}

preparedStatements.get(0).executeBatch();

// then close connection for each statement
for (PreparedStatement ps : preparedStatements) {
    ps.close();
}
© www.soinside.com 2019 - 2024. All rights reserved.