如何将表从一个数据库复制到另一个数据库?

我需要从一个数据库中取一个表并将其上传到另一个数据库。 所以,我创建了两个单独的连接。 这是我的代码

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(); 

以上最后一行不起作用我该怎么做? 底线是如何重用ready结果集

ResultSet是一个现成的java对象。 我希望有一种方法可以将它添加到批处理或类似的东西和executeUpdate但不能将结果集写入某个临时空间( Listcsv等)和插入

最简单的方法是使用插入的预准备语句 。 它允许您创建单个语句对象,该对象可用于使用不同的参数值多次运行查询。

 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(); } } } 

当您遍历table1的结果时,行将插入到table2中,因此无需存储整个结果集。

您还可以使用addBatch()准备语句的addBatch()executeBatch()方法对所有插入进行排队,并将它们一次性发送到数据库,而不是为每个插入的行向数据库发送单独的消息。 但这迫使JDBC在本地保存所有挂起的内存,这似乎是你试图避免的。 因此,在这种情况下,一次一行插入是最好的选择。

如果您不想手动列出数据库中每个表的所有字段名称,则应该能够执行以下两步操作:

  1. 使用此问题中的答案复制表架构。
  2. 使用resultSet.getMetaData()获取字段列表,并使用它来在@ Wyzard的答案中驱动SELECT / INSERT代码的修改版本。

如果我开始工作,我会在这里发布代码。