Перейти к основному содержимому

Как проверить, существует ли таблица базы данных с помощью JDBC

· 3 мин. чтения

1. Введение

В этом руководстве мы рассмотрим, как мы можем проверить, существует ли таблица в базе данных, используя JDBC и чистый SQL.

2. Использование метаданных базы данных

JDBC предоставляет нам инструменты для чтения и записи данных в базу данных. Помимо фактических данных, хранящихся в таблицах, мы можем читать метаданные, описывающие базу данных. Для этого мы будем использовать объект DatabaseMetaData , который мы можем получить из соединения JDBC:

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 для достижения той же цели. Для этого нам нужно взглянуть на таблицу « tables », расположенную в схеме « information_schema ». Это часть стандарта 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. Вывод

В этом уроке мы узнали, как найти информацию о существовании таблицы в базе данных. Мы использовали как DatabaseMetaData JDBC, так и чистый SQL.

Как обычно, все примеры кода доступны на GitHub .