Hello, JDBC

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!

Скачать код примера

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *