Краткое руководство. Использование Java и JDBC с База данных Azure для PostgreSQL
Область применения: отдельный сервер Базы данных Azure для PostgreSQL
Внимание
База данных Azure для PostgreSQL — одиночный сервер находится на пути выхода на пенсию. Настоятельно рекомендуется выполнить обновление до База данных Azure для PostgreSQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для PostgreSQL — гибкий сервер см. в статье "Что происходит с одним сервером База данных Azure для PostgreSQL?".
В этой статье показано, как создать пример приложения, использующего Java и JDBC для хранения и получения информации в База данных Azure для PostgreSQL.
JDBC — это стандартный API Java для подключения к классическим реляционным базам данных.
В этой статье мы рассмотрим два метода проверки подлинности: проверку подлинности Microsoft Entra и проверку подлинности PostgreSQL. На вкладке "Без пароля" показана проверка подлинности Microsoft Entra, а на вкладке "Пароль " отображается проверка подлинности PostgreSQL.
Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для PostgreSQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. С помощью проверки подлинности Microsoft Entra можно управлять удостоверениями пользователей базы данных и другими службы Майкрософт в центральном расположении, что упрощает управление разрешениями.
Проверка подлинности PostgreSQL использует учетные записи, хранящиеся в PostgreSQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные будут храниться в user
таблице. Так как эти пароли хранятся в PostgreSQL, вам потребуется самостоятельно управлять сменой паролей.
Необходимые компоненты
- Учетная запись Azure. Если у вас ее нет, получите бесплатную пробную версию.
- Требуется Azure Cloud Shell или Azure CLI 2.37.0 или более поздней версии. Мы рекомендуем использовать Azure Cloud Shell, так вы автоматически войдете в систему и получите доступ ко всем необходимым средствам.
- Поддерживаемый пакет средств разработки Java (JDK) версии 8 (включена в Azure Cloud Shell).
- Средство сборки Apache Maven.
Подготовка среды выполнения
Сначала настройте некоторые переменные среды. В Azure Cloud Shell выполните следующие команды:
export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
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)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id -o tsv)
Замените заполнители следующими значениями, которые используются в этой статье:
<YOUR_DATABASE_SERVER_NAME>
: имя сервера PostgreSQL, который должен быть уникальным в Azure.<YOUR_AZURE_REGION>
: регион Azure, который вы будете использовать. Вы можете использоватьeastus
по умолчанию, но мы рекомендуем настроить регион, расположенный близко к месту проживания. Полный список доступных регионов можно просмотреть, введяaz account list-locations
.<YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>
: имя пользователя сервера базы данных 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
В следующих разделах описывается создание и настройка экземпляра базы данных.
Создание сервера PostgreSQL и настройка пользователя администратора
Первое, что вы создадите, — это управляемый сервер PostgreSQL с пользователем администратора.
Примечание.
См. сведения о создании сервера Базы данных Azure для PostgreSQL с помощью портала Azure.
Если вы используете Azure CLI, выполните следующую команду, чтобы убедиться, что у вас достаточно разрешений:
az login --scope https://graph.microsoft.com/.default
Затем выполните следующую команду, чтобы создать сервер:
az postgres server create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME \
--location $AZ_LOCATION \
--sku-name B_Gen5_1 \
--storage-size 5120 \
--output tsv
Теперь выполните следующую команду, чтобы задать пользователя администратора Microsoft Entra:
az postgres server ad-admin create \
--resource-group $AZ_RESOURCE_GROUP \
--server-name $AZ_DATABASE_SERVER_NAME \
--display-name $CURRENT_USERNAME \
--object-id $CURRENT_USER_OBJECTID
Внимание
При настройке администратора в Базу данных Azure для сервера PostgreSQL добавляется новый пользователь со всеми разрешениями администратора. Для каждого сервера PostgreSQL можно создать только один администратор Microsoft Entra, а другой перезаписывает существующий администратор Microsoft Entra, настроенный для сервера.
Эта команда создает небольшой сервер PostgreSQL и задает администратору Active Directory имя пользователя, выполнившего вход.
Настройка правила брандмауэра для сервера PostgreSQL
Экземпляры Базы данных Azure для PostgreSQL по умолчанию защищены. В них включен брандмауэр, который блокирует все входящие подключения. Чтобы вы могли использовать нашу базу данных, добавьте правило брандмауэра, которое разрешит локальному IP-адресу обращаться к серверу базы данных.
Так как вы настроили локальный IP-адрес ранее, вы можете открыть брандмауэр сервера, выполнив следующую команду:
az postgres server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--server $AZ_DATABASE_SERVER_NAME \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS \
--output tsv
Если вы подключаетесь к серверу 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 server firewall-rule create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
--server $AZ_DATABASE_SERVER_NAME \
--start-ip-address $AZ_WSL_IP_ADDRESS \
--end-ip-address $AZ_WSL_IP_ADDRESS \
--output tsv
Настройка базы данных PostgreSQL
Созданный вами ранее сервер PostgreSQL пуст. Чтобы создать новую базу данных, используйте следующую команду.
az postgres db create \
--resource-group $AZ_RESOURCE_GROUP \
--name $AZ_DATABASE_NAME \
--server-name $AZ_DATABASE_SERVER_NAME \
--output tsv
Создание пользователя, отличного от администратора PostgreSQL, и предоставление разрешения
Затем создайте пользователя без администратора и предоставьте всем разрешения для базы данных.
Примечание.
Дополнительные сведения о создании пользователей PostgreSQL см. в статье "Создание пользователей" в База данных Azure для PostgreSQL.
Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:
cat << EOF > create_ad_user.sql
SET aad_validate_oids_in_tenant = off;
CREATE ROLE "$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME" WITH LOGIN IN ROLE azure_ad_user;
GRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO "$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME";
EOF
Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:
psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME@$AZ_DATABASE_SERVER_NAME dbname=$AZ_DATABASE_NAME 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.3.6</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity-extensions</artifactId>
<version>1.0.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}@${AZ_DATABASE_SERVER_NAME}
EOF
Примечание.
Свойство url
конфигурации добавлено ?sslmode=require
, чтобы сообщить драйверу JDBC использовать TLS (transport Layer Security) при подключении к базе данных. Использование TLS является обязательным с База данных Azure для PostgreSQL, и это хорошая практика безопасности.
Создание файла SQL для генерации схемы базы данных
Для создания схемы базы данных используется файл src/main/resources/schema.sql . Создайте этот файл, а затем добавьте следующее содержимое:
cat << EOF > 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);
EOF
Добавление кода приложения
Подключение к базе данных
Затем добавьте код Java, который будет использовать JDBC для хранения данных на сервере 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());
}
/* Prepare for data processing in the PostgreSQL server.
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 , созданные ранее, для подключения к серверу PostgreSQL и создания схемы, которая будет хранить данные.
В этом файле можно увидеть, что мы закомментировали методы вставки, чтения, обновления и удаления данных. Вы закодируйте эти методы в остальной части этой статьи, и вы сможете раскомментировать их друг за другом.
Примечание.
Учетные данные базы данных хранятся в user
файле application.properties.password
Эти учетные данные используются при выполнении DriverManager.getConnection(properties.getProperty("url"), properties);
, так как файл свойств передается в качестве аргумента.
Теперь вы можете выполнить класс main в любом удобном инструменте.
- В любой среде IDE щелкните правой кнопкой мыши класс 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
Создание доменного класса
Создайте новый класс Java Todo
рядом с классом 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);
Теперь при запуске класса main вы увидите следующие выходные данные.
[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);
Теперь при запуске класса main вы увидите следующие выходные данные.
[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);
Теперь при запуске класса main вы увидите следующие выходные данные.
[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);
Теперь при запуске класса main вы увидите следующие выходные данные.
[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