我需要从一个数据库中取一个表并将其上传到另一个数据库.所以,我创建了两个单独的连接.这是我的代码
Connection connection1 = // set up connection to dbms1
Statement statement = connection1.createStatement();
ResultSet result = statement.executeQuery("select * from ............. ");
Connection connection2 = // set up connection to dbms2
// Now I want to upload the ResultSet result into the second database
Statement statement2 = connection2.createStatement("insert into table2 " + result);
statement2.executeUpdate();
Run Code Online (Sandbox Code Playgroud)
以上最后一行不起作用我该怎么做?底线是如何重用ready结果集
ResultSet是一个现成的java对象.我希望有一种方法将它添加到批次或这样的事情和executeUpdate,但不写结果集到一些临时空间(List,csv等等),并插入
最简单的方法是使用准备好的插入语句。它允许您创建单个语句对象,该对象可用于使用不同的参数值多次运行查询。
try (final Statement statement1 = connection1.createStatement();
final PreparedStatement insertStatement =
connection2.prepareStatement("insert into table2 values(?, ?)"))
{
try (final ResultSet resultSet =
statement1.executeQuery("select foo, bar from table1"))
{
while (resultSet.next())
{
// Get the values from the table1 record
final String foo = resultSet.getString("foo");
final int bar = resultSet.getInt("bar");
// Insert a row with these values into table2
insertStatement.clearParameters();
insertStatement.setString(1, foo);
insertStatement.setInt(2, bar);
insertStatement.executeUpdate();
}
}
}
Run Code Online (Sandbox Code Playgroud)
table2当您遍历来自 的结果时table1,行会被插入,因此无需存储整个结果集。
您还可以使用准备好的语句addBatch()和executeBatch()方法将所有插入排入队列并将它们一次性发送到数据库,而不是为每个单独的插入行向数据库发送单独的消息。但这会迫使 JDBC 将所有挂起的插入保存在本地内存中,这似乎是您试图避免的。因此,在这种情况下,一次一行插入是您最好的选择。