Megosztás a következőn keresztül:


Rövid útmutató: Java és JDBC használata az Azure Database for PostgreSQL-hez

Ez a cikk bemutatja, hogyan hozhat létre egy mintaalkalmazást, amely Java és JDBC használatával tárolja és kéri le az adatokat az Azure Database for PostgreSQL-ben.

A JDBC a hagyományos relációs adatbázisokhoz való csatlakozás szabványos Java API-ja.

Ebben a cikkben két hitelesítési módszert fogunk tartalmazni: a Microsoft Entra-hitelesítést és a PostgreSQL-hitelesítést. A Jelszó nélküli lapon a Microsoft Entra-hitelesítés, a Jelszó lapon pedig a PostgreSQL-hitelesítés látható.

A Microsoft Entra-hitelesítés az Azure Database for PostgreSQL-hez való csatlakozás mechanizmusa a Microsoft Entra ID-ban meghatározott identitások használatával. A Microsoft Entra-hitelesítéssel központi helyen kezelheti az adatbázis felhasználói identitásait és más Microsoft-szolgáltatások, ami leegyszerűsíti az engedélykezelést.

A PostgreSQL-hitelesítés a PostgreSQL-ben tárolt fiókokat használja. Ha jelszavakat használ a fiókok hitelesítő adataiként, ezeket a hitelesítő adatokat a rendszer a user táblában tárolja. Mivel ezek a jelszavak a PostgreSQL-ben vannak tárolva, saját maga kell kezelnie a jelszavak rotálását.

Előfeltételek

A munkakörnyezet előkészítése

Először a következő paranccsal állítson be néhány környezeti változót.

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)

Cserélje le a helyőrzőket a következő értékekre, melyeket a cikkben használni fogunk:

  • <YOUR_DATABASE_SERVER_NAME>: A rugalmas Azure Database for PostgreSQL-kiszolgálópéldány neve, amelynek egyedinek kell lennie az Azure-ban.
  • <YOUR_DATABASE_NAME>: A rugalmas Azure Database for PostgreSQL-kiszolgálópéldány adatbázisneve, amelynek egyedinek kell lennie az Azure-ban.
  • <YOUR_AZURE_REGION>: A használni kívánt Azure-régió. Használhatja az alapértelmezett eastus értéket, de ajánlott az Ön lakóhelyéhez közelebbi régiót konfigurálni. Az elérhető régiók teljes listáját a beírással az account list-locationstekintheti meg.
  • <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>: Az Azure Database for PostgreSQL rugalmas kiszolgálópéldányának felhasználóneve. Győződjön meg arról, hogy a felhasználónév érvényes felhasználó a Microsoft Entra-bérlőben.
  • <YOUR_LOCAL_IP_ADDRESS>: A helyi számítógép IP-címe, amelyről a Spring Boot-alkalmazást fogja futtatni. Az egyik kényelmes módja annak, hogy megtalálja, hogy nyissa meg whatismyip.akamai.com.

Fontos

A beállításkor <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME> a felhasználónévnek már léteznie kell a Microsoft Entra-bérlőben, ellenkező esetben nem tud Microsoft Entra-felhasználót létrehozni az adatbázisban.

Ezután hozzon létre egy erőforráscsoportot a következő paranccsal:

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

Rugalmas kiszolgálópéldány létrehozása

Az alábbi szakaszok az adatbázispéldány létrehozását és konfigurálását ismertetik.

Rugalmas kiszolgálópéldány létrehozása

az adminisztrátori felhasználó beállítása

Elsőként egy rugalmas Azure Database for PostgreSQL-kiszolgálópéldányt hoz létre.

Feljegyzés

Az Azure Portalon részletes információt talál arról, hogyan hozhat létre egy rugalmas Azure Database for PostgreSQL kiszolgálópéldányt.

Ha Azure CLI-t használ, futtassa a következő parancsot, hogy meggyőződjön arról, hogy rendelkezik-e megfelelő engedéllyel:

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

Futtassa a következő parancsot a kiszolgáló létrehozásához:

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

Ha a kiszolgáló létrehozása után microsoft entra-rendszergazdat szeretne beállítani, kövesse a Microsoft Entra-szerepkörök kezelése az Azure Database for PostgreSQL-ben című témakörben leírt lépéseket.

Fontos

Rendszergazda beállításakor a rugalmas Azure Database for PostgreSQL-kiszolgálópéldány Azure-adatbázisához hozzáad egy teljes rendszergazdai jogosultságokkal rendelkező új felhasználót. Rugalmas Azure Database for PostgreSQL-kiszolgálópéldányonként több Microsoft Entra-rendszergazdát is létrehozhat.

Problémái vannak? Értesítsen minket.

Tűzfalszabály konfigurálása az Azure Database for PostgreSQL-példányhoz

A rugalmas Azure Database for PostgreSQL-kiszolgálópéldányok alapértelmezés szerint védettek. Tűzfallal rendelkezik, amely semmilyen bejövő kapcsolatot sem engedélyez. Az adatbázis használatához hozzá kell adnia egy tűzfalszabályt, amely lehetővé teszi, hogy a helyi IP-cím hozzáférjen az adatbázis-kiszolgálóhoz.

Mivel a cikk elején konfigurálta a helyi IP-címet, az alábbi parancs futtatásával megnyithatja a kiszolgáló tűzfalát:

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

Ha rugalmas Azure Database for PostgreSQL-kiszolgálópéldányhoz csatlakozik Linuxos Windows-alrendszer (WSL) egy Windows-számítógépen, hozzá kell adnia a WSL-gazdagép azonosítóját a tűzfalhoz.

Szerezze be a host gép IP-címét a következő parancs futtatásával WSL-ben:

cat /etc/resolv.conf

Másolja ki az IP-címet a kifejezés nameserverután, majd az alábbi paranccsal állítson be környezeti változót a WSL IP-címéhez:

AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Ezután a következő paranccsal nyissa meg a kiszolgáló tűzfalát a WSL-alapú alkalmazás számára:

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

A PostgreSQL-adatbázis Azure Database konfigurálása

Hozzon létre egy új adatbázist a következő paranccsal:

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 Database for PostgreSQL nem rendszergazdai felhasználó létrehozása és engedély megadása

Ezután hozzon létre egy nem rendszergazdai felhasználót, és adjon meg minden engedélyt az adatbázisnak.

Feljegyzés

Az Azure Database for PostgreSQL-felhasználók kezelésével kapcsolatos részletesebb információkat a Microsoft Entra-szerepkörök kezelése az Azure Database for PostgreSQL-ben című témakörben talál.

Hozzon létre egy create_ad_user.sql nevű SQL-szkriptet, amely nem rendszergazdai felhasználót hoz létre. Adja hozzá a következő tartalmat, és mentse helyileg:

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

Ezután az alábbi paranccsal futtassa az SQL-szkriptet a Microsoft Entra nem rendszergazdai felhasználójának létrehozásához:

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

Most az alábbi paranccsal távolítsa el az ideiglenes SQL-szkriptfájlt:

rm create_ad_user.sql

Új Java-projekt létrehozása

A kedvenc IDE használatával hozzon létre egy új Java-projektet a Java 8 vagy újabb verziójával, és vegyen fel egy pom.xml fájlt a gyökérkönyvtárába a következő tartalommal:

<?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>

Ez a fájl egy Apache Maven , amely konfigurálja a projekt használatát:

  • Java 8
  • A Legutóbbi PostgreSQL-illesztőprogram Java-hoz

Konfigurációs fájl előkészítése az Azure Database for PostgreSQL-hez való csatlakozáshoz

Hozzon létre egy src/main/resources/application.properties fájlt, majd adja hozzá a következő tartalmat:

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

Feljegyzés

A konfigurációs tulajdonság url magában foglalja ?sslmode=require annak biztosítását, hogy a JDBC-illesztő TLS-t (Transport Layer Security) használjon az adatbázishoz való csatlakozáskor. A TLS használata kötelező az Azure Database for PostgreSQL rugalmas kiszolgálópéldányai esetében, és ajánlott biztonsági gyakorlat.

SQL-fájl létrehozása az adatbázisséma létrehozásához

Adatbázisséma létrehozásához src /main/resources/schema.sql fájlt fog használni. Hozza létre a fájlt a következő tartalommal:

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

Az alkalmazás kódolása

Csatlakozás az adatbázishoz

Ezután adja hozzá a JDBC-t használó Java-kódot az adatok tárolásához és lekéréséhez a rugalmas Azure Database for PostgreSQL-kiszolgálópéldányból.

Hozzon létre egy src/main/java/DemoApplication.java fájlt, és adja hozzá a következő tartalmat:

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();
    }
}

Problémái vannak? Értesítsen minket.

Ez a Java-kód a korábban létrehozott application.properties és schema.sql fájlokat fogja használni, hogy csatlakozzon a rugalmas Azure Database for PostgreSQL-kiszolgálópéldányhoz, és hozzon létre egy sémát, amely tárolja az adatokat.

Ebben a fájlban láthatja, hogy megjegyzéseket fűztünk az adatok beszúrásához, olvasásához, frissítéséhez és törléséhez: ezeket a metódusokat a cikk többi részében kódolva lesznek, és egymás után feloldhatja őket.

Feljegyzés

Az adatbázis hitelesítő adatai az application.properties fájl felhasználói és jelszótulajdonságaibanvannak tárolva . Ezeket a hitelesítő adatokat a rendszer a végrehajtás DriverManager.getConnection(properties.getProperty("url"), properties);során használja, mivel a tulajdonságfájl argumentumként lesz átadva.

Most már végrehajthatja ezt a főosztályt a kedvenc eszközével:

  • Az IDE használatával kattintson a jobb gombbal a DemoApplication osztályra, és futtassa azt.
  • A Maven használatával futtathatja az alkalmazást a következő végrehajtásával: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Az alkalmazásnak csatlakoznia kell a rugalmas Azure Database for PostgreSQL-kiszolgálópéldányhoz, létre kell hoznia egy adatbázissémát, majd be kell zárnia a kapcsolatot, ahogy a konzolnaplókban látnia kell:

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

Tartományosztály létrehozása

Hozzon létre egy új Todo Java-osztályt az DemoApplication osztály mellett, és adja hozzá a következő kódot:

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 +
                '}';
    }
}

Ez az osztály egy tartománymodell, amely a todo táblázatra van leképezve, amit a schema.sql szkript végrehajtásakor hoztál létre.

Adatok beszúrása az Azure Database for PostgreSQL-be

Az src/main/java/DemoApplication.java fájlban a fő metódus után adja hozzá a következő metódust az adatok adatbázisba való beszúrásához:

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();
}

Most már eltávolíthatja a kommentárt az alábbi két sorból a main metódusban:

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

A főosztály végrehajtásának most a következő kimenetet kell eredményeznie:

[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

Adatok olvasása az Azure Database for PostgreSQL-ből

Olvassuk el a korábban beszúrt adatokat annak ellenőrzéséhez, hogy a kód megfelelően működik-e.

Az src/main/java/DemoApplication.java fájlban a insertData metódus után adja hozzá a következő metódust az adatok adatbázisból való beolvasásához:

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;
}

Most már feloldhatja a következő sort a main metódusban:

todo = readData(connection);

A főosztály végrehajtásának most a következő kimenetet kell eredményeznie:

[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

Adatok frissítése az Azure Database for PostgreSQL-ben

Frissítsük a korábban beszúrt adatokat.

Még mindig a src/main/java/DemoApplication.java fájlban, a readData metódus után adja hozzá a következő metódust az adatbázisban lévő adatok frissítéséhez:

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);
}

Most már eltávolíthatja a kommentárt az alábbi két sorból a main metódusban:

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

A főosztály végrehajtásának most a következő kimenetet kell eredményeznie:

[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

Adatok törlése az Azure Database for PostgreSQL-ben

Végül töröljük a korábban beszúrt adatokat.

Az src/main/java/DemoApplication.java fájlban, a updateData metódus után adja hozzá a következő metódust az adatbázisban lévő adatok törléséhez:

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);
}

Most már feloldhatja a következő sort a main metódusban:

deleteData(todo, connection);

A főosztály végrehajtásának most a következő kimenetet kell eredményeznie:

[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

Az erőforrások tisztítása

Gratulálunk! Létrehozott egy Java-alkalmazást, amely JDBC használatával tárol és kér le adatokat egy rugalmas Azure Database for PostgreSQL-kiszolgálópéldányból.

A rövid útmutató során használt összes erőforrás törléséhez törölje az erőforráscsoportot az alábbi paranccsal:

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