我写在Java的数据库的程序,并希望创建一个表,如果它不存在。 我了解DatabaseMetaData.getTables()
从如何检测SQL表的在Java中存在呢? 我试图使用它:
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")
抛出一个异常,说明该结果集是空的。
一个可能的解决方案,我认为是执行CREATE TABLE
语句,并赶上抛出任何异常。 不过,我不喜欢使用异常我的程序的控制流的想法。
FWIW,我使用HSQLDB。 不过,我想编写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>