Gunakan Spring Data JDBC dengan Azure Database for MySQL

Tutorial ini menunjukkan cara menyimpan data di database Azure Database for MySQL menggunakan Spring Data JDBC.

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

Dalam tutorial ini, kami menyertakan dua metode autentikasi: autentikasi Microsoft Entra dan autentikasi MySQL. Tab Tanpa Kata Sandi memperlihatkan autentikasi Microsoft Entra dan tab Kata Sandi memperlihatkan autentikasi MySQL.

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

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

Prasyarat

  • Klien baris perintah MySQL.

  • Jika Anda tidak memiliki aplikasi Spring Boot, buat proyek Maven dengan Spring Initializr. Pastikan untuk memilih Proyek Maven dan, di bawah Dependensi, tambahkan dependensi Spring Web, Spring Data JDBC, dan MySQL Driver , lalu pilih Java versi 8 atau yang lebih tinggi.

Lihat aplikasi sampel

Dalam tutorial ini, Anda akan membuat kode aplikasi sampel. Jika Anda ingin lebih cepat, aplikasi ini sudah dikodekan dan tersedia di https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Mengonfigurasikan aturan firewall untuk server MySQL Anda

Instans Azure Database for MySQL diamankan secara default. Mereka memiliki firewall yang tidak mengizinkan koneksi masuk.

Agar dapat menggunakan database Anda, buka firewall server untuk mengizinkan alamat IP lokal mengakses server database. Untuk informasi selengkapnya, lihat Mengelola aturan firewall untuk Azure Database for MySQL - Server Fleksibel menggunakan portal Azure.

Jika Anda menyambungkan ke server MySQL dari Subsistem Windows untuk Linux (WSL) di komputer Windows, Anda perlu menambahkan alamat IP host WSL ke firewall Anda.

Membuat pengguna non-admin MySQL dan memberikan izin

Langkah ini akan membuat pengguna non-admin dan memberikan semua izin pada database ke demo dalamnya.

Anda dapat menggunakan metode berikut untuk membuat pengguna non-admin yang menggunakan koneksi tanpa kata sandi.

  1. Gunakan perintah berikut untuk menginstal ekstensi Service Koneksi or passwordless untuk Azure CLI:

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. Gunakan perintah berikut untuk membuat pengguna non-admin Microsoft Entra:

      az connection create mysql-flexible \
           --resource-group <your_resource_group_name> \
           --connection mysql_conn \
           --target-resource-group <your_resource_group_name> \
           --server mysqlflexibletest \
           --database demo \
           --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \
           --query authInfo.userName \
           --output tsv
    

    Setelah perintah selesai, perhatikan nama pengguna di output konsol.

Menyimpan data dari Azure Database for MySQL

Sekarang setelah Anda memiliki instans server Fleksibel Azure Database for MySQL, Anda dapat menyimpan data dengan menggunakan Spring Cloud Azure.

Untuk menginstal modul Spring Cloud Azure Starter JDBC MySQL, tambahkan dependensi berikut ke file pom.xml Anda:

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Catatan

    Jika Anda menggunakan Spring Boot 2.x, pastikan untuk mengatur versi ke spring-cloud-azure-dependencies4.18.0. Bill of Material (BOM) ini harus dikonfigurasi di bagian <dependencyManagement> file pom.xml Anda. Ini memastikan bahwa semua dependensi Spring Cloud Azure menggunakan versi yang sama. Untuk informasi selengkapnya tentang versi yang digunakan untuk BOM ini, lihat Versi Spring Cloud Azure mana yang Harus Saya Gunakan.

  • Artefak Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Catatan

Koneksi tanpa kata sandi telah didukung sejak versi 4.5.0.

Mengonfigurasikan Spring Boot untuk menggunakan Azure Database untuk MySQL

Untuk menyimpan data dari Azure Database for MySQL menggunakan Spring Data JDBC, ikuti langkah-langkah berikut untuk mengonfigurasi aplikasi:

  1. Konfigurasikan kredensial Azure Database for MySQL dengan menambahkan properti berikut ke file konfigurasi application.properties Anda.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Peringatan

    Properti spring.sql.init.mode=always konfigurasi berarti bahwa Spring Boot akan secara otomatis menghasilkan skema database, menggunakan file schema.sql yang akan Anda buat berikutnya, setiap kali server dimulai. Fitur ini sangat bagus untuk pengujian, tetapi ingat bahwa fitur ini akan menghapus data Anda di setiap restart, sehingga Anda tidak boleh menggunakannya dalam produksi.

    Properti spring.datasource.url konfigurasi telah ?serverTimezone=UTC ditambahkan untuk memberi tahu driver JDBC untuk menggunakan format tanggal UTC (atau Waktu Universal Terkoordinasi) saat menyambungkan ke database. Tanpa parameter ini, server Java Anda tidak akan menggunakan format tanggal yang sama dengan database, yang akan mengakibatkan kesalahan.

Lihat aplikasi sampel

Dalam artikel ini, Anda akan membuat kode aplikasi sampel. Jika Anda ingin lebih cepat, aplikasi ini sudah dikodekan dan tersedia di https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql.

Mengonfigurasikan aturan firewall untuk server MySQL Anda

Instans Azure Database for MySQL diamankan secara default. Mereka memiliki firewall yang tidak mengizinkan koneksi masuk.

Agar dapat menggunakan database Anda, buka firewall server untuk mengizinkan alamat IP lokal mengakses server database. Untuk informasi selengkapnya, lihat Membuat dan mengelola aturan firewall Azure Database for MySQL dengan menggunakan portal Azure.

Jika Anda menyambungkan ke server MySQL dari Subsistem Windows untuk Linux (WSL) di komputer Windows, Anda perlu menambahkan alamat IP host WSL ke firewall Anda.

Membuat pengguna non-admin MySQL dan memberikan izin

Langkah ini akan membuat pengguna non-admin dan memberikan semua izin pada database ke demo dalamnya.

Penting

Untuk menggunakan koneksi tanpa kata sandi, buat pengguna admin Microsoft Entra untuk instans Azure Database for MySQL Anda. Untuk informasi selengkapnya, lihat bagian Mengatur pengguna Microsoft Entra Admin di Menggunakan ID Microsoft Entra untuk autentikasi dengan MySQL.

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

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF

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

mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Tip

Untuk menggunakan autentikasi Microsoft Entra untuk menyambungkan ke Azure Database for MySQL, Anda perlu masuk dengan pengguna admin Microsoft Entra yang Anda siapkan, lalu mendapatkan token akses sebagai kata sandi. Untuk informasi selengkapnya, lihat Menggunakan ID Microsoft Entra untuk autentikasi dengan MySQL.

Menyimpan data dari Azure Database for MySQL

Sekarang setelah Anda memiliki instans Server Tunggal Azure Database for MySQL, Anda dapat menyimpan data dengan menggunakan Spring Cloud Azure.

Untuk menginstal modul Spring Cloud Azure Starter JDBC MySQL, tambahkan dependensi berikut ke file pom.xml Anda:

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Catatan

    Jika Anda menggunakan Spring Boot 2.x, pastikan untuk mengatur versi ke spring-cloud-azure-dependencies4.18.0. Bill of Material (BOM) ini harus dikonfigurasi di bagian <dependencyManagement> file pom.xml Anda. Ini memastikan bahwa semua dependensi Spring Cloud Azure menggunakan versi yang sama. Untuk informasi selengkapnya tentang versi yang digunakan untuk BOM ini, lihat Versi Spring Cloud Azure mana yang Harus Saya Gunakan.

  • Artefak Spring Cloud Azure Starter JDBC MySQL:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

Catatan

Koneksi tanpa kata sandi telah didukung sejak versi 4.5.0.

Mengonfigurasikan Spring Boot untuk menggunakan Azure Database untuk MySQL

Untuk menyimpan data dari Azure Database for MySQL menggunakan Spring Data JDBC, ikuti langkah-langkah berikut untuk mengonfigurasi aplikasi:

  1. Konfigurasikan kredensial Azure Database for MySQL dengan menambahkan properti berikut ke file konfigurasi application.properties Anda.

    logging.level.org.springframework.jdbc.core=DEBUG
    
    spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest
    spring.datasource.azure.passwordless-enabled=true
    
    spring.sql.init.mode=always
    

    Peringatan

    Properti spring.sql.init.mode=always konfigurasi berarti bahwa Spring Boot akan secara otomatis menghasilkan skema database, menggunakan file schema.sql yang akan Anda buat berikutnya, setiap kali server dimulai. Fitur ini sangat bagus untuk pengujian, tetapi ingat bahwa fitur ini akan menghapus data Anda di setiap restart, sehingga Anda tidak boleh menggunakannya dalam produksi.

    Properti spring.datasource.url konfigurasi telah ?serverTimezone=UTC ditambahkan untuk memberi tahu driver JDBC untuk menggunakan format tanggal UTC (atau Waktu Universal Terkoordinasi) saat menyambungkan ke database. Tanpa parameter ini, server Java Anda tidak akan menggunakan format tanggal yang sama dengan database, yang akan mengakibatkan kesalahan.

  1. Buat file konfigurasi src/main/resources/schema.sql untuk mengonfigurasi skema database, lalu tambahkan konten berikut.

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  1. Buat kelas Java baru Todo . Kelas ini adalah model domain yang dipetakan ke todo tabel yang akan dibuat secara otomatis oleh Spring Boot. Kode berikut mengabaikan getters metode dan setters .

    import org.springframework.data.annotation.Id;
    
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. Edit file kelas startup untuk menampilkan konten berikut.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.repository.CrudRepository;
    
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends CrudRepository<Todo, Long> {
    
    }
    

    Tip

    Dalam tutorial ini, tidak ada operasi autentikasi dalam konfigurasi atau kode. Namun, menyambungkan ke layanan Azure memerlukan autentikasi. Untuk menyelesaikan autentikasi, Anda perlu menggunakan Azure Identity. Spring Cloud Azure menggunakan DefaultAzureCredential, yang disediakan pustaka Azure Identity untuk membantu Anda mendapatkan kredensial tanpa perubahan kode apa pun.

    DefaultAzureCredential mendukung beberapa metode autentikasi dan menentukan metode mana yang akan digunakan saat runtime. Pendekatan ini memungkinkan aplikasi Anda menggunakan metode autentikasi yang berbeda di lingkungan yang berbeda (seperti lingkungan lokal dan produksi) tanpa menerapkan kode khusus lingkungan. Untuk informasi selengkapnya, lihat DefaultAzureCredential.

    Untuk menyelesaikan autentikasi di lingkungan pengembangan lokal, Anda dapat menggunakan Azure CLI, Visual Studio Code, PowerShell, atau metode lainnya. Untuk informasi selengkapnya, lihat Autentikasi Azure di lingkungan pengembangan Java. Untuk menyelesaikan autentikasi di lingkungan hosting Azure, sebaiknya gunakan identitas terkelola yang ditetapkan pengguna. Untuk informasi selengkapnya, lihat Apa yang dimaksud dengan identitas terkelola untuk sumber daya Azure?

  3. Mulai aplikasi. Aplikasi menyimpan data ke dalam database. Anda akan melihat log yang mirip dengan contoh berikut:

    2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)]    
    com.example.demo.Todo@4bdb04c8
    

Sebarkan ke Azure Spring Apps

Sekarang setelah Anda memiliki aplikasi Spring Boot yang berjalan secara lokal, saatnya untuk memindahkannya ke produksi. Azure Spring Apps memudahkan penyebaran aplikasi Spring Boot ke Azure tanpa perubahan kode apa pun. Layanan ini mengelola infrastruktur aplikasi Spring sehingga pengembang dapat fokus pada kode mereka. Azure Spring Apps menyediakan manajemen siklus hidup menggunakan pemantauan dan diagnostik yang komprehensif, manajemen konfigurasi, penemuan layanan, integrasi CI/CD, penyebaran biru-hijau, dan banyak lagi. Untuk menyebarkan aplikasi Anda ke Azure Spring Apps, lihat Menyebarkan aplikasi pertama Anda ke Azure Spring Apps.

Langkah berikutnya