JDBC — стандартное API java для работы с базами данных. Обычно подразумеваются реляционные базы данных, но стандарт, в принципе, не ограничивает подвиды баз. Существуют jdbc драйверы для MongoDB, Redis, Cache итд. В статьях я буду использовать либо встраиваемую реляционную базу данных H2, либо MySQL или PostgreSQL.
JDBC состоит из двух частей — собственно интерфейса JDBC, который использует разработчик и драйверов JDBC, реализующих непосредственную работу с базой данных. Конкретный драйвер выбирается при открытии соединения с базой данных. Впрочем, меньше слов, больше кода.
Начнём с пустого проекта, в который добавим встраиваемую базу H2. Её JDBC драйвер входит в комплект поставки и отдельно его добавлять не требуется.
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <h2.version>1.4.190</h2.version> <hamcrest.version>1.3</hamcrest.version> </properties> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>${h2.version}</version> </dependency> </dependencies>
Дальше мы напишем код, который создаёт таблицу, добавляет в неё данные и потом извлекает их обратно:
/** * Simple example of JDBC usage. */ public final class App { /** * Query that create table. */ private static final String CREATE_QUERY = "CREATE TABLE EXAMPLE (GREETING VARCHAR(6), TARGET VARCHAR(6))"; /** * Quaery that populates table with data. */ private static final String DATA_QUERY = "INSERT INTO EXAMPLE VALUES('Hello','World')"; /** * Do not construct me. */ private App() { } /** * Entry point. * * @param args Commans line args. Not used. */ public static void main(final String[] args) { try (Connection db = DriverManager.getConnection("jdbc:h2:mem:")) { try (Statement dataQuery = db.createStatement()) { dataQuery.execute(CREATE_QUERY); dataQuery.execute(DATA_QUERY); } try (PreparedStatement query = db.prepareStatement("SELECT * FROM EXAMPLE")) { ResultSet rs = query.executeQuery(); while (rs.next()) { System.out.println(String.format("%s, %s!", rs.getString(1), rs.getString("TARGET"))); } rs.close(); } } catch (SQLException ex) { System.out.println("Database connection failure: " + ex.getMessage()); } } }
В первую очередь открывается соединение с базой:
try (Connection db = DriverManager.getConnection("jdbc:h2:mem:"))
В метод getConnection() передаётся jdbc url, говорящий JDBC API с какой именно базой я хочу установить соединение. В общем виде формат url такой: «jdbc:driver:options», где driver — имя драйвер базы, options — параметры, специфичные для выбранного драйвера, указывающие ему на конкретную базу данных. В моём случае «jdbc:h2:mem» означает, что я хочу использовать драйвер базы данных H2, которому сообщается что мне нужна встроенная анонимная in-memory база. Соединение с базой обязательно надо закрывать за собой, поэтому я использую try-with-resources.
Для выполнения запросов надо получить из соединения с базой объект запроса:
try (Statement dataQuery = db.createStatement()) { dataQuery.execute(CREATE_QUERY); dataQuery.execute(DATA_QUERY); }
Объект запроса тоже обязательно надо за собой закрывать, поэтому опять try-with-resources. JDBC поддерживает как обычные запросы, которые посылаются в базу и немедленно исполняются, так и отложенные запросы, которые посылаются в базу сразу, а исполняются позднее:
try (PreparedStatement query = db.prepareStatement("SELECT * FROM EXAMPLE")) { ResultSet rs = query.executeQuery(); while (rs.next()) { System.out.println(String.format("%s, %s!", rs.getString(1), rs.getString("TARGET"))); } rs.close(); }
Запрос возвращает объект ResultSet, содержащий полученные данные. ResultSet содержит внутри себя строки, указатель на текущую строку и методы по получению данных из текущей строки. В моём примере я использую rs.next() для того, чтобы перемещаться по строкам и getString(), чтобы выбирать данные из столбцов. Обращаться к столбцам можно и по номеру столбца и по его имени.
Результат работы примера очевиден:
>java -jar hellojdbc-1-jar-with-dependencies.jar Hello, World!