java - 将结果集中的行插入到不同的数据库-Jdbc

标签 java jdbc

我使用 jdbc 在一台服务器上执行查询并获得 resultSet1。现在,我根据 resultSet1 在另一台服务器(服务器编号:2)上创建了一个表。在此之后,我想将 ResultSet1 直接插入到在 Server 2 创建的表中。做这个的最好方式是什么 ?就像我一样,是否有任何 resultSet.insertRowInto() 类型的函数(不使用确切表数据的通用答案)?

Connection connection1, connection2;
connection1 = connectDB("192.168.40.1","db1","root","");
connection2 = connectDB("192.168.45.1","db2","root","");

//I have table1 in db1 and db2 and their structure is same

stmt = connection1.createStatement();
ResultSet = stmt.executeQuery("Select * from table1");

现在我还需要将结果集复制到 db2 中的表 1。

最佳答案

使用 Java 8 的基于 JDBC 的解决方案:

public void copy(String table, Connection from, Connection to) throws SQLException {
    try (PreparedStatement s1 = from.prepareStatement("select * from " + table);
         ResultSet rs = s1.executeQuery()) {
        ResultSetMetaData meta = rs.getMetaData();

        List<String> columns = new ArrayList<>();
        for (int i = 1; i <= meta.getColumnCount(); i++)
            columns.add(meta.getColumnName(i));

        try (PreparedStatement s2 = to.prepareStatement(
                "INSERT INTO " + table + " ("
              + columns.stream().collect(Collectors.joining(", "))
              + ") VALUES ("
              + columns.stream().map(c -> "?").collect(Collectors.joining(", "))
              + ")"
        )) {

            while (rs.next()) {
                for (int i = 1; i <= meta.getColumnCount(); i++)
                    s2.setObject(i, rs.getObject(i));

                s2.addBatch();
            }

            s2.executeBatch();
        }
    }
}

如果您使用的不是 Java 8:

则不能使用columns.stream()等和lambda表达式。下面是创建 INSERT 语句的另一种方法:

   StringBuilder columnNames = new StringBuilder();
   StringBuilder bindVariables = new StringBuilder();

   for (int i = 1; i <= meta.getColumnCount(); i++)
       if (i > 1) {
           columnNames.append(", ");
           bindVariables.append(", ");
       }

       columnNames.append(meta.getColumnName(i));
       bindVariables.append('?');
   }

   String sql = "INSERT INTO " + table + " ("
              + columnNames
              + ") VALUES ("
              + bindVariables
              + ")"

免责声明:

我正在使用字符串连接生成上面的 SQL 语句。要非常使用此技术以防止遇到SQL injection (和语法错误)! table 参数不能是用户输入的!

为简单起见所做的假设:

  • 列名不区分大小写
  • 您没有过多的数据(否则您应该不时提交以保持较小的 UNDO/REDO 日志)
  • 您的 JDBC 驱动程序将支持 setObject()getObject(),而不是可能需要的更具体的类型。
  • 您必须使用 JDBC,因为任何支持某种记录抽象的库(例如 HibernatejOOQActiveJDBC 等)在这里都会有很大帮助。

关于java - 将结果集中的行插入到不同的数据库-Jdbc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29720371/

相关文章:

java - SQL Azure 和连接池

java - 使用 Java Connector/J 和 SSL 连接到 RDS 中的 MySQL

java - 具有未定义迭代次数的循环

java - 在 int java 前面添加零

java - AdMob 在布局中占用空间,但实际上没有广告出现?

mysql - 使用 like 运算符在数据库中搜索并返回结果列表

c# - WCF 与 Java 兼容吗?

java - 如何使用 Java 字符串初始化多边形

java - 哪里可以找到正确的 Java 文档?

java - 打印 hibernate.jdbc.batch_size