Hızlı Başlangıç: Java ve JDBC'yi MySQL için Azure Veritabanı

AŞAĞıDAKILER IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Tek Sunucu

Bu konu başlığı altında, java ve JDBC kullanarak bilgileri depolama ve alma için bir örnek uygulama oluşturmaMySQL için Azure Veritabanı.

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 kullanacaktır.

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_MYSQL_USERNAME=demo
AZ_MYSQL_PASSWORD=<YOUR_MYSQL_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>: MySQL sunucusunun adı. Azure genelinde benzersiz olmalıdır.
  • <YOUR_AZURE_REGION>: Kullanabileceğiniz 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 kullanılabilir bölgelerin tam listesine sahip az account list-locations olabilirsiniz.
  • <YOUR_MYSQL_PASSWORD>: MySQL veritabanı sunucusunun parolası. Bu parola en az sekiz karakter uzunluğunda olmalıdır. Karakterler şu kategorilerin üçünü de içermelidir: İngilizce büyük harfler, İngilizce küçük harfler, rakamlar (0-9) ve alfasayısal olmayan karakterler (!, $, #, % vb.).
  • <YOUR_LOCAL_IP_ADDRESS>: Java uygulamanızı çalıştıracak yerel bilgisayarınızın IP adresi. Bunu bulmanın kullanışlı yollarından biri, tarayıcınızı bir whatismyip.akamai.com.

Sonra, kaynak grubu oluşturun:

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

Not

JSON verilerini görüntüleyip daha okunur hale getirmesi için, Azure Cloud Shell’de varsayılan olarak yüklü olan jq yardımcı programını kullanacağız. Bu yardımcı programı beğenmezseniz kullanacağımız tüm komutlardan | jq bölümünü kaldırabilirsiniz.

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

İlk olarak, yönetilen bir MySQL sunucusu oluşturacağız.

Not

MySQL sunucuları oluşturma hakkında daha ayrıntılı bilgileri Azure portalı kullanarak MySQL için Azure Veritabanı sunucusu oluşturma başlıklı makaleyi okuyarak edinebilirsiniz.

Komut Azure Cloud Shellaşağıdaki betiği çalıştırın:

az mysql server create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_NAME \
    --location $AZ_LOCATION \
    --sku-name B_Gen5_1 \
    --storage-size 5120 \
    --admin-user $AZ_MYSQL_USERNAME \
    --admin-password $AZ_MYSQL_PASSWORD \
  	| jq

Bu komut küçük bir MySQL sunucusu oluşturur.

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

MySQL 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ı kullanmak için yerel IP adresinin veritabanı sunucusuna erişmesine izin verecek bir güvenlik duvarı kuralı eklemeniz gerekir.

Bu makalenin başında yerel IP adresimizi yapılandırdınız, aşağıdakini çalıştırarak sunucunun güvenlik duvarını açabilirsiniz:

az mysql 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

MySQL veritabanı yapılandırma

Önceden oluşturduğunuz MySQL sunucusu boştur. Java uygulamasıyla kullanabileceğiniz bir veritabanı yok. demo adlı yeni bir veritabanı oluşturun:

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

Yeni java projesi oluşturma

Sık kullanılan IDE'nizi kullanarak yeni bir Java projesi oluşturun ve kök pom.xml dizinine bir 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>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
    </dependencies>
</project>

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

  • Java 8
  • Java için yakın zamanda bir MySQL sürücüsü

MySQL için Azure Veritabanı'a bağlanmak için yapılandırma MySQL için Azure Veritabanı

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

url=jdbc:mysql://$AZ_DATABASE_NAME.mysql.database.azure.com:3306/demo?serverTimezone=UTC
user=demo@$AZ_DATABASE_NAME
password=$AZ_MYSQL_PASSWORD
  • İki değişkeni $AZ_DATABASE_NAME bu makalenin başında yapılandırmış olduğunuz değerle değiştirin.
  • değişkenlerini $AZ_MYSQL_PASSWORD bu makalenin başında yapılandırılan değerle değiştirin.

Not

Veritabanına bağlanırken JDBC sürücüsünün UTC tarih biçimini (veya Eşgüdümlü Evrensel Saat) kullanmasını söylemek için url yapılandırma özelliğine ?serverTimezone=UTC ekliyoruz. Aksi halde, Java sunucumuz veritabanıyla aynı tarih biçimini kullanmaz ve bu bir hataya neden olur.

Veritabanı SQL oluşturmak için bir dosya 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 SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);

Uygulamayı kodlama

Veritabanına bağlanın

Ardından, MySQL sunucunuzdan veri depolamak ve buradan veri almak için JDBC'yi kullanan Java kodunu ekleyin.

Şunları içeren bir src/main/java/DemoApplication.java dosyası oluşturun:

package com.example.demo;

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;

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

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

Bu dosyada veri ekleme, okuma, güncelleştirme ve silme yöntemlerine açıklama eklemiş olduğunu görebiliriz: Bu yöntemleri bu makalenin geri kalanında kodlaacağız ve bunları birbirinin açıklamalarını silebilirsiniz.

Not

Veritabanı kimlik bilgileri application.properties dosyasının kullanıcı ve parola özelliklerinde depolanır. Bu kimlik bilgileri, özellikler dosyası bağımsız DriverManager.getConnection(properties.getProperty("url"), properties); değişken olarak geçirilirken kullanılır.

Not

Sonundaki satır, uygulamayı kapatarak iç iş parçacığını yok etmek AbandonedConnectionCleanupThread.uncheckedShutdown(); için MySQL sürücüsüne özgü bir komut olur. Güvenli bir şekilde yoksayılabilir.

Artık bu ana sınıfı sık kullanılan aracıyla yürütebilirsiniz:

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

Uygulamanın konsol MySQL için Azure Veritabanı, veritabanı şeması oluşturması ve ardından konsol günlüklerinde gördüğünüz 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ına Todo yeni bir Java sınıfı oluşturun ve aşağıdaki kodu DemoApplication 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 schema.sql betiği yürütilirken oluşturduğunuz tabloda eşlenmiş bir etki alanı modelidir.

Verilere veri MySQL için Azure Veritabanı

src/main/java/DemoApplication.java dosyasında, main yönteminin ardından 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ı geri main ebilirsiniz:

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

Ana sınıfı yürüterek şimdi aşağıdaki çıkışı üretin:

[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

Veri kaynağından MySQL için Azure Veritabanı

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

src/main/java/DemoApplication.java dosyasında, yönteminden sonra veritabanındaki verileri okumak insertData 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çıklamalarını geri main ebilirsiniz:

todo = readData(connection);

Ana sınıfı yürüterek şimdi aşağıdaki çıkışı üretin:

[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 

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

Şimdi daha önce eklenen verileri güncelleştirin.

Hala src/main/java/DemoApplication.java dosyasında, yönteminin ardından, veritabanının içindeki verileri güncelleştirmek için readData 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ı geri main ebilirsiniz:

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

Ana sınıfı yürüterek şimdi aşağıdaki çıkışı üretin:

[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 

MySQL için Azure Veritabanı'de verileri silme

Son olarak, daha önce eklenen verileri silebilirsiniz.

Hala src/main/java/DemoApplication.java dosyasında, yönteminin ardından veritabanı içindeki verileri silmek için updateData 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çıklamalarını geri main ebilirsiniz:

deleteData(todo, connection);

Ana sınıfı yürüterek şimdi aşağıdaki çıkışı üretin:

[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! Veri depolama ve veri alma için JDBC kullanan bir Java uygulaması MySQL için Azure Veritabanı.

Bu hızlı başlangıçta 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