Краткое руководство: Использование Java и JDBC в База данных Azure для PostgreSQL — гибком сервере

В этой статье показано, как создать пример приложения, использующего Java и JDBC для хранения и получения информации в База данных Azure для PostgreSQL.

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

В этой статье рассматриваются два метода аутентификации: аутентификация Microsoft Entra и аутентификация PostgreSQL. На вкладке "Без пароля" показана проверка подлинности Microsoft Entra, а на вкладке "Пароль " отображается проверка подлинности PostgreSQL.

Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для PostgreSQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. Используя аутентификацию Microsoft Entra, вы можете управлять идентификаторами пользователей базы данных и другими службами Microsoft в одном централизованном месте, что упрощает управление разрешениями.

Проверка подлинности PostgreSQL использует учетные записи, хранящиеся в PostgreSQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, сохраните эти учетные данные в user таблице. Так как эти пароли хранятся в PostgreSQL, вам нужно самостоятельно управлять сменой паролей.

Предпосылки

Подготовка рабочей среды

Сначала используйте следующую команду, чтобы настроить некоторые переменные среды.

export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName -o tsv)

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

  • <YOUR_DATABASE_SERVER_NAME>: имя гибкого сервера База данных Azure для PostgreSQL, который должен быть уникальным в Azure.
  • <YOUR_DATABASE_NAME>: имя базы данных гибкого сервера База данных Azure для PostgreSQL, которое должно быть уникальным в Azure.
  • <YOUR_AZURE_REGION>: регион Azure, который нужно использовать. Вы можете использовать eastus по умолчанию, но выбрать регион ближе к месту жизни. Чтобы просмотреть полный список доступных регионов, введите az account list-locations.
  • <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>: имя пользователя для вашего База данных Azure для PostgreSQL гибкого сервера. Убедитесь, что указанное имя пользователя принадлежит существующему пользователю в арендаторе Microsoft Entra.
  • <YOUR_LOCAL_IP_ADDRESS>: IP-адрес локального компьютера, с которого запускается приложение Spring Boot. Один из удобных способов найти его — открыть whatismyip.akamai.com.

Это важно

При задании <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME> пользователь уже должен существовать в вашем арендаторе Microsoft Entra, иначе вы не сможете создать пользователя Microsoft Entra в своей базе данных.

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

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
    --output tsv

Создание гибкого сервера

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

Создание гибкого сервера и настройка пользователя администратора

Замечание

Дополнительные сведения о создании гибких серверов База данных Azure для PostgreSQL см. в кратком руководстве по созданию гибкого сервера База данных Azure для PostgreSQL.

Если вы используете Azure CLI, выполните следующую команду, чтобы убедиться, что у вас достаточно разрешений:

az login --scope https://graph.microsoft.com/.default

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

az postgres flexible-server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --location $AZ_LOCATION \
    --yes \
    --output tsv

Чтобы настроить администратора Microsoft Entra после создания сервера, выполните действия по управлению ролями Microsoft Entra в Базе данных Azure для PostgreSQL.

Это важно

При настройке администратора вы добавляете нового пользователя с полными правами администратора в базу данных Azure гибкого сервера База данных Azure для PostgreSQL. Можно создать несколько администраторов Microsoft Entra на База данных Azure для PostgreSQL гибкий сервер.

Возникли проблемы? Сообщите нам об этом.

Настройка правила брандмауэра для экземпляра Базы данных Azure для PostgreSQL

База данных Azure для PostgreSQL гибкие серверы по умолчанию защищены. У них есть брандмауэр, который блокирует все входящие подключения. Чтобы использовать базу данных, добавьте правило брандмауэра, которое разрешает доступ к серверу базы данных с вашего локального IP-адреса.

Так как вы настроили локальный IP-адрес ранее, вы можете открыть брандмауэр сервера, выполнив следующую команду:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

Если вы подключаетесь к гибкому серверу База данных Azure для PostgreSQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить идентификатор узла WSL в брандмауэр.

Получите IP-адрес хост-компьютера, выполнив следующую команду в WSL:

cat /etc/resolv.conf

Скопируйте IP-адрес, следующий за термином nameserver, а затем используйте следующую команду, чтобы задать переменную среды для IP-адреса WSL:

AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Затем используйте следующую команду, чтобы открыть брандмауэр сервера в приложении на основе WSL:

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

Настройка базы данных Azure для PostgreSQL

Создайте базу данных с помощью следующей команды:

az postgres flexible-server db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --database-name $AZ_DATABASE_NAME \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --output tsv

Создание пользователя Базы данных Azure для PostgreSQL без администратора и предоставление разрешения

Затем создайте пользователя без администратора и предоставьте всем разрешения для базы данных.

Замечание

Дополнительные сведения об управлении База данных Azure для PostgreSQL пользователями см. в разделе "Управление ролями Microsoft Entra" в База данных Azure для PostgreSQL.

Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:

cat << EOF > create_ad_user.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF

Затем выполните следующую команду, чтобы выполнить SQL-скрипт и создать пользователя Microsoft Entra без прав администратора:

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user.sql

Чтобы удалить временный файл скрипта SQL, выполните следующую команду:

rm create_ad_user.sql

Создание нового проекта Java

Используя любимую интегрированную среду разработки, создайте проект Java с помощью Java 8 или более поздней версии. Добавьте файлpom.xml в корневой каталог со следующим содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
      <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.7.5</version>
      </dependency>
      <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.2.0</version>
      </dependency>
    </dependencies>
</project>

Этот файл — это файл Apache Maven , который настраивает проект для использования:

  • Java 8
  • Последний драйвер PostgreSQL для Java

Подготовка файла конфигурации для подключения к Базе данных Azure для PostgreSQL

Создайте файл src/main/resources/application.properties и добавьте следующее содержимое:

cat << EOF > src/main/resources/application.properties
url=jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/${AZ_DATABASE_NAME}?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin
user=${AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME}
EOF

Замечание

Свойство url конфигурации включает в себя ?sslmode=require обеспечение того, чтобы драйвер JDBC использовал TLS (transport Layer Security) при подключении к базе данных. Использование TLS является обязательным для База данных Azure для PostgreSQL гибких серверов и является рекомендуемой практикой безопасности.

Создание SQL-файла для создания схемы базы данных

Используйте файл src/main/resources/schema.sql для создания схемы базы данных. Создайте этот файл и добавьте следующее содержимое:

DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);

Кодирование приложения

В следующих разделах описывается написание кода Java, который подключается к базе данных, определяет модель данных и выполняет основные операции CRUD.

Подключение к базе данных

Затем добавьте код Java, использующий JDBC для хранения и получения данных с База данных Azure для PostgreSQL гибкого сервера.

Создайте файл src/main/java/DemoApplication.java и добавьте следующее содержимое:

package com.example.demo;

import java.sql.*;
import java.util.*;
import java.util.logging.Logger;

public class DemoApplication {

    private static final Logger log;

    static {
        System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n");
        log =Logger.getLogger(DemoApplication.class.getName());
    }

    public static void main(String[] args) throws Exception {
        log.info("Loading application properties");
        Properties properties = new Properties();
        properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("application.properties"));

        log.info("Connecting to the database");
        Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties);
        log.info("Database connection test: " + connection.getCatalog());

        log.info("Create database schema");
        Scanner scanner = new Scanner(DemoApplication.class.getClassLoader().getResourceAsStream("schema.sql"));
        Statement statement = connection.createStatement();
        while (scanner.hasNextLine()) {
            statement.execute(scanner.nextLine());
        }

        /*
        Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
        insertData(todo, connection);
        todo = readData(connection);
        todo.setDetails("congratulations, you have updated data!");
        updateData(todo, connection);
        deleteData(todo, connection);
        */

        log.info("Closing database connection");
        connection.close();
    }
}

Возникли проблемы? Сообщите нам об этом.

Этот Java код использует application.properties и файлы schema.sql, созданные ранее, для подключения к гибкому серверу База данных Azure для PostgreSQL и создания схемы, в которой хранятся данные.

В этом файле методы вставки, чтения, обновления и удаления данных закомментированы. Остальная часть этой статьи описывает кодирование этих методов, и вы можете раскомментировать их один после другого.

Замечание

Учетные данные для базы данных хранятся в свойствах user и password в файле application.properties. Код использует эти учетные данные при выполнении DriverManager.getConnection(properties.getProperty("url"), properties);, так как файл свойств передается в качестве аргумента.

Теперь вы можете выполнить этот основной класс с помощью вашего любимого инструмента.

  • С помощью интегрированной среды разработки можно щелкнуть правой кнопкой мыши класс DemoApplication и выполнить его.
  • В Maven приложение можно запустить, выполнив команду mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Приложение подключается к гибкому серверу База данных Azure для PostgreSQL, создает схему базы данных, а затем закрывает подключение, как показано в журналах консоли:

[INFO   ] Loading application properties
[INFO   ] Connecting to the database
[INFO   ] Database connection test: demo
[INFO   ] Create database schema
[INFO   ] Closing database connection

Создание доменного класса

Создайте новый Todo класс Java рядом с классом DemoApplication и добавьте следующий код:

package com.example.demo;

public class Todo {

    private Long id;
    private String description;
    private String details;
    private boolean done;

    public Todo() {
    }

    public Todo(Long id, String description, String details, boolean done) {
        this.id = id;
        this.description = description;
        this.details = details;
        this.done = done;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getDetails() {
        return details;
    }

    public void setDetails(String details) {
        this.details = details;
    }

    public boolean isDone() {
        return done;
    }

    public void setDone(boolean done) {
        this.done = done;
    }

    @Override
    public String toString() {
        return "Todo{" +
                "id=" + id +
                ", description='" + description + '\'' +
                ", details='" + details + '\'' +
                ", done=" + done +
                '}';
    }
}

Этот класс представляет собой модель домена, сопоставленную с todo таблицей, созданной при выполнении скрипта schema.sql .

Вставка данных в базу данных Azure для PostgreSQL

В файле src/main/java/demoapplication.java добавьте после метода main следующий метод, который вставляет данные в базу данных.

private static void insertData(Todo todo, Connection connection) throws SQLException {
    log.info("Insert data");
    PreparedStatement insertStatement = connection
            .prepareStatement("INSERT INTO todo (id, description, details, done) VALUES (?, ?, ?, ?);");

    insertStatement.setLong(1, todo.getId());
    insertStatement.setString(2, todo.getDescription());
    insertStatement.setString(3, todo.getDetails());
    insertStatement.setBoolean(4, todo.isDone());
    insertStatement.executeUpdate();
}

Теперь вы можете раскомментировать две нижеследующие строки в методе main.

Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true);
insertData(todo, connection);

При выполнении основного класса он должен вывести следующие выходные данные:

[INFO   ] Loading application properties
[INFO   ] Connecting to the database
[INFO   ] Database connection test: demo
[INFO   ] Create database schema
[INFO   ] Insert data
[INFO   ] Closing database connection

Чтение данных из База данных Azure для PostgreSQL

Чтобы проверить правильность работы кода, прочитайте ранее вставленные данные.

В файле src/main/java/demoapplication.java добавьте после метода insertData следующий метод, который считывает данные из базы данных.

private static Todo readData(Connection connection) throws SQLException {
    log.info("Read data");
    PreparedStatement readStatement = connection.prepareStatement("SELECT * FROM todo;");
    ResultSet resultSet = readStatement.executeQuery();
    if (!resultSet.next()) {
        log.info("There is no data in the database!");
        return null;
    }
    Todo todo = new Todo();
    todo.setId(resultSet.getLong("id"));
    todo.setDescription(resultSet.getString("description"));
    todo.setDetails(resultSet.getString("details"));
    todo.setDone(resultSet.getBoolean("done"));
    log.info("Data read from the database: " + todo.toString());
    return todo;
}

Теперь можно раскомментировать следующую строку в методе main.

todo = readData(connection);

При выполнении основного класса он должен вывести следующие выходные данные:

[INFO   ] Loading application properties
[INFO   ] Connecting to the database
[INFO   ] Database connection test: demo
[INFO   ] Create database schema
[INFO   ] Insert data
[INFO   ] Read data
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true}
[INFO   ] Closing database connection

Обновление данных в База данных Azure для PostgreSQL

Чтобы обновить данные, выполните следующие действия.

В том же файле src/main/java/demoapplication.java добавьте после метода readData следующий метод, который обновляет данные в базе данных.

private static void updateData(Todo todo, Connection connection) throws SQLException {
    log.info("Update data");
    PreparedStatement updateStatement = connection
            .prepareStatement("UPDATE todo SET description = ?, details = ?, done = ? WHERE id = ?;");

    updateStatement.setString(1, todo.getDescription());
    updateStatement.setString(2, todo.getDetails());
    updateStatement.setBoolean(3, todo.isDone());
    updateStatement.setLong(4, todo.getId());
    updateStatement.executeUpdate();
    readData(connection);
}

Теперь вы можете раскомментировать две нижеследующие строки в методе main.

todo.setDetails("congratulations, you have updated data!");
updateData(todo, connection);

При выполнении основного класса он должен вывести следующие выходные данные:

[INFO   ] Loading application properties
[INFO   ] Connecting to the database
[INFO   ] Database connection test: demo
[INFO   ] Create database schema
[INFO   ] Insert data
[INFO   ] Read data
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true}
[INFO   ] Update data
[INFO   ] Read data
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true}
[INFO   ] Closing database connection

Удаление данных в База данных Azure для PostgreSQL

Наконец, удалите ранее вставленные данные.

В том же файле src/main/java/demoapplication.java добавьте после метода updateData следующий метод, который удаляет данные из базы данных.

private static void deleteData(Todo todo, Connection connection) throws SQLException {
    log.info("Delete data");
    PreparedStatement deleteStatement = connection.prepareStatement("DELETE FROM todo WHERE id = ?;");
    deleteStatement.setLong(1, todo.getId());
    deleteStatement.executeUpdate();
    readData(connection);
}

Теперь можно раскомментировать следующую строку в методе main.

deleteData(todo, connection);

При выполнении основного класса он должен вывести следующие выходные данные:

[INFO   ] Loading application properties
[INFO   ] Connecting to the database
[INFO   ] Database connection test: demo
[INFO   ] Create database schema
[INFO   ] Insert data
[INFO   ] Read data
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have set up JDBC correctly!', done=true}
[INFO   ] Update data
[INFO   ] Read data
[INFO   ] Data read from the database: Todo{id=1, description='configuration', details='congratulations, you have updated data!', done=true}
[INFO   ] Delete data
[INFO   ] Read data
[INFO   ] There is no data in the database!
[INFO   ] Closing database connection

Очистите ресурсы

Вы создали приложение Java, которое использует JDBC для хранения и получения данных с гибкого сервера База данных Azure для PostgreSQL.

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

az group delete \
    --name $AZ_RESOURCE_GROUP \
    --yes