Основы 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 — локальная установка не требуется.