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



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

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对象。我希望有一种方法将其添加到批处理或类似的东西和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();
        }
    }
}

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

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

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

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

我将在这里张贴代码,如果我让它工作。

相关内容

  • 没有找到相关文章

最新更新