采用的是:
(1) DatabaseMetaData meta = conn.getMetaData();
(2) ResultSet set ;//= meta.getTables(null, null, table, null);
set = meta.getTables(null, null, table.toUpperCase(), null);
这个很奇怪,有些数据库是忽略大小写,而有些不是,有些默认是直接使用大写的,那么如果使用小写的table,就会查找不到。一般来说都是存储为大写,至少在Derby里面,它就是生成了大写的表名,这个让我在判断是否存在的时候很困惑,不过现在解决了。
我看了MySQL,它在建表的时候表名和数据库中的表名是一致的,不会出现上述问题。
当然,还有一个万能的解决方案,就是将table改成%
然后从查询结果中遍历set.getString(3).equalsIgnoreCase(tableName);
这样的话,很不优美,应该还有其他的解决方案,只不过我现在还不知道。
下面附上简单的代码:
public boolean hasTable(String table) throws SQLException{
if(conn == null){
throw new SQLException("Connection has not been established!");
}
boolean state = false;
DatabaseMetaData meta = conn.getMetaData();
ResultSet set ;//= meta.getTables(null, null, table, null);
set = meta.getTables(null, null, table.toUpperCase(), null);
while (set.next()) {
state = true;
log.debug("Has Table " + table);
}
return state;
}