Hızlı Başlangıç: PostgreSQL için Azure Veritabanı ile Java ve JDBC kullanma

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Tek Sunucu

Önemli

PostgreSQL için Azure Veritabanı - Tek Sunucu kullanımdan kaldırma yolundadır. PostgreSQL için Azure Veritabanı - Esnek Sunucu'ya yükseltmenizi kesinlikle öneririz. PostgreSQL için Azure Veritabanı - Esnek Sunucu'ya geçiş hakkında daha fazla bilgi için bkz. PostgreSQL için Azure Veritabanı Tek Sunucuya ne oluyor?.

Bu makalede, bilgileri PostgreSQL için Azure Veritabanı 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 makalede iki kimlik doğrulama yöntemi ekleyeceğiz: Microsoft Entra kimlik doğrulaması ve PostgreSQL kimlik doğrulaması. Parolasız sekmesi Microsoft Entra kimlik doğrulamasını, Parola sekmesi ise PostgreSQL kimlik doğrulamasını gösterir.

Microsoft Entra kimlik doğrulaması, Microsoft Entra Kimliği'nde tanımlanan kimlikleri kullanarak PostgreSQL için Azure Veritabanı bağlanmaya yönelik bir mekanizmadır. Microsoft Entra kimlik doğrulaması ile veritabanı kullanıcı kimliklerini ve diğer Microsoft hizmetleri merkezi bir konumda yönetebilir ve bu da izin yönetimini basitleştirir.

PostgreSQL kimlik doğrulaması PostgreSQL'de depolanan hesapları kullanır. Hesaplar için kimlik bilgileri olarak parolaları kullanmayı seçerseniz, bu kimlik bilgileri tabloda depolanır user . Bu parolalar PostgreSQL'de depolandığından, parolaların döndürmesini kendiniz yönetmeniz gerekir.

Önkoşullar

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

İlk olarak, bazı ortam değişkenlerini ayarlayın. Azure Cloud Shell'de aşağıdaki komutları çalıştırın:

export AZ_RESOURCE_GROUP=database-workshop
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
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)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id -o tsv)

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

  • <YOUR_DATABASE_SERVER_NAME>: Azure genelinde benzersiz olması gereken PostgreSQL sunucunuzun adı.
  • <YOUR_AZURE_REGION>: Kullanacağınız Azure bölgesi. Varsayılan olarak eastus kullanabilirsiniz ancak bölgeyi, yaşadığınız yere yakın bir yerde yapılandırmanızı öneririz. girerek az account list-locationskullanılabilir bölgelerin tam listesini görebilirsiniz.
  • <YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME>: PostgreSQL veritabanı sunucunuzun kullanıcı adı. Kullanıcı adının Microsoft Entra kiracınızda geçerli bir kullanıcı olduğundan emin olun.
  • <YOUR_LOCAL_IP_ADDRESS>: Spring Boot uygulamanızı çalıştırabileceğiniz yerel bilgisayarınızın IP adresi. Bunu bulmanın kullanışlı yollarından biri whatismyip.akamai.com açmaktır.

Önemli

YOUR_POSTGRESQL_AD_NON_ADMIN_USERNAME> ayarlarken<, kullanıcı adı Microsoft Entra kiracınızda zaten mevcut olmalıdır, aksi takdirde veritabanınızda bir Microsoft Entra kullanıcısı oluşturamazsınız.

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

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

PostgreSQL için Azure Veritabanı örneği oluşturma

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

PostgreSQL sunucusu oluşturma ve yönetici kullanıcıyı ayarlama

Oluşturacağınız ilk şey, yönetici kullanıcılı yönetilen bir PostgreSQL sunucusudur.

Not

Azure portalını kullanarak PostgreSQL için Azure Veritabanı sunucusu oluşturma bölümünde PostgreSQL sunucuları oluşturma hakkında daha ayrıntılı bilgi edinebilirsiniz.

Azure CLI kullanıyorsanız, yeterli izne sahip olduğundan emin olmak için aşağıdaki komutu çalıştırın:

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

Ardından aşağıdaki komutu çalıştırarak sunucuyu oluşturun:

az postgres server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --output tsv

Şimdi Microsoft Entra yönetici kullanıcısını ayarlamak için aşağıdaki komutu çalıştırın:

az postgres server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server-name $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

Önemli

Yöneticiyi ayarlarken, tam yönetici izinleriyle PostgreSQL için Azure Veritabanı sunucusuna yeni bir kullanıcı eklenir. PostgreSQL sunucusu başına yalnızca bir Microsoft Entra yöneticisi oluşturulabilir ve başka bir yöneticinin seçilmesi, sunucu için yapılandırılan mevcut Microsoft Entra yöneticisinin üzerine yazılır.

Bu komut küçük bir PostgreSQL sunucusu oluşturur ve Active Directory yöneticisini oturum açmış kullanıcıya ayarlar.

PostgreSQL sunucunuz için güvenlik duvarı kuralı yapılandırma

PostgreSQL için Azure Veritabanı örnekleri varsayılan olarak güvenlidir. Gelen bağlantılara izin vermeyen bir güvenlik duvarı vardır. Veritabanınızı kullanabilmek için yerel IP adresinin veritabanı sunucusuna erişmesine izin veren bir güvenlik duvarı kuralı eklemeniz gerekir.

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 postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

PostgreSQL sunucunuza windows bilgisayarda Linux için Windows Alt Sistemi (WSL) üzerinden 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

teriminden nameserversonra IP adresini kopyalayın ve WSL IP Adresi için bir ortam değişkeni ayarlamak üzere 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 postgres server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_SERVER_NAME \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

PostgreSQL veritabanı yapılandırma

Daha önce oluşturduğunuz PostgreSQL sunucusu boş. Yeni bir veritabanı oluşturmak için aşağıdaki komutu kullanın.

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

PostgreSQL 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.

Not

PostgreSQL kullanıcıları oluşturma hakkında daha ayrıntılı bilgileri PostgreSQL için Azure Veritabanı'de kullanıcı oluşturma bölümünden okuyabilirsiniz.

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

cat << EOF > create_ad_user.sql
SET aad_validate_oids_in_tenant = off;
CREATE ROLE "$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME" WITH LOGIN IN ROLE azure_ad_user;
GRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO "$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME";
EOF

Ardından aşağıdaki komutu kullanarak SQL betiğini çalıştırarak Microsoft Entra yönetici olmayan kullanıcıyı oluşturun:

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME@$AZ_DATABASE_SERVER_NAME dbname=$AZ_DATABASE_NAME port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user.sql

Şimdi geçici SQL betik dosyasını kaldırmak için aşağıdaki komutu kullanın:

rm create_ad_user.sql

Yeni java projesi oluşturma

Sık kullandığınız IDE'yi kullanarak Java 8 veya üzerini kullanarak yeni bir Java projesi oluşturun ve kök dizinine 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>
      <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
</project>

Bu dosya, projenizi Java 8 ve java için son kullanılan postgreSQL sürücüsünü kullanacak şekilde yapılandıran bir Apache Maven dosyasıdır.

PostgreSQL için Azure Veritabanı bağlanmak için yapılandırma dosyası hazırlama

Bir 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_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}@${AZ_DATABASE_SERVER_NAME}
EOF

Not

Yapılandırma özelliği url?sslmode=require , JDBC sürücüsüne veritabanına bağlanırken TLS (Aktarım Katmanı Güvenliği) kullanmasını bildirmek için eklenmiştir. TLS kullanmak PostgreSQL için Azure Veritabanı zorunludur ve iyi 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ı kullanacaksınız. Bu dosyayı oluşturun ve aşağıdaki içeriği ekleyin:

cat << EOF > src/main/resources/schema.sql
DROP TABLE IF EXISTS todo;
CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
EOF

Uygulamayı kodlama

Veritabanına bağlanın

Ardından, PostgreSQL sunucunuzdan veri depolamak ve almak için JDBC kullanacak 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());
        }

        /* Prepare for data processing in the PostgreSQL server.
        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();
    }
}

Bu Java kodu, PostgreSQL sunucusuna bağlanmak ve verilerinizi depolayacak bir şema oluşturmak için daha önce oluşturduğunuz application.properties ve schema.sql dosyalarını kullanır.

Bu dosyada verileri ekleme, okuma, güncelleştirme ve silme yöntemlerine açıklama eklediğimizi görebilirsiniz. Bu makalenin geri kalanında bu yöntemleri kodlayacaksınız ve bunları ardı ardına kaldırabileceksiniz.

Not

Veritabanı kimlik bilgileri application.properties dosyasının user ve password özelliklerinde depolanır. Özellikler dosyası bağımsız değişken olarak geçirildiğinden, bu kimlik bilgileri yürütülürken DriverManager.getConnection(properties.getProperty("url"), properties);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 aşağıdaki komutu kullanarak uygulamayı çalıştırabilirsiniz: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Uygulama PostgreSQL için Azure Veritabanı bağlanmalı, bir veritabanı şeması oluşturmalı ve ardından konsol günlüklerinde görebileceğiniz gibi bağlantıyı kapatmalıdır:

[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 DemoApplication yeni Todo 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, schema.sql betiğini yürütürken oluşturduğunuz tabloya todoeşlenen bir etki alanı modelidir.

PostgreSQL için Azure Veritabanı'a 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 yönteminde aşağıdaki iki satırın açıklamalarını main 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

PostgreSQL için Azure Veritabanı'dan veri okuma

Kodunuzun düzgün çalıştığını doğrulamak için daha önce eklediğiniz verileri okuyun.

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 yönteminde aşağıdaki satırın açıklamasını main kaldırabilirsiniz:

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 

PostgreSQL için Azure Veritabanı'da verileri güncelleştirme

Ardından, daha önce eklediğiniz verileri güncelleştirin.

Src/main/java/DemoApplication.java dosyasında, yönteminden sonra veritabanının readData içindeki verileri güncelleştirmek 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 yönteminde aşağıdaki iki satırın açıklamalarını main 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 

PostgreSQL için Azure Veritabanı'da verileri silme

Son olarak, daha önce eklediğiniz verileri silin.

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 yönteminde aşağıdaki satırın açıklamasını main kaldırabilirsiniz:

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ı temizleme

Tebrikler! PostgreSQL için Azure Veritabanı verileri 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

Sonraki adımlar