Hızlı Başlangıç: Azure HorizonDB için Java ve JDBC kullanma (Önizleme)

Bu makalede, Azure HorizonDB (Önizleme) içinde bilgi depolamak ve almak için Java ve JDBC kullanan örnek bir uygulamanın nasıl oluşturulacağı gösterilmektedir.

JDBC, geleneksel ilişkisel veritabanlarına bağlanmak için standart Java API'dir.

Bu makaledeki adımlar PostgreSQL kimlik doğrulamasını içerir.

PostgreSQL kimlik doğrulaması PostgreSQL'de depolanan hesapları kullanır ve parolaların döndürmesini kendiniz yönetmeniz gerekir.

Prerequisites

Çalışma ortamını hazırlama

İlk olarak, bazı ortam değişkenlerini ayarlamak için aşağıdaki komutu kullanın.

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>

Yer tutucuları, bu makale boyunca kullanılan aşağıdaki değerlerle değiştirin:

  • <YOUR_DATABASE_CLUSTER_NAME>: Azure Aboneliğiniz ve Kaynak Grubunuz genelinde benzersiz olması gereken Azure HorizonDB kümenizin adı.
  • <YOUR_DATABASE_NAME>: Azure HorizonDB kümenizde kullandığınız veritabanı adı.
  • <YOUR_AZURE_REGION>: Kullanılacak Azure bölgesi. Varsayılan olarak kullanabilirsiniz australiaeast , ancak yaşadığınız yere daha yakın bir bölge yapılandırabilirsiniz. az account list-locations girerek kullanılabilir bölgelerin tam listesini görebilirsiniz.
  • <YOUR_POSTGRESQL_ADMIN_PASSWORD> ve <YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>: Azure HorizonDB kümenizin parolası. Bu parola en az sekiz karakter uzunluğunda olmalıdır. Karakterler şu üç kategoriden olmalıdır: İngilizce büyük harfler, İngilizce küçük harfler, sayılar (0-9) ve büyük harf olmayan karakterler (!, $, #, %, vb.).
  • <YOUR_LOCAL_IP_ADDRESS>: Spring Boot uygulamanızı çalıştırdığınız yerel bilgisayarınızın IP adresi. Bunu bulmanın kullanışlı bir yolu whatismyip.akamai.com açmaktır.

Ardından, aşağıdaki komutu kullanarak bir kaynak grubu oluşturun:

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

Azure HorizonDB kümesi oluşturma

Note

Kaynak adlarında (örneğin, tablo adı, veritabanı adı) ve kaynak etiketlerinde kişisel, hassas veya gizli bilgi eklemeyin. Bu alanlara girdiğiniz veriler müşteri veri olarak kabul edilmez.

Aşağıdaki bölümlerde veritabanı kümenizin nasıl oluşturulacağı ve yapılandırıldığı açıklanmaktadır.

Azure HorizonDB kümesi oluşturma

Yönetici kullanıcıyı ayarlama

İlk olarak, bir yönetilen Azure HorizonDB örneği oluşturun.

Note

Azure HorizonDB oluşturma hakkında daha ayrıntılı bilgi için bkz. Azure HorizonDB kümesi oluşturma.

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

Bu komut küçük bir Azure HorizonDB kümesi oluşturur.

Sorun mu yaşıyorsunuz? Bize bildirin.

Azure HorizonDB örneğin için güvenlik duvarı kuralı yapılandırma

Azure HorizonDB örnekleri varsayılan olarak güvenlidir. Tüm gelen bağlantıları engelleyen bir güvenlik duvarı vardır. Veritabanınızı kullanmak için, yerel IP adresinize veritabanı sunucusuna erişim veren bir güvenlik duvarı kuralı ekleyin.

Bu makalenin başında yerel IP adresinizi yapılandırdığınızdan, aşağıdaki komutu çalıştırarak sunucunun güvenlik duvarını açabilirsiniz:

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

Windows bir bilgisayarda Linux için Windows Alt Sistemi 'den (WSL) Azure HorizonDB kümenize bağlanıyorsanız, WSL ana bilgisayar kimliğini güvenlik duvarınıza eklemeniz gerekir.

WSL'de aşağıdaki komutu çalıştırarak konak makinenizin IP adresini alın:

cat /etc/resolv.conf

terimini nameserverizleyen IP adresini kopyalayın ve WSL IP adresi için bir ortam değişkeni ayarlamak için aşağıdaki komutu kullanın:

AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Ardından aşağıdaki komutu kullanarak sunucunun güvenlik duvarını WSL tabanlı uygulamanızda açın:

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 veritabanı oluşturma

Kümenizde yeni bir veritabanı oluşturmak için create_database.sql adlı bir SQL betiği oluşturun. Aşağıdaki içeriği ekleyin ve dosyayı yerel olarak kaydedin:

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

Azure HorizonDB tam nitelikli etki alanı adınızı almak ve clusterName değerini kopyalamak için bu komutu çalıştırın:

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

clusterName Değerini kopyalayın ve aşağıdaki komutta kullanın:

AZ_HORIZONDB_FQDN=<the-copied-clusterName-value>

Ardından, SQL betiğini yürütmek ve veritabanınızı oluşturmak için aşağıdaki komutu çalıştırın:

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

Şimdi geçici SQL betik dosyasını silmek için aşağıdaki komutu çalıştırın:

rm create_database.sql

Azure HorizonDB yönetici olmayan kullanıcı oluşturma ve izin verme

Ardından, yönetici olmayan bir kullanıcı oluşturun ve veritabanına tüm izinleri verin.

Yönetici olmayan bir kullanıcı oluşturmak için create_user.sql adlı bir SQL betiği oluşturun. Aşağıdaki içeriği ekleyin ve dosyayı yerel olarak kaydedin:

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

Ardından sql betiğini yürütmek ve yönetici olmayan Microsoft Entra kullanıcı oluşturmak için aşağıdaki komutu çalıştırın:

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

Şimdi geçici SQL betik dosyasını silmek için aşağıdaki komutu çalıştırın:

rm create_user.sql

Yeni java projesi oluşturma

Sık kullandığınız IDE'yi kullanarak, Java 8 veya sonraki bir sürümü kullanarak yeni bir Java projesi oluşturun. Kök dizine aşağıdaki içeriklere sahip bir pom.xml dosyası ekleyin:

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

Bu dosya, projenizi kullanacak şekilde yapılandıran bir Apache Maven dosyasıdır:

  • Java 8
  • Java için son kullanılan bir PostgreSQL sürücüsü

Azure HorizonDB'ye bağlanmak için yapılandırma dosyası hazırlama

Src/main/resources/application.properties dosyası oluşturun ve aşağıdaki içeriği ekleyin:

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

Yapılandırma özelliği url , JDBC sürücüsünün veritabanına bağlanırken TLS (Aktarım Katmanı Güvenliği) kullanmasını sağlamayı içerir ?sslmode=require . Azure HorizonDB TLS gerektirir ve önerilen bir güvenlik uygulamasıdır.

Veritabanı şemasını oluşturmak için SQL dosyası oluşturma

Veritabanı şeması oluşturmak için src/main/resources/schema.sql dosyası kullanın. Bu dosyayı aşağıdaki içerikle oluşturun:

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

Uygulamayı kodlayın

Veritabanına bağlanın

Ardından, Azure HorizonDB örneğinizdeki verileri depolamak ve almak için JDBC kullanan Java kodunu ekleyin.

Src /main/java/DemoApplication.java dosyası oluşturun ve aşağıdaki içeriği ekleyin:

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

Sorun mu yaşıyorsunuz? Bize bildirin.

Bu Java kodu, Azure HorizonDB örneğine bağlanmak ve verilerimizi depolayan bir şema oluşturmak için application.properties ve daha önce oluşturduğumuz schema.sql dosyalarını kullanır.

Bu dosyada verileri eklemek, okumak, güncelleştirmek ve silmek için yöntemlere açıklama eklediğimizi görebilirsiniz: Bu yöntemleri bu makalenin geri kalanında kodlayacağız ve bunları birbiri ardına çözebileceksiniz.

Note

Veritabanı kimlik bilgileri, application.properties dosyasının kullanıcı ve parola özelliklerinde depolanır. Özellikler dosyası bağımsız değişken olarak geçirildiğinden, bu kimlik bilgileri DriverManager.getConnection(properties.getProperty("url"), properties); çalıştırıldığında kullanılır.

Artık bu ana sınıfı sık kullandığınız araçla yürütebilirsiniz:

  • IDE'nizi kullanarak DemoApplication sınıfına sağ tıklayıp bunu yürütebilmeniz gerekir.
  • Maven kullanarak şu komutu yürüterek uygulamayı çalıştırabilirsiniz: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Uygulamanın Azure HorizonDB örneğine bağlanması, bir veritabanı şeması oluşturması ve ardından konsol günlüklerinde görebileceğiniz gibi bağlantıyı kapatması gerekir:

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

Etki alanı sınıfı oluşturma

sınıfının yanında Todo yeni DemoApplication bir Java sınıfı oluşturun ve aşağıdaki kodu ekleyin:

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

Bu sınıf, todo tablosuna eşlenen ve schema.sql betiğini çalıştırırken oluşturduğunuz bir etki alanı modelidir.

Azure HorizonDB'ye veri ekleme

src/main/java/DemoApplication.java dosyasında, main yönteminden sonra veritabanına veri eklemek için aşağıdaki yöntemi ekleyin:

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

Artık main yöntemindeki aşağıdaki iki satırın yorumlarını kaldırabilirsiniz:

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

Ana sınıfın yürütülmesi artık aşağıdaki çıkışı üretmelidir:

[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 HorizonDB'den veri okuma

Kodumuzun düzgün çalıştığını doğrulamak için daha önce eklenen verileri okuyalım.

src/main/java/DemoApplication.java dosyasında, yönteminden insertData sonra veritabanındaki verileri okumak için aşağıdaki yöntemi ekleyin:

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

Artık main metodunda aşağıdaki satırı yorum dışı bırakabilirsiniz.

todo = readData(connection);

Ana sınıfın yürütülmesi artık aşağıdaki çıkışı üretmelidir:

[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 HorizonDB'de verileri güncelleştirme

Şimdi daha önce eklediğimiz verileri güncelleştirelim.

Hala src/main/java/DemoApplication.java dosyasında, readData yönteminden sonra veritabanındaki verileri güncellemek için aşağıdaki yöntemi ekleyin:

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

Artık main yöntemindeki aşağıdaki iki satırın yorumlarını kaldırabilirsiniz:

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

Ana sınıfın yürütülmesi artık aşağıdaki çıkışı üretmelidir:

[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 HorizonDB'de verileri silme

Son olarak, daha önce eklediğimiz verileri silelim.

Src/main/java/DemoApplication.java dosyasında, yönteminden updateData sonra veritabanının içindeki verileri silmek için aşağıdaki yöntemi ekleyin:

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

Artık main metodunda aşağıdaki satırı yorum dışı bırakabilirsiniz.

deleteData(todo, connection);

Ana sınıfın yürütülmesi artık aşağıdaki çıkışı üretmelidir:

[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

Kaynakları temizle

Tebrikler! Bir Azure HorizonDB örneğinden veri depolamak ve almak için JDBC kullanan bir Java uygulaması oluşturdunuz.

Bu hızlı başlangıç sırasında kullanılan tüm kaynakları temizlemek için aşağıdaki komutu kullanarak kaynak grubunu silin:

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