Azure SQL Veritabanı ile Java ve JDBC kullanma

Bu konuda, Azure SQL Veritabanı'da bilgi depolamak ve almak için Java ve JDBC kullanan örnek bir uygulama oluşturma gösterilmektedir.

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

Önkoşullar

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

Yazma hatalarını sınırlamak ve aşağıdaki yapılandırmayı ihtiyaçlarınıza göre özelleştirmenizi kolaylaştırmak için ortam değişkenlerini kullanacağız.

Aşağıdaki komutları kullanarak bu ortam değişkenlerini ayarlayın:

AZ_RESOURCE_GROUP=database-workshop
AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>
AZ_LOCATION=<YOUR_AZURE_REGION>
AZ_SQL_SERVER_USERNAME=demo
AZ_SQL_SERVER_PASSWORD=<YOUR_AZURE_SQL_PASSWORD>
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_NAME>: Azure SQL Veritabanı sunucunuzun adı. Azure genelinde benzersiz olmalıdır.
  • <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 listesine sahip olabilirsiniz.
  • <AZ_SQL_SERVER_PASSWORD>: Azure SQL Veritabanı sunucunuzun 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 alfasayısal olmayan karakterler (!, $, #, %, vb.).
  • <YOUR_LOCAL_IP_ADDRESS>: Java uygulamanızı çalıştırabileceğiniz yerel bilgisayarınızın IP adresi. Bunu bulmanın kullanışlı yollarından biri, tarayıcınızı whatismyip.akamai.com işaret etmektir.

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

az group create \
    --name $AZ_RESOURCE_GROUP \
    --location $AZ_LOCATION \
    | jq

Dekont

JSON verilerini görüntülemek ve daha okunabilir hale getirmek için yardımcı programını kullanırız jq . Bu yardımcı program, Azure Cloud Shell'de varsayılan olarak yüklenir. Bu yardımcı programı beğenmezseniz kullanacağımız tüm komutlardan | jq bölümünü kaldırabilirsiniz.

Azure SQL Veritabanı örneği oluşturma

İlk olarak yönetilen bir Azure SQL Veritabanı sunucusu oluşturacağız.

Dekont

Hızlı Başlangıç: Tek Azure SQL Veritabanı veritabanı oluşturma makalesinde Azure SQL Veritabanı sunucuları oluşturma hakkında daha ayrıntılı bilgileri okuyabilirsiniz.

Azure Cloud Shell'de aşağıdaki komutu çalıştırın:

az sql server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --admin-user $AZ_SQL_SERVER_USERNAME \
    --admin-password $AZ_SQL_SERVER_PASSWORD \
    | jq

Bu komut bir Azure SQL Veritabanı sunucusu oluşturur.

Azure SQL Veritabanı sunucunuz için güvenlik duvarı kuralı yapılandırma

Azure SQL 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 adresimizi yapılandırdığınızdan, aşağıdaki komutu çalıştırarak sunucunun güvenlik duvarını açabilirsiniz:

az sql server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME-database-allow-local-ip \
    --server $AZ_DATABASE_NAME \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    | jq

Azure SQL veritabanı yapılandırma

Daha önce oluşturduğunuz Azure SQL Veritabanı sunucusu boş. Java uygulamasıyla kullanabileceğiniz bir veritabanı yoktur. Aşağıdaki komutu çalıştırarak adlı demo yeni bir veritabanı oluşturun:

az sql db create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name demo \
    --server $AZ_DATABASE_NAME \
    | jq

Yeni java projesi oluşturma

Sık kullandığınız IDE'yi kullanarak yeni bir Java projesi oluşturun ve kök dizinine bir pom.xml dosya 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>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>12.4.2.jre11</version>
        </dependency>
    </dependencies>
</project>

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

  • Java 17
  • Java için yeni bir SQL Server sürücüsü

Azure SQL veritabanına bağlanmak için yapılandırma dosyası hazırlama

Src /main/resources/application.properties dosyası oluşturun ve şunları ekleyin:

url=jdbc:sqlserver://$AZ_DATABASE_NAME.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
user=demo@$AZ_DATABASE_NAME
password=$AZ_SQL_SERVER_PASSWORD
  • İki $AZ_DATABASE_NAME değişkeni bu makalenin başında yapılandırdığınız değerle değiştirin.
  • değişkenini $AZ_SQL_SERVER_PASSWORD bu makalenin başında yapılandırdığınız değerle değiştirin.

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

Veritabanı şeması oluşturmak için src /main/resources/schema.sql dosyası kullanacağız. Aşağıdaki içerikle bu dosyayı oluşturun:

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

Uygulamayı kodlama

Veritabanına bağlanın

Ardından, Azure SQL veritabanınızdaki verileri depolamak ve almak için JDBC kullanacak Java kodunu ekleyin.

Aşağıdakileri içeren bir src/main/java/com/example/demo/DemoApplication.java dosyası oluşturun:

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

Bu Java kodu, SQL Server veritabanına bağlanmak ve verilerimizi depolayacak bir şema oluşturmak için daha önce oluşturduğumuz application.properties ve 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.

Dekont

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 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 şu komutu yürüterek uygulamayı çalıştırabilirsiniz: mvn package exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Uygulama Azure SQL 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.

Azure SQL veritabanına 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

Azure SQL veritabanından 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 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 

Azure SQL Veritabanı'da verileri güncelleştirme

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

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 

Azure SQL veritabanındaki 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 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 

Sonuç ve kaynakları temizleme

Tebrikler! Azure SQL veritabanından 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

Sonraki adımlar