Mulai cepat: Menggunakan Java dan JDBC di server fleksibel Azure Database for PostgreSQL

Artikel ini memperlihatkan cara membuat aplikasi sampel yang menggunakan Java dan JDBC untuk menyimpan dan mengambil informasi di Azure Database for PostgreSQL.

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

Artikel ini mencakup dua metode autentikasi: autentikasi Microsoft Entra dan autentikasi PostgreSQL. Tab Tanpa Kata Sandi memperlihatkan autentikasi Microsoft Entra dan tab Kata Sandi memperlihatkan autentikasi PostgreSQL.

Autentikasi Microsoft Entra adalah mekanisme untuk menyambungkan ke Azure Database for PostgreSQL menggunakan identitas yang ditentukan dalam ID Microsoft Entra. Dengan menggunakan autentikasi Microsoft Entra, Anda dapat mengelola identitas pengguna database dan layanan Microsoft lain di lokasi pusat, yang menyederhanakan manajemen izin.

Autentikasi PostgreSQL menggunakan akun yang disimpan di PostgreSQL. Jika Anda memilih untuk menggunakan kata sandi sebagai kredensial untuk akun, simpan kredensial ini user dalam tabel. Karena kata sandi ini disimpan di PostgreSQL, Anda perlu mengelola rotasi kata sandi sendiri.

Prasyarat

Menyiapkan lingkungan kerja

Pertama, gunakan perintah berikut untuk menyiapkan beberapa variabel lingkungan.

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)

Gantikan placeholder dengan nilai berikut, yang digunakan di seluruh artikel ini.

  • <YOUR_DATABASE_SERVER_NAME>: Nama server fleksibel Azure Database for PostgreSQL Anda, yang harus unik di seluruh Azure.
  • <YOUR_DATABASE_NAME>: Nama database dari server fleksibel Azure Database for PostgreSQL, yang harus unik di Azure.
  • <YOUR_AZURE_REGION>: Wilayah Azure yang akan digunakan. Anda dapat menggunakan eastus secara default, tetapi memilih wilayah yang lebih dekat dengan tempat Tinggal Anda. Untuk melihat daftar lengkap wilayah yang tersedia, masukkan az account list-locations.
  • <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>: Nama pengguna untuk server fleksibel Azure Database for PostgreSQL Anda. Pastikan nama pengguna adalah pengguna yang valid di penyewa Microsoft Entra Anda.
  • <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.

Penting

Saat mengatur <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>, pengguna harus sudah ada di penyewa Microsoft Entra Anda atau Anda tidak dapat membuat pengguna Microsoft Entra di database Anda.

Berikutnya, buat grup sumber daya menggunakan perintah berikut:

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

Membuat server fleksibel

Bagian berikut menjelaskan cara membuat dan mengonfigurasi instans database Anda.

Membuat server fleksibel dan menyiapkan pengguna admin

Nota

Untuk informasi selengkapnya tentang membuat server fleksibel Azure Database for PostgreSQL, lihat Mulai Cepat: Membuat server fleksibel Azure Database for PostgreSQL.

Jika Anda menggunakan Azure CLI, jalankan perintah berikut untuk memastikannya memiliki izin yang memadai:

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

Jalankan perintah berikut untuk membuat server:

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

Untuk menyiapkan administrator Microsoft Entra setelah membuat server, ikuti langkah-langkah dalam Mengelola peran Microsoft Entra di Azure Database for PostgreSQL.

Penting

Saat menyiapkan administrator, Anda menambahkan pengguna baru dengan hak akses administrator penuh ke database Azure milik server fleksibel Azure Database for PostgreSQL. Anda dapat membuat beberapa administrator Microsoft Entra untuk setiap server fleksibel Azure Database for PostgreSQL.

Memiliki masalah? Beri tahu kami.

Mengonfigurasi aturan firewall untuk instans Azure Database for PostgreSQL Anda

Server fleksibel Azure Database for PostgreSQL aman secara bawaan. 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 kami di awal artikel ini, Anda dapat membuka firewall server dengan menjalankan perintah berikut:

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

Jika Anda menyambungkan ke server fleksibel Azure Database for PostgreSQL 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 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

Konfigurasikan Azure Database for PostgreSQL

Buat database baru dengan menggunakan perintah berikut:

az postgres flexible-server db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --database-name $AZ_DATABASE_NAME \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --output tsv

Membuat pengguna non-admin di Azure Database for PostgreSQL dan memberikan izin akses

Selanjutnya, buat pengguna non-admin dan berikan semua izin ke database.

Nota

Untuk informasi selengkapnya tentang mengelola pengguna Azure Database for PostgreSQL, lihat Mengelola peran Microsoft Entra di Azure Database for PostgreSQL.

Buat skrip SQL bernama create_ad_user.sql untuk membuat pengguna non-admin. Tambahkan konten berikut dan simpan secara lokal:

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

Kemudian, gunakan perintah berikut untuk menjalankan skrip SQL dan membuat pengguna non-admin Microsoft Entra:

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

Gunakan perintah berikut untuk menghapus file skrip SQL sementara:

rm create_ad_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.7.5</version>
      </dependency>
      <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.2.0</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 Database for PostgreSQL

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

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

Nota

Properti konfigurasi url mencakup ?sslmode=require untuk memastikan bahwa driver JDBC menggunakan TLS (Transport Layer Security) saat menyambungkan ke database. Menggunakan TLS wajib dengan server fleksibel Azure Database for PostgreSQL dan merupakan 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, dan tambahkan konten berikut:

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

Kodekan aplikasi

Bagian berikut menelusuri penulisan kode Java yang tersambung ke database, menentukan model data, dan melakukan operasi CRUD dasar.

Sambungkan ke database

Selanjutnya, tambahkan kode Java yang menggunakan JDBC untuk menyimpan dan mengambil data dari server fleksibel Azure Database for PostgreSQL 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 application.properties dan file schema.sql yang Anda buat sebelumnya untuk menyambungkan ke server fleksibel Azure Database for PostgreSQL dan membuat skema yang menyimpan data.

Dalam file ini, metode untuk menyisipkan, membaca, memperbarui, dan menghapus data dikomentari. Sisa artikel ini berjalan melalui pengkodean metode tersebut, dan Anda dapat membatalkan komentar satu demi satu.

Nota

Informasi masuk database disimpan dalam properti pengguna dan kata sandi dari file application.properties. Kode menggunakan kredensial tersebut saat menjalankan DriverManager.getConnection(properties.getProperty("url"), properties);, karena file properti diteruskan sebagai argumen.

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

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

Aplikasi ini terhubung ke server fleksibel Azure Database for PostgreSQL, membuat skema database, lalu menutup koneksi, seperti yang 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

Buat kelas Java baru Todo di DemoApplication samping kelas, 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 ke todo tabel yang Anda buat saat menjalankan skrip schema.sql .

Menyisipkan data ke Azure Database for PostgreSQL

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

Ketika Anda menjalankan kelas utama, itu harus menghasilkan output 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

Baca data dari Azure Database for PostgreSQL

Untuk memvalidasi bahwa kode Anda berfungsi dengan benar, baca data yang sebelumnya Anda sisipkan.

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

Ketika Anda menjalankan kelas utama, itu harus menghasilkan output 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 Database for PostgreSQL

Untuk memperbarui data, gunakan langkah-langkah berikut.

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

Ketika Anda menjalankan kelas utama, itu harus menghasilkan output 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 Database for PostgreSQL

Terakhir, hapus data yang sebelumnya Anda 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);

Ketika Anda menjalankan kelas utama, itu harus menghasilkan output 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

Anda membuat aplikasi Java yang menggunakan JDBC untuk menyimpan dan mengambil data dari server fleksibel Azure Database for PostgreSQL.

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

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