Java でデータベース プログラムを作成しており、テーブルが存在しない場合はテーブルを作成したいと考えています。Java で SQL テーブルの存在を検出するにはどうすればよいですか?DatabaseMetaData.getTables()
から学びました。そして私はそれを使用しようとしています:
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;
}
問題は、テーブルが作成された後でもrs.getRow()
常に を返すことです。0
を使用rs.getString("TABLE_NAME")
すると、結果セットが空であることを示す例外がスローされます。
私が考えた解決策の 1 つは、CREATE TABLE
ステートメントを実行し、スローされた例外をキャッチすることです。ただし、プログラムの制御フローに例外を使用するという考えは好きではありません。
FWIW、私はHSQLDBを使用しています。ただし、RDMS エンジンに依存しない Java コードを作成したいと考えています。DatabaseMetaData.getTables()
私がやりたいことをするために使用する別の方法はありますか?tableExists()
または、私のメソッドを書くための他の解決策はありますか?
追加した:
ここに記載されている提案を使用して、実稼働コードで機能するように見える解決策を見つけました。
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);
}
現在、テーブルが実際に作成されることをアサートする JUnit テストも作成しています。
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());
}
}
このテストはassertEquals()
、次のメッセージで失敗します。
FAILED: expected: <1> but was: <0>