Mulai cepat: Menggunakan Java dan JDBC untuk Azure HorizonDB (Pratinjau)

Artikel ini menunjukkan cara membuat aplikasi sampel yang menggunakan Java dan JDBC untuk menyimpan dan mengambil informasi di Azure HorizonDB (Pratinjau).

JDBC adalah API Java standar untuk menyambungkan ke database relasional tradisional.

Langkah-langkah dalam artikel ini mencakup autentikasi PostgreSQL.

Autentikasi PostgreSQL menggunakan akun yang disimpan di PostgreSQL, dan Anda perlu mengelola rotasi kata sandi sendiri.

Prerequisites

Menyiapkan lingkungan kerja

Pertama, gunakan perintah berikut untuk menyiapkan beberapa variabel lingkungan.

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>

Ganti placeholder dengan nilai berikut yang digunakan di seluruh artikel ini:

  • <YOUR_DATABASE_CLUSTER_NAME>: Nama kluster HorizonDB Azure Anda, yang harus unik di seluruh Langganan dan Grup Sumber Daya Azure Anda.
  • <YOUR_DATABASE_NAME>: Nama database yang Anda gunakan dalam kluster horizonDB Azure Anda.
  • <YOUR_AZURE_REGION>: Wilayah Azure yang akan digunakan. Anda dapat menggunakan australiaeast secara default, tetapi mengonfigurasi wilayah yang lebih dekat dengan tempat Anda tinggal. Anda dapat melihat daftar lengkap wilayah yang tersedia dengan memasukkan az account list-locations.
  • <YOUR_POSTGRESQL_ADMIN_PASSWORD> dan <YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>: Kata sandi kluster HorizonDB Azure Anda. Kata sandi itu harus memiliki minimal delapan karakter. Karakter harus berasal dari tiga kategori berikut: Huruf besar bahasa Inggris, huruf kecil bahasa Inggris, angka (0-9), dan karakter non-nufanumerik (!, $, #, %, dan sebagainya).
  • <YOUR_LOCAL_IP_ADDRESS>: Alamat IP komputer lokal Anda, tempat Anda menjalankan aplikasi Spring Boot Anda. Salah satu cara mudah untuk menemukannya adalah dengan membuka whatismyip.akamai.com.

Berikutnya, buat grup sumber daya menggunakan perintah berikut:

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

Membuat kluster HorizonDB Azure

Note

Jangan sertakan informasi pribadi, sensitif, atau rahasia dalam nama sumber daya (misalnya, nama tabel, nama database) dan tag sumber daya. Data yang Anda masukkan di kolom-kolom ini tidak dianggap sebagai data pelanggan.

Bagian berikut menjelaskan cara membuat dan mengonfigurasi kluster database Anda.

Membuat kluster HorizonDB Azure

Menyiapkan pengguna admin

Pertama, buat instans HorizonDB Azure terkelola.

Note

Untuk informasi selengkapnya tentang membuat Azure HorizonDB, lihat Buat kluster HorizonDB Azure.

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

Perintah ini membuat kluster HorizonDB Azure kecil.

Memiliki masalah? Beri tahu kami.

Mengonfigurasi aturan firewall untuk instans HorizonDB Azure Anda

Azure instans HorizonDB aman secara default. Mereka memiliki firewall yang memblokir semua koneksi masuk. Untuk menggunakan database Anda, tambahkan aturan firewall yang memberikan akses alamat IP lokal Anda ke server database.

Karena Anda mengonfigurasi alamat IP lokal di awal artikel ini, Anda dapat membuka firewall server dengan menjalankan perintah berikut:

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

Jika Anda tersambung ke kluster Azure HorizonDB dari Subsistem Windows untuk Linux (WSL) di komputer Windows, Anda perlu menambahkan ID host WSL ke firewall Anda.

Dapatkan alamat IP komputer host Anda dengan menjalankan perintah berikut di WSL:

cat /etc/resolv.conf

Salin alamat IP yang mengikuti istilah nameserver, lalu gunakan perintah berikut untuk mengatur variabel lingkungan untuk alamat IP WSL:

AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

Kemudian, gunakan perintah berikut untuk membuka firewall server ke aplikasi berbasis WSL Anda:

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

Membuat database Azure HorizonDB

Buat skrip SQL bernama create_database.sql untuk membuat database baru di kluster Anda. Tambahkan konten berikut dan simpan file secara lokal:

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

Jalankan perintah ini untuk mendapatkan nama domain Azure HorizonDB yang sepenuhnya memenuhi syarat dan salin nilai clusterName:

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

clusterName Salin nilai dan gunakan dalam perintah berikut:

AZ_HORIZONDB_FQDN=<the-copied-clusterName-value>

Kemudian, jalankan perintah berikut untuk menjalankan skrip SQL dan buat database Anda:

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

Sekarang, jalankan perintah berikut untuk menghapus file skrip SQL sementara:

rm create_database.sql

Membuat pengguna nonadmin Azure HorizonDB dan memberikan izin

Selanjutnya, buat pengguna nonadmin dan berikan semua izin ke database.

Buat skrip SQL bernama create_user.sql untuk membuat pengguna nonadmin. Tambahkan konten berikut dan simpan file secara lokal:

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

Kemudian, jalankan perintah berikut untuk menjalankan skrip SQL dan buat pengguna nonadmin Microsoft Entra:

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

Sekarang, jalankan perintah berikut untuk menghapus file skrip SQL sementara:

rm create_user.sql

Membuat proyek Java baru

Dengan menggunakan IDE favorit Anda, buat proyek Java baru dengan menggunakan Java 8 atau yang lebih baru. Tambahkan file pom.xml di direktori akar dengan konten berikut:

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

File ini adalah file Apache Maven yang mengonfigurasi proyek Anda untuk digunakan:

  • Java 8
  • Driver PostgreSQL terbaru untuk Java

Menyiapkan file konfigurasi untuk menyambungkan ke Azure HorizonDB

Buat file src/main/resources/application.properties , dan tambahkan konten berikut:

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

Properti konfigurasi url mencakup ?sslmode=require untuk memastikan bahwa driver JDBC menggunakan TLS (Transport Layer Security) saat menyambungkan ke database. Azure HorizonDB memerlukan TLS, dan ini adalah praktik keamanan yang direkomendasikan.

Membuat file SQL untuk menghasilkan skema database

Gunakan file src/main/resources/schema.sql untuk membuat skema database. Buat file tersebut dengan konten berikut:

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

Kodekan aplikasi

Sambungkan ke database

Selanjutnya, tambahkan kode Java yang menggunakan JDBC untuk menyimpan dan mengambil data dari instans HorizonDB Azure Anda.

Buat file src/main/java/DemoApplication.java dan tambahkan konten berikut:

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

Memiliki masalah? Beri tahu kami.

Kode Java ini menggunakan file application.properties dan file schema.sql yang kami buat sebelumnya, untuk terhubung ke instans HorizonDB Azure dan membuat skema yang menyimpan data kami.

Dalam file ini, Anda dapat melihat bahwa kami mengomentari metode untuk menyisipkan, membaca, memperbarui, dan menghapus data: kami akan mengodekan metode tersebut di sisa artikel ini, dan Anda akan dapat membatalkan komentar satu demi satu.

Note

Informasi masuk database disimpan dalam properti pengguna dan kata sandi dari file application.properties. Kredensial tersebut digunakan saat mengeksekusi DriverManager.getConnection(properties.getProperty("url"), properties);, karena file properti diberikan sebagai argumen.

Anda sekarang dapat menjalankan kelas utama ini dengan alat favorit Anda:

  • Menggunakan IDE Anda, Anda akan dapat mengklik kanan pada kelas DemoApplication dan menjalankannya.
  • Menggunakan Maven, Anda dapat menjalankan aplikasi dengan mengeksekusi: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Aplikasi harus terhubung ke instans Azure HorizonDB, membuat skema database, lalu menutup koneksi, seperti yang akan Anda lihat di log konsol:

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

Membuat kelas domain

Tambahkan kelas Java Todo baru, di samping kelas DemoApplication, dan tambahkan kode berikut:

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

Kelas ini adalah model domain yang dipetakan pada tabel todo yang Anda buat saat menjalankan skrip schema.sql.

Menyisipkan data ke dalam Azure HorizonDB

Dalam file src/main/java/DemoApplication.java, setelah metode utama, tambahkan metode berikut untuk menyisipkan data ke dalam database:

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

Anda sekarang dapat menghapus tanda komentar pada dua baris berikut di dalam metode main:

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

Menjalankan kelas utama sekarang harus menghasilkan keluaran berikut:

[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

Membaca data dari Azure HorizonDB

Mari kita baca data yang sebelumnya disisipkan, untuk memvalidasi bahwa kode kami berfungsi dengan benar.

Dalam file src/main/java/DemoApplication.java, setelah metode insertData, tambahkan metode berikut untuk membaca data dari database:

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

Anda sekarang dapat menghapus komentar pada dua baris berikut di dalam metode main:

todo = readData(connection);

Menjalankan kelas utama sekarang harus menghasilkan keluaran berikut:

[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

Memperbarui data di Azure HorizonDB

Mari kita perbarui data yang sebelumnya kita sisipkan.

Masih dalam file src/main/java/DemoApplication.java, setelah metode readData, tambahkan metode berikut untuk memperbarui data di dalam database:

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

Anda sekarang dapat menghapus tanda komentar pada dua baris berikut di dalam metode main:

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

Menjalankan kelas utama sekarang harus menghasilkan keluaran berikut:

[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

Menghapus data di Azure HorizonDB

Terakhir, mari kita hapus data yang sebelumnya kita sisipkan.

Masih dalam file src/main/java/DemoApplication.java, setelah metode updateData, tambahkan metode berikut untuk menghapus data di dalam database:

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

Anda sekarang dapat menghapus komentar pada dua baris berikut di dalam metode main:

deleteData(todo, connection);

Menjalankan kelas utama sekarang harus menghasilkan keluaran berikut:

[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

Membersihkan sumber daya

Selamat! Anda telah membuat aplikasi Java yang menggunakan JDBC untuk menyimpan dan mengambil data dari instans HorizonDB Azure.

Untuk membersihkan semua sumber daya yang digunakan selama mulai cepat ini, hapus grup sumber daya menggunakan perintah berikut:

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