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

Java 如何将表从一个数据库复制到另一个数据库?,java,resultset,Java,Resultset,我需要从一个数据库中获取一个表并将其上载到另一个数据库。 所以,我创建了两个独立的连接。这是我的密码 Connection connection1 = // set up connection to dbms1 Statement statement = connection1.createStatement(); ResultSet result = statement.executeQuery("select * from ............. "); Connection con

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

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();
以上最后几行不起作用 我该怎么做?底线是如何重用现成的结果集


ResultSet是一个现成的java对象。我希望有一种方法可以将它添加到批处理或类似的东西中,并执行更新,但不要将结果集写入某个临时空间(
列表
csv
等),而insert

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

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();
        }
    }
}
当您遍历来自
表1
的结果时,这些行被插入到
表2
,因此不需要存储整个结果集


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

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

  • 使用中的答案复制表架构
  • 使用
    resultSet.getMetaData()
    获取字段列表,并使用该列表在@Wyzard的答案中驱动SELECT/INSERT代码的修改版本

  • 如果我让代码正常工作,我会在这里发布代码。

    “插入到表2”+结果“我不认为你能做到这一点,从你的结果集中提取每一行数据并构造一个合适的sql insert语句。我知道我可以将这些数据写入csv文件,然后逐行插入。但这需要很多时间。我希望有更好的办法
    ResultSet
    是一个java对象。一定有办法不让它倒塌。必须有一种方法来重用它。这可能会有所帮助:这不是关于获取元数据。我可以手动创建包含所有元数据的空表2。我的观点是如何有效地重用ResultSet我认为没有提取
    ResultSet
    和构建适当的SQL语句,就没有其他方法了。为什么我们必须在Java中这样做?我们可以使用数据库链接并在数据库本身中进行,因为有时候数据库所有者不想将它们链接在一起。在我们的情况下,通常是出于安全原因。