JDBC — стандартное API java для работы с базами данных. Обычно подразумеваются реляционные базы данных, но стандарт, в принципе, не ограничивает подвиды баз. Существуют jdbc драйверы для MongoDB, Redis, Cache итд. В статьях я буду использовать либо встраиваемую реляционную базу данных H2, либо MySQL или PostgreSQL.
JDBC состоит из двух частей — собственно интерфейса JDBC, который использует разработчик и драйверов JDBC, реализующих непосредственную работу с базой данных. Конкретный драйвер выбирается при открытии соединения с базой данных. Впрочем, меньше слов, больше кода.
Начнём с пустого проекта, в который добавим встраиваемую базу H2. Её JDBC драйвер входит в комлект поставки и отдельно его добавлять не требуется.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<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>
|
Дальше мы напишем код, который создаёт таблицу, добавляет в неё данные и потом извлекает их обратно:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/**
* 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());
}
}
}
|
В первую очередь открывается соединение с базой:
1
|
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.
Для выполнения запросов надо получить из соединения с базой объект запроса:
1
2
3
4
|
try (Statement dataQuery = db.createStatement()) {
dataQuery.execute(CREATE_QUERY);
dataQuery.execute(DATA_QUERY);
}
|
Объект запроса тоже обязательно надо за собой закрывать, поэтому опять try-with-resources. JDBC поддерживает как обычные запросы, которые посылаются в базу и немедленно исполняются, так и отложенные запросы, которые посылаются в базу сразу, а исполняются позднее:
1
2
3
4
5
6
7
8
9
10
|
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(), чтобы выбирать данные из столбцов. Обращаться к столбцам можно и по номеру столбца и по его имени.
Результат работы примера очевиден:
1
2
|
>java -jar hellojdbc-1-jar-with-dependencies.jar
Hello, World!
|
Код примера доступен на github.