将结果集中的行插入到不同的数据库 -Jdbc
Insert Row from resultSet to different database -Jdbc
使用 jdbc 我在一台服务器上执行查询并获得 resultSet1。现在,我根据另一台服务器(服务器编号:2)上的 resultSet1 创建了一个 table。在此之后,我想将 ResultSet1 直接插入到在 Server 2 创建的 table 中。做这个的最好方式是什么 ?就像我一样,是否有任何 resultSet.insertRowInto() 类型的函数(不使用确切 table 数据的一般答案)?
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 中的 table1。
基于 JDBC 的解决方案,使用 Java 8:
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,因为任何支持某种记录抽象的库(例如 Hibernate, jOOQ, ActiveJDBC 等)在这里都会有很大帮助。
使用 jdbc 我在一台服务器上执行查询并获得 resultSet1。现在,我根据另一台服务器(服务器编号:2)上的 resultSet1 创建了一个 table。在此之后,我想将 ResultSet1 直接插入到在 Server 2 创建的 table 中。做这个的最好方式是什么 ?就像我一样,是否有任何 resultSet.insertRowInto() 类型的函数(不使用确切 table 数据的一般答案)?
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 中的 table1。
基于 JDBC 的解决方案,使用 Java 8:
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,因为任何支持某种记录抽象的库(例如 Hibernate, jOOQ, ActiveJDBC 等)在这里都会有很大帮助。