Rea*_*wTo 119
DatabaseMetaData dbm = con.getMetaData();
// check if "employee" table is there
ResultSet tables = dbm.getTables(null, null, "employee", null);
if (tables.next()) {
// Table exists
}
else {
// Table does not exist
}
Run Code Online (Sandbox Code Playgroud)
Bri*_*new 65
您可以使用可用的元数据:
DatabaseMetaData meta = con.getMetaData();
ResultSet res = meta.getTables(null, null, "My_Table_Name",
new String[] {"TABLE"});
while (res.next()) {
System.out.println(
" "+res.getString("TABLE_CAT")
+ ", "+res.getString("TABLE_SCHEM")
+ ", "+res.getString("TABLE_NAME")
+ ", "+res.getString("TABLE_TYPE")
+ ", "+res.getString("REMARKS"));
}
Run Code Online (Sandbox Code Playgroud)
我实际上并没有发现任何提出的解决方案是完全完整的,所以我将添加自己的解决方案.这里没什么新鲜的.您可以从其他呈现的解决方案以及各种注释中将其拼接在一起.
至少有两件事你必须确保:
确保将表名传递给getTables()方法,而不是传递空值.在第一种情况下,让数据库服务器为您过滤结果,在第二种情况下,您从服务器请求所有表的列表,然后在本地过滤列表.如果您只搜索单个表,前者会快得多.
确保使用等于匹配的结果集检查表名.原因是getTables()对表和_字符的查询进行模式匹配是SQL中的通配符.假设您正在检查是否存在名为的表
EMPLOYEE_SALARY.然后你也会得到一个匹配,EMPLOYEESSALARY这不是你想要的.
哦,并且记得关闭那些结果集.从Java 7开始,您可能希望使用try-with-resources语句.
这是一个完整的解决方案:
public static boolean tableExist(Connection conn, String tableName) throws SQLException {
boolean tExists = false;
try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) {
while (rs.next()) {
String tName = rs.getString("TABLE_NAME");
if (tName != null && tName.equals(tableName)) {
tExists = true;
break;
}
}
}
return tExists;
}
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑types在getTables()通话中传递的参数(第4个参数).通常我会离开,null因为你不想限制自己.VIEW和TABLE一样好,对吧?目前,许多数据库允许您通过VIEW进行更新,因此在大多数情况下,仅限于TABLE类型是不可行的.因人而异.
添加到Gaby的帖子中,我的Oracle 10g的jdbc getTables()需要全部大写:
"employee" -> "EMPLOYEE"
否则我会得到一个例外:
java.sql.SqlExcepcion耗尽的结果集
(即使"员工"在架构中)