0Pricing
Java Academy · Урок

Основы JDBC

Соединения, операторы и наборы результатов

«Основы JDBC» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Что такое JDBC?

JDBC (подключение Java к базам данных) — стандартный API для работы Java с реляционными базами данных.

  • Он находится в пакете java.sql.
  • Каждая база данных поставляется с драйвером, реализующим интерфейсы JDBC.
  • Вы пишете код на основе таких интерфейсов, как Connection, Statement и ResultSet, а не напрямую на основе классов конкретного поставщика.

Благодаря этой абстракции один и тот же код может работать с PostgreSQL, MySQL, H2 или Oracle.

Основные интерфейсы

Основную работу выполняют три интерфейса:

  • Connection — открытая сессия с базой данных.
  • Statement / PreparedStatement — отправляет SQL.
  • ResultSet — курсор по строкам, возвращённым запросом.

Объект Connection можно получить из DriverManager или DataSource.

Открытие соединения

DriverManager.getConnection(url, user, password) возвращает действующее соединение Connection.

URL JDBC идентифицирует базу данных, например jdbc:postgresql://localhost:5432/shop. Современные драйверы регистрируются автоматически, поэтому теперь вам не нужно вызывать Class.forName(...).

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret")) {
            System.out.println("Connected: " + !conn.isClosed());
        } catch (SQLException e) {
            System.out.println("Connection failed: " + e.getMessage());
        }
    }
}

try с ресурсами

Connection, Statement и ResultSet реализуют интерфейс AutoCloseable.

Всегда открывайте их внутри блока try с ресурсами, чтобы они закрывались автоматически — даже если будет выброшено исключение. Утечки соединений быстро исчерпывают ресурсы базы данных.

  • Ресурсы закрываются в обратном порядке.
  • Блок finally не требуется.

Выполнение запроса

Для простого SELECT создайте Statement и вызовите executeQuery, который возвращает ResultSet.

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

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Simulated result of: SELECT name FROM users
        List<String> names = List.of("Ada", "Linus", "Grace");
        System.out.println("Query returned " + names.size() + " rows:");
        for (String name : names) {
            System.out.println(" - " + name);
        }
    }
}

Чтение ResultSet

Объект ResultSet находится перед первой строкой. Вызывайте rs.next() в цикле; метод возвращает false, когда строк больше нет.

Читайте столбцы по имени или по индексу, начинающемуся с 1, используя типизированные методы чтения:

  • rs.getInt("id")
  • rs.getString("name")
  • rs.getDouble("price")
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM users")) {
            while (rs.next()) {
                System.out.println(rs.getInt("id") + ": " + rs.getString("name"));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

executeUpdate для записи данных

Для INSERT, UPDATE и DELETE используйте executeUpdate. Он возвращает значение типа int — количество затронутых строк.

Используйте execute только тогда, когда заранее неизвестно, вернёт ли оператор набор результатов.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:postgresql://localhost:5432/shop";
        try (Connection conn = DriverManager.getConnection(url, "app", "secret");
             Statement st = conn.createStatement()) {
            int rows = st.executeUpdate("DELETE FROM sessions WHERE expired = true");
            System.out.println("Deleted " + rows + " rows");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

Преобразование строк в объекты

Большинство приложений преобразует каждую строку в объект предметной области. Переберите ResultSet в цикле и создайте экземпляры.

Ниже приведён этот шаблон в имитированном виде, поэтому он запускается самостоятельно. record делает сопоставление кратким.

import java.util.ArrayList;
import java.util.List;

public class Main {
    record User(int id, String name) {}

    public static void main(String[] args) {
        // Stand-in for iterating a ResultSet
        String[][] rows = {{"1", "Ada"}, {"2", "Linus"}};
        List<User> users = new ArrayList<>();
        for (String[] row : rows) {
            users.add(new User(Integer.parseInt(row[0]), row[1]));
        }
        users.forEach(System.out::println);
    }
}

Обработка SQLException

Почти каждый метод JDBC выбрасывает проверяемое исключение SQLException.

Оно содержит полезные диагностические сведения:

  • getMessage() — понятный человеку текст.
  • getSQLState() — стандартный код состояния из 5 символов.
  • getErrorCode() — код, специфичный для поставщика.

Записывайте эти сведения в журнал, а не игнорируйте исключение.

import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        SQLException e = new SQLException("duplicate key", "23505", 7);
        System.out.println("Message: " + e.getMessage());
        System.out.println("SQLState: " + e.getSQLState());
        System.out.println("ErrorCode: " + e.getErrorCode());
    }
}

DatabaseMetaData

conn.getMetaData() возвращает объект DatabaseMetaData, описывающий саму базу данных.

Он может сообщить название и версию продукта, поддерживаемые возможности, а также перечислить таблицы и столбцы. Так работают такие инструменты, как обозреватели схем: им не нужно заранее встраивать сведения о конкретном поставщике.

Объединяем всё вместе

Типичный процесс чтения:

  • Откройте Connection в блоке try с ресурсами.
  • Создайте Statement или, что лучше, PreparedStatement.
  • Вызовите executeQuery и переберите результаты с помощью rs.next().
  • Сопоставьте столбцы с объектами.
  • Позвольте блоку try с ресурсами закрыть всё автоматически.

В следующем уроке мы защитим запросы от внедрения.

Быстрая проверка

Что возвращает Statement.executeUpdate?

Итоги

Теперь вы знаете основной процесс работы с JDBC:

  • DriverManager.getConnection открывает объект Connection.
  • Statement отправляет SQL; executeQuery возвращает ResultSet, а executeUpdate — количество затронутых строк.
  • Перебирайте результаты с помощью rs.next() и типизированных методов чтения.
  • Всегда используйте try с ресурсами и обрабатывайте SQLException, учитывая его состояние и коды ошибок.

Часто задаваемые вопросы

Урок «Основы JDBC» бесплатный?

Да — полный текст урока «Основы JDBC» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы JDBC»?

Соединения, операторы и наборы результатов Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Основы JDBC»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы JDBC
  2. PreparedStatement
  3. Транзакции
  4. Пулы соединений с HikariCP
← Назад к Java Academy