如何如何JDBC檢查數據庫表是否存在
瀏覽人數:816最近更新:
- java
- JDBC
1.簡介
在本教程中,我們將研究如何使用JDBC和純SQL檢查數據庫中是否存在表。
2.使用DatabaseMetaData
JDBC為我們提供了讀寫數據到數據庫的工具。除了存儲在表中的實際數據之外,我們還可以讀取描述數據庫的元數據。為此,我們將使用可以從JDBC連接獲得DatabaseMetaData
DatabaseMetaData databaseMetaData = connection.getMetaData();
DatabaseMetaData
提供了許多有用的方法,但我們只需要一種方法: getTables
。讓我們用它來打印所有可用的表:
ResultSet resultSet = databaseMetaData.getTables(null, null, null, new String[] {"TABLE"});
while (resultSet.next()) {
String name = resultSet.getString("TABLE_NAME");
String schema = resultSet.getString("TABLE_SCHEM");
System.out.println(name + " on schema " + schema);
}
因為我們沒有提供前三個參數,所以我們獲得了所有目錄和模式中的所有表。我們還可以將查詢範圍縮小到例如僅一個模式:
ResultSet resultSet = databaseMetaData.getTables(null, "PUBLIC", null, new String[] {"TABLE"});
3.檢查表是否存在DatabaseMetaData
如果我們要檢查表是否存在,則不需要遍歷結果集。我們只需要檢查結果集是否為空。首先創建一個“ EMPLOYEE”表:
connection.createStatement().executeUpdate("create table EMPLOYEE (id int primary key auto_increment, name VARCHAR(255))");
現在,我們可以使用元數據對象來斷言剛剛創建的表確實存在:
boolean tableExists(Connection connection, String tableName) throws SQLException {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, tableName, new String[] {"TABLE"});
return resultSet.next();
}
請注意,儘管SQL不區分大小寫,但getTables
方法的實現是區分大小寫的。即使我們用小寫字母定義一個表,它也將以大寫形式存儲。因此, getTables
方法將對大寫的表名進行操作,因此我們需要使用“ EMPLOYEE”而不是“ employee”。
4.檢查表是否存在SQL
雖然DatabaseMetaData
很方便,但我們可能需要使用純SQL才能實現相同的目標。**為此,我們需要查看模式“ information_schema
” tables
**它是SQL-92標準的一部分,並且由大多數主要的數據庫引擎實現(Oracle除外)。
讓我們查詢“ tables
”表併計算獲取多少結果。如果表存在,我們期望一個,如果表不存在,我們期望為零:
SELECT count(*) FROM information_schema.tables
WHERE table_name = 'EMPLOYEE'
LIMIT 1;
將其與JDBC一起使用是創建一個簡單的預準備語句,然後檢查結果計數是否不等於零的問題:
static boolean tableExistsSQL(Connection connection, String tableName) throws SQLException {
PreparedStatement preparedStatement = connection.prepareStatement("SELECT count(*) "
+ "FROM information_schema.tables "
+ "WHERE table_name = ?"
+ "LIMIT 1;");
preparedStatement.setString(1, tableName);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
return resultSet.getInt(1) != 0;
}
5.結論
在本教程中,我們學習瞭如何在數據庫中查找有關表存在的信息。我們同時使用了JDBC的DatabaseMetaData
和純SQL。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議