如何如何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_schematables**它是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。