我有多个表2分贝。所有表都有相同的语法。这里我有一个方法,将表的名称作为参数。我尝试插入的表有3列(int,varchar,int)。问题是,只插入第一行,第2行和第3行为空,我不知道是什么问题。有什么建议吗?
public void getAndInsertData(String nameOfTable) {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con1 = DriverManager.getConnection(urlDB1, user1, password1);
Statement s1 = con1.createStatement();
Connection con2 = DriverManager.getConnection(urlDB2, user2, password2);
Statement s2 = con2.createStatement();
ResultSet rs1 = s1.executeQuery("SELECT * FROM " + nameOfTable);
ResultSetMetaData rsmd1 = rs1.getMetaData();
int columnCount = rsmd1.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
String columnName = rsmd1.getColumnName(column);
int columnType = rsmd1.getColumnType(column);
while (rs1.next()) {
switch (columnType) {
case Types.INTEGER:
case Types.SMALLINT:
case Types.BIGINT:
case Types.TINYINT:
int integerValue = rs1.getInt(column);
String integerQuery = "insert into " + nameOfTable + " (" + columnName + ") VALUES("
+ integerValue + ");";
s2.executeUpdate(integerQuery);
break;
case Types.VARCHAR:
case Types.NVARCHAR:
case Types.LONGNVARCHAR:
case Types.LONGVARCHAR:
String varcharValue = rs1.getString(column);
String varcharQuery = "insert into " + nameOfTable + " (" + columnName + ") VALUES("
+ varcharValue + ");";
s2.executeUpdate(varcharQuery);
default:
System.out.println("Default");
break;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
3条答案
按热度按时间ecr0jaav1#
一些问题:
使用try with resources确保jdbc资源被正确清理。
不需要一个
switch
语句,因为我们实际上不需要知道列的类型。如果您使用getObject()
以及setObject()
.只执行一个
INSERT
源表中的每行。在插入大量记录时使用批处理,以获得更好的性能。
以下是操作方法:
k2arahey2#
你的
integerQuery
以及varcharQuery
两者都在数据库表中插入一条记录,其中一列为填充列,另一列为空白。因为您只为一列提供值。wkftcu5l3#
正如刺穿者已经提到的,你的环在错误的地方。对于rs1的每条记录,您希望使用s2插入一条记录。
您可以首先使用元数据构建一个准备好的语句,然后注入以下值:resultsetmetadata rsmd1=rs1.getmetadata();int columncount=rsmd1.getcolumncount();