Ich schreibe ein Datenbankprogramm in Java und möchte eine Tabelle erstellen, wenn sie noch nicht vorhanden ist. Ich habe gelernt über DatabaseMetaData.getTables()
von Wie kann ich die Existenz einer SQL-Tabelle in Java feststellen? und ich versuche, sie zu nutzen:
private boolean tableExists() throws SQLException {
System.out.println("tableExists()");
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getTables(null, null, this.getTableName(), null);
System.out.println("TABLE_NAME: " + rs.getString("TABLE_NAME"));
return rs.getRow() == 1;
}
Das Problem ist, dass rs.getRow()
gibt immer zurück 0
auch nachdem die Tabelle erstellt wurde. Verwendung von rs.getString("TABLE_NAME")
löst eine Ausnahme aus, die besagt, dass die Ergebnismenge leer ist.
Eine mögliche Lösung, die mir eingefallen ist, ist die Ausführung der CREATE TABLE
Anweisung und fangen alle ausgelösten Ausnahmen ab. Die Idee, Ausnahmen für den Kontrollfluss meines Programms zu verwenden, gefällt mir jedoch nicht.
FWIW, ich verwende HSQLDB. Ich würde jedoch gerne Java-Code schreiben, der unabhängig von der RDMS-Engine ist. Gibt es eine andere Möglichkeit zur Verwendung von DatabaseMetaData.getTables()
zu tun, was ich will? Oder gibt es eine andere Lösung zum Schreiben meiner tableExists()
¿método?
Hinzugefügt:
Mit Hilfe der hier gegebenen Vorschläge habe ich eine Lösung gefunden, die in meinem Produktionscode zu funktionieren scheint:
private void createTable() throws SQLException {
String sqlCreate = "CREATE TABLE IF NOT EXISTS " + this.getTableName()
+ " (brand VARCHAR(10),"
+ " year INTEGER,"
+ " number INTEGER,"
+ " value INTEGER,"
+ " card_count INTEGER,"
+ " player_name VARCHAR(50),"
+ " player_position VARCHAR(20))";
Statement stmt = conn.createStatement();
stmt.execute(sqlCreate);
}
Jetzt schreibe ich auch einen JUnit-Test, um sicherzustellen, dass die Tabelle tatsächlich erstellt wird:
public void testConstructor() throws Exception {
try (BaseballCardJDBCIO bcdb = new BaseballCardJDBCIO(this.url)) {
String query = "SELECT count(*) FROM information_schema.system_tables WHERE table_name = '" + bcdb.getTableName() + "'";
Connection conn = DriverManager.getConnection(this.url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
Assert.assertTrue(rs.next());
Assert.assertEquals(1, rs.getInt(1));
Assert.assertFalse(rs.next());
}
}
Dieser Test schlägt bei der assertEquals()
mit der folgenden Meldung:
FAILED: expected: <1> but was: <0>