我有一个相对于insert方法的Java SQL问题。如果我有一个包含多个表的数据库,我想编写一个插入方法,可以将一行数据插入到任何类型的关系数据库的任何选定表中。如果某些表包含不同的数据类型,例如(整数,日期,varchar等)。我的代码:
public void insertData(String tablename, String... values)
throws SQLException {
Connection con = null;
PreparedStatement prepStmt = null;
if (values.length == 0) {
throw new SQLException("Must supply values");
}
try{
con = getConnection();
String sql = "insert into "+tablename+" values(";
for (int i = 0; i < values.length; i++) {
sql += "?";
if (i != values.length-1) sql += ",";
}
sql += ")";
prepStmt = con.prepareStatement(sql);
for (int i = 0; i < values.length; i++) {
prepStmt.setString(i, values[i]);
}
prepStmt.executeUpdate();
}
finally {
closeStatement(prepStmt);
closeConnection(con);
}
}
例如,用例:
表教师有int id,varchar(50)name,int age,text subject,int 班级号;
表Student具有int id,varchar(50)名称,date dateofbirth,text 地址;
Table Class有int id,text subject;
如果我使用:
insertData(Teacher, new String[] {"10", "Cass", "32", "Math", "10222"});
该数据是否会成功插入表中?我听说数据库只使用varchar。如果是这种情况,那么我不必担心类型。如果类型是varchar,我应该使用prepStmt.setString()吗?
我需要支持多种不同类型的数据库,例如SQL Server,MySQL,Oracle等。那个insertData()方法是否适用于所有不同的数据库?
答案 0 :(得分:1)
数据库元数据可以告诉您表的详细信息。
您可以使用DatabaseMetaData
获取列名称,类型和大小,然后您可以选择PreparedStatement
相应的setXXX方法:
DatabaseMetaData metadata = connection.getMetaData();
ResultSet resultSet = metadata.getColumns(null, null, "mytable", null); // table name is mytable
while (resultSet.next()) {
String name = resultSet.getString("COLUMN_NAME");
String type = resultSet.getString("TYPE_NAME");
int size = resultSet.getInt("COLUMN_SIZE");
}
另一种方法是使用ResultSetMetaData
,但您必须从表中查询才能获得ResultSet
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount() ; // returns the number of columns
for(int i = 1; i < columnCount + 1; i++){
rsmd.getColumnName(i); //get name
}
获得表格信息(列名,类型......)后,您可以选择正确的查询来更新表格
答案 1 :(得分:-1)
您的方案仅在您为每列传递值时才会起作用,如果表中有任何可为空的列,并且您不想在其上插入值,那么它将无效并且将抛出sql异常必须在insert语句中指定列名,但在你的情况下,你可以传递Object数组而不是String数组,然后根据你可以从getClass方法中获得的参数的类类型调用适当的setXXX。