2016-08-04 6 views
1

Ich habe eine Java SQL-Frage in Bezug auf die Einfügemethode. Wenn ich eine Datenbank mit mehreren Tabellen habe, möchte ich eine einzelne Einfügemethode schreiben, die eine Zeile mit Daten in jede ausgewählte Tabelle für jede Art von relationaler Datenbank einfügen kann. Wenn einige Tabellen verschiedene Datentypen enthalten, beispielsweise (Ganzzahl, Datum, Varchar und usw.). Meine Codes:wie Sie mit Java SQL in eine Datenbanktabelle mit unterschiedlichen Datentypen einfügen

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); 
    } 
} 

Zum Beispiel Anwendungsfall:

Tabelle Lehrer hat int id, varchar (50) Name, int Alter, Text Thema, int classid;

Tabelle Student hat int id, varchar (50) Name, Datum dateofbirth, Text Adresse;

Tabelle Klasse hat int id, Text Betreff;

Wenn ich benutze:

insertData(Teacher, new String[] {"10", "Cass", "32", "Math", "10222"}); 

fügt die Daten in die Tabelle erfolgreich? Ich habe gehört, dass die Datenbank nur Varchar verwendet. Wenn das der Fall ist, muss ich mich nicht um den Typ kümmern. Wenn der Typ Varchar ist, sollte ich prepStmt.setString() verwenden?

Ich muss mehrere verschiedene Arten von Datenbanken, wie SQL Server, MySQL, Oracle und andere unterstützen. Funktioniert diese insertData() -Methode für alle verschiedenen Datenbanken?

+0

Sie uns sagen, ob der Code funktioniert oder nicht – haifzhan

+0

@HaifengZhang Ich denke, es sollte funktionieren, aber ich habe keine Datenbank, um die Methode noch zu testen. Ich werde eines erstellen und es später testen, aber der schwierigste Teil ist, dass ich nicht wissen werde, welche genauen Typen in der Tabelle sein werden. Daher möchte ich eine einzige Methode erstellen, um die Insert-Datei zu verwenden, welche Datentypen in der ausgewählten Tabelle sind, da ich weiß, dass PreparedStatement setInt setString setBoolean ausführen kann. Ich habe gehört, PreparedStatement ist besser für die Abfrageausführung zu verwenden. –

+0

Aber meine eigentliche Frage ist nicht zum Testen meiner Codes, ich werde meine Frage ändern. –

Antwort

1

Die Datenbankmetadaten können Ihnen die Details der Tabelle mitteilen.

Was Sie tun können, ist mit DatabaseMetaData die Spaltennamen, Typen und Größe zu bekommen, dann können Sie PreparedStatement entsprechenden setXXX Methoden wählen:

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"); 
} 

Ein anderer Weg ResultSetMetaData verwendet, aber man muss aus der Tabelle abfragen die 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 
    } 

Nachdem Sie die Tabelleninformation (Spalte Name, Typ ...) zu erhalten, bekommen, dann können Sie die richtige Abfrage wählen die Tabelle zu aktualisieren

+0

Ich denke, das ist die Antwort zu gehen, aber ich werde eine Datenbank verwenden, um es zu testen, bevor ich es akzeptiere. Sie verwenden COLUMN_NAME TYPE_NAME, sind sie standardmäßig zum Abrufen von Spaltennamen und -typen? Ich habe eine andere Frage gestellt, um eine Liste von Tabellen für verschiedene Arten von Datenbanken zu erhalten. Ich weiß, Oracle verwendet eine andere SQL-Abfrage, um eine Liste der Benutzertabelle als SQL Server zu erhalten. –

+1

lesen Sie hier mehr https://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html – haifzhan

+0

Ja, es ist hilfreich. Vielen Dank. –

-1

Ihr Szenario funktioniert nur, wenn Sie Wert für jede Spalte übergeben, wenn es in der Tabelle eine Nullwertspalte gibt und Sie keinen Wert einfügen möchten, der nicht funktioniert und sql exception as auslöst Sie müssen den Spaltennamen auch in der insert-Anweisung angeben, aber in Ihrem Fall können Sie das Object-Array anstelle des String-Arrays übergeben und dann das entsprechende setXXX entsprechend dem Klassentyp des Parameters aufrufen, den Sie von der getClass-Methode ausschließen können.