如何使用Java SQL

时间:2016-08-04 18:40:31

标签: java sql database

我有一个相对于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()方法是否适用于所有不同的数据库?

2 个答案:

答案 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。