Rövid útmutató: Java és JDBC használata Azure HorizonDB-hez (előzetes verzió)

Ez a cikk bemutatja, hogyan hozhat létre egy mintaalkalmazást, amely Java és JDBC használatával információkat tárol és kér le a(z) Azure HorizonDB (Preview) szolgáltatásban.

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

A cikkben szereplő lépések közé tartozik a PostgreSQL-hitelesítés.

A PostgreSQL-hitelesítés a PostgreSQL-ben tárolt fiókokat használja, és önnek kell kezelnie a jelszavak rotálását.

Prerequisites

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_CLUSTER_NAME=<YOUR_DATABASE_CLUSTER_NAME>
export AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
export AZ_LOCATION=<YOUR_AZURE_REGION>
export AZ_POSTGRESQL_ADMIN_USERNAME=demo
export AZ_POSTGRESQL_ADMIN_PASSWORD=<YOUR_POSTGRESQL_ADMIN_PASSWORD>
export AZ_POSTGRESQL_NON_ADMIN_USERNAME=demo-non-admin
export AZ_POSTGRESQL_NON_ADMIN_PASSWORD=<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>
export AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>

Cserélje ki a helyőrzőket a következő értékekkel, amelyeket a cikk során használunk:

  • <YOUR_DATABASE_CLUSTER_NAME>: Az Azure HorizonDB-fürtjének neve, amelynek egyedinek kell lennie az Azure-előfizetésén és erőforráscsoportján belül.
  • <YOUR_DATABASE_NAME>: Az Azure HorizonDB-fürtben használt adatbázis neve.
  • <YOUR_AZURE_REGION>: A használni kívánt Azure-régió. Alapértelmezés szerint használhatja australiaeast , de konfigurálhat egy olyan régiót, amely közelebb van a lakóhelyéhez. Az elérhető régiók teljes listáját a beírással az account list-locationstekintheti meg.
  • <YOUR_POSTGRESQL_ADMIN_PASSWORD> és <YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>: A Azure HorizonDB-fürt jelszava. A jelszónak legalább nyolc karakterből kell állnia. A karaktereknek a következő kategóriákból kell származnia: angol nagybetűk, angol kisbetűk, számok (0-9) és nonalphanumerikus karakterek (!, $, #, %stb.).
  • <YOUR_LOCAL_IP_ADDRESS>: A helyi számítógép IP-címe, amelyről a Spring Boot-alkalmazást futtatja. Az egyik kényelmes módja annak, hogy ezt megtalálja, ha megnyitja a whatismyip.akamai.com oldalt.

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

Azure HorizonDB-fürt létrehozása

Note

Ne tegyél fel személyes, érzékeny vagy bizalmas információkat az erőforrás nevekben (például táblanév, adatbázis név) és az erőforrás címkékben. Ezekben a mezőkben beírt adatokat nem tekintik ügyféladatoknak.

Az alábbi szakaszok az adatbázisfürt létrehozását és konfigurálását ismertetik.

Azure HorizonDB-fürt létrehozása

Rendszergazdai felhasználó beállítása

Először hozzon létre egy felügyelt Azure HorizonDB-példányt.

Note

A Azure HorizonDB létrehozásáról további információt Azure HorizonDB-fürt létrehozása című témakörben talál.

az horizondb create \
  --resource-group $AZ_RESOURCE_GROUP \
  --name $AZ_DATABASE_CLUSTER_NAME \
  --location $AZ_LOCATION \
  --version 17 \
  --administrator-login $AZ_POSTGRESQL_ADMIN_USERNAME \
  --administrator-login-password $AZ_POSTGRESQL_ADMIN_PASSWORD \
  --v-cores 2 \
  --yes \
  --output tsv

Ez a parancs létrehoz egy kis Azure HorizonDB-fürtöt.

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

Tűzfalszabály konfigurálása a Azure HorizonDB-példányhoz

Azure HorizonDB-példányok alapértelmezés szerint biztonságosak. Van egy tűzfaluk, amely blokkolja az összes bejövő kapcsolatot. Az adatbázis használatához adjon hozzá egy tűzfalszabályt, amely hozzáférést biztosít a helyi IP-címnek 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 horizondb firewall-rule create \
  --resource-group $AZ_RESOURCE_GROUP \
  --cluster-name $AZ_DATABASE_CLUSTER_NAME \
  --firewall-rule-name $AZ_DATABASE_CLUSTER_NAME-database-allow-local-ip \
  --start-ip-address $AZ_LOCAL_IP_ADDRESS \
  --end-ip-address $AZ_LOCAL_IP_ADDRESS \
  --output tsv

Ha Azure HorizonDB-fürthöz 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.

A következő parancs WSL-ben való futtatásával kérje le a gazdagép IP-címét:

cat /etc/resolv.conf

Másolja ki a kifejezést nameserverkövető IP-címet, 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 horizondb firewall-rule create \
  --resource-group $AZ_RESOURCE_GROUP \
  --cluster-name $AZ_DATABASE_CLUSTER_NAME \
  --firewall-rule-name $AZ_DATABASE_CLUSTER_NAME-database-allow-local-ip \
  --start-ip-address $AZ_WSL_IP_ADDRESS \
  --end-ip-address $AZ_WSL_IP_ADDRESS \
  --output tsv

Azure HorizonDB-adatbázis létrehozása

Hozzon létre egy create_database.sql nevű SQL-szkriptet, amely új adatbázist hoz létre a fürtjében. Adja hozzá a következő tartalmat, és mentse a fájlt helyileg:

cat << EOF > create_database.sql
CREATE DATABASE "$AZ_DATABASE_NAME";
EOF

Futtassa ezt a parancsot az Azure HorizonDB teljesen minősített tartománynevének lekéréséhez, majd másolja ki a clusterName értéket:

az horizondb show \
  --resource-group $AZ_RESOURCE_GROUP \
  --name $AZ_DATABASE_CLUSTER_NAME \
  --query "{clusterName:properties.fullyQualifiedDomainName, adminUser:properties.administratorLogin}" \
  --output table

Másolja ki az clusterName értéket, és használja a következő parancsban:

AZ_HORIZONDB_FQDN=<the-copied-clusterName-value>

Ezután futtassa a következő parancsot az SQL-szkript végrehajtásához és az adatbázis létrehozásához:

psql "host=$AZ_HORIZONDB_FQDN user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require" < create_database.sql

Most futtassa a következő parancsot az ideiglenes SQL-szkriptfájl törléséhez:

rm create_database.sql

Azure HorizonDB-felhasználó létrehozása és engedélyek megadása

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

Hozzon létre egy create_user.sql nevű SQL-szkriptet egy nem admin felhasználó létrehozásához. Adja hozzá a következő tartalmat, és mentse a fájlt helyileg:

cat << EOF > create_user.sql
CREATE ROLE "$AZ_POSTGRESQL_NON_ADMIN_USERNAME" WITH LOGIN PASSWORD '$AZ_POSTGRESQL_NON_ADMIN_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO "$AZ_POSTGRESQL_NON_ADMIN_USERNAME";
EOF

Ezután futtassa a következő parancsot az SQL-szkript végrehajtásához, és hozza létre a Microsoft Entra nem admin felhasználót:

psql "host=$AZ_HORIZONDB_FQDN user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require" < create_user.sql

Most futtassa a következő parancsot az ideiglenes SQL-szkriptfájl törléséhez:

rm create_user.sql

Új Java-projekt létrehozása

A kedvenc IDE használatával hozzon létre egy új Java projektet Java 8-at vagy újabb verziót használva. Adjon hozzá egy pom.xml fájlt a gyökérkönyvtárban 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.3.6</version>
      </dependency>
    </dependencies>
</project>

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

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

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

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

cat << EOF > src/main/resources/application.properties
url=jdbc:postgresql://${AZ_HORIZONDB_FQDN}:5432/${AZ_DATABASE_NAME}?sslmode=require
user=${AZ_POSTGRESQL_NON_ADMIN_USERNAME}
password=${AZ_POSTGRESQL_NON_ADMIN_PASSWORD}
EOF

Note

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. Azure A HorizonDB-hez TLS szükséges, és ez egy 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 használjon src/main/resources/schema.sql fájlt. Hozza létre a fájlt a következő tartalommal:

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

Az alkalmazás kódolása

Csatlakozás az adatbázishoz

Ezután adja hozzá az Java kódot, amely JDBC használatával tárolja és kéri le az adatokat a Azure HorizonDB-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 application.properties és a korábban létrehozott schema.sql fájlok használatával csatlakozik a Azure HorizonDB-példányhoz, és létrehoz 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 fogjuk látni, és egymás után feloldhatja őket.

Note

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 Azure HorizonDB-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 az todo táblán van leképezve, amelyet a schema.sql szkript végrehajtásakor hoztál létre.

Adatok beszúrása Azure HorizonDB-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 visszavonhatja a két következő sor kommentelését 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 Azure HorizonDB-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 Azure HorizonDB-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 visszavonhatja a két következő sor kommentelését 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 Azure HorizonDB-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

Erőforrások tisztítása

Gratulálok! Létrehozott egy Java alkalmazást, amely JDBC használatával tárolja és kéri le az adatokat egy Azure HorizonDB-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