Menggunakan Java dan JDBC dengan Azure SQL Database

Topik ini menunjukkan pembuatan aplikasi sampel yang menggunakan Java dan JDBC untuk menyimpan dan mengambil informasi di Azure SQL Database.

JDBC adalah Java API standar untuk terhubung ke database hubungan tradisional.

Prasyarat

Menyiapkan lingkungan kerja

Kami akan menggunakan variabel lingkungan untuk membatasi kesalahan pengetikan, dan untuk mempermudah Anda menyesuaikan konfigurasi berikut untuk kebutuhan spesifik Anda.

Siapkan variabel lingkungan tersebut dengan menggunakan perintah berikut:

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>

Ganti tempat penampung dengan nilai berikut, yang digunakan di seluruh artikel ini:

  • <YOUR_DATABASE_NAME>: Nama server Azure SQL Database Anda. Nama ini harus bersifat unik di seluruh Azure.
  • <YOUR_AZURE_REGION>: Wilayah Azure yang akan Anda gunakan. Anda dapat menggunakan eastus secara default, tetapi kami menyarankan agar Anda mengonfigurasi wilayah yang lebih dekat ke tempat tinggal Anda. Anda dapat memiliki daftar lengkap wilayah yang tersedia dengan memasukkan az account list-locations.
  • <AZ_SQL_SERVER_PASSWORD>:Kata sandi server Azure SQL Database Anda. Kata sandi itu harus memiliki minimal delapan karakter. Kata sandi Anda harus berisi karakter dari tiga kategori berikut – huruf besar Inggris, huruf kecil Inggris, angka (0-9), dan karakter non-alfanumerik (!, $, #,%, dll.).
  • <YOUR_LOCAL_IP_ADDRESS>: Alamat IP komputer lokal Anda, tempat Anda akan menjalankan aplikasi Java Anda. Salah satu cara mudah untuk menemukannya adalah dengan mengarahkan browser Anda ke whatismyip.akamai.com.

Berikutnya, buat grup sumber daya menggunakan perintah berikut:

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

Catatan

Kami menggunakan jq utilitas untuk menampilkan data JSON dan membuatnya lebih mudah dibaca. Utilitas ini dipasang secara default di Azure Cloud Shell. Jika tidak menyukai utilitas itu, Anda dapat dengan aman menghapus bagian | jq dari semua perintah yang akan kami gunakan.

Membuat contoh Azure SQL Database

Hal pertama yang akan kami buat adalah server Azure SQL Database terkelola.

Catatan

Anda bisa membaca informasi selengkapnya tentang membuat server Azure SQL Database di Mulai cepat: Membuat database tunggal Azure SQL Database.

Di Azure Cloud Shell, jalankan perintah berikut ini:

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

Perintah ini membuat server Azure SQL Database.

Mengonfigurasi aturan firewall untuk server Azure SQL Database Anda

Instans Azure SQL Database diamankan secara default. Mereka memiliki firewall yang tidak mengizinkan koneksi masuk. Agar bisa menggunakan database Anda, Anda perlu menambahkan aturan firewall yang akan memungkinkan alamat IP lokal mengakses server database.

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

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

Mengonfigurasi database Azure SQL

Server Azure SQL Database yang Anda buat sebelumnya kosong. Tidak memiliki database apa pun yang dapat Anda gunakan dengan aplikasi Java. Buat database baru yang dipanggil demo dengan menjalankan perintah berikut ini:

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

Membuat proyek Java baru

Menggunakan IDE favorit Anda, buat proyek Java baru, dan tambahkan file pom.xml di direktori akarnya:

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

File ini adalah Apache Maven yang mengonfigurasi proyek yang akan digunakan:

  • Java 17
  • Driver SQL Server terbaru ini untuk Java

Menyiapkan file konfigurasi untuk menyambungkan ke Azure SQL Database

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

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
  • Ganti dua variabel $AZ_DATABASE_NAME dengan nilai yang Anda konfigurasi di awal artikel ini.
  • Ganti variabel $AZ_SQL_SERVER_PASSWORD dengan nilai yang Anda konfigurasi di awal artikel ini.

Membuat file SQL untuk menghasilkan skema database

Kita akan menggunakan 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 INT PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);

Kodekan aplikasi

Sambungkan ke database

Selanjutnya, tambahkan kode Java yang akan menggunakan JDBC untuk menyimpan dan mengambil data dari Azure SQL Database Anda.

Buat file src/main/java/com/example/demo/DemoApplication.java , yang berisi:

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

Kode Java ini akan menggunakan file application.properties dan schema.sql yang kami buat sebelumnya, untuk menyambungkan ke database SQL Server dan membuat skema yang akan menyimpan data kami.

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

Catatan

Informasi masuk database disimpan dalam properti pengguna dan kata sandi dari file application.properties. Informasi masuk 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 package exec:java -Dexec.mainClass="com.example.demo.DemoApplication".

Aplikasi harus terhubung ke Azure SQL Database, 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 SQL Database

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 membatalkan penguraian 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 SQL Database

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 SQL Database

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 membatalkan penguraian 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 dalam Azure SQL Database

Terakhir, mari kita hapus data yang sebelumnya kita sisipkan.

Masih dalam file src/main/java/DemoApplication.java, setelah metode updateData, tambahkan metode berikut untuk memperbarui 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 

Kesimpulan dan pembersihan sumber daya

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

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

Langkah berikutnya