Pengantar Spring Data JDBC

1. Ikhtisar

Spring Data JDBC adalah framework ketekunan yang tidak serumit Spring Data JPA. Itu tidak menyediakan cache, lazy loading, write-behind, atau banyak fitur JPA lainnya. Namun demikian, ia memiliki ORM sendiri dan menyediakan sebagian besar fitur yang kami gunakan dengan Spring Data JPA seperti entitas yang dipetakan, repositori, anotasi kueri, dan JdbcTemplate .

Satu hal penting untuk diingat adalah bahwa Spring Data JDBC tidak menawarkan pembuatan skema . Akibatnya, kami bertanggung jawab untuk membuat skema secara eksplisit.

2. Menambahkan JDBC Spring Data ke Proyek

Spring Data JDBC tersedia untuk aplikasi Spring Boot dengan starter dependensi JDBC. Starter ketergantungan ini tidak membawa driver database . Keputusan itu harus diambil oleh pengembang. Mari tambahkan starter dependensi untuk Spring Data JPA:

 org.springframework.boot spring-boot-starter-data-jdbc  

Dalam contoh ini, kami menggunakan database H2. Seperti yang kami sebutkan sebelumnya, Spring Data JDBC tidak menawarkan pembuatan skema. Dalam kasus seperti itu, kita dapat membuat file schema.sql kustom yang akan memiliki perintah SQL DDL untuk membuat objek skema. Secara otomatis, Spring Boot akan memilih file ini dan menggunakannya untuk membuat objek database.

3. Menambahkan Entitas

Seperti proyek Spring Data lainnya, kami menggunakan anotasi untuk memetakan POJO dengan tabel database. Di Spring Data JDBC, entitas harus memiliki @Id . Spring Data JDBC menggunakan anotasi @Id untuk mengidentifikasi entitas.

Mirip dengan Spring Data JPA, Spring Data JDBC menggunakan, secara default, strategi penamaan yang memetakan entitas Java ke tabel database relasional, dan atribut ke nama kolom. Secara default, nama kasus unta entitas dan atribut masing-masing dipetakan ke nama kasus ular dari tabel dan kolom. Misalnya, entitas Java bernama AddressBook dipetakan ke tabel database bernama address_book .

Juga, kita dapat memetakan entitas dan atribut dengan tabel dan kolom secara eksplisit dengan menggunakan @ table dan @column penjelasan. Misalnya, di bawah ini kami telah menentukan entitas yang akan kami gunakan dalam contoh ini:

public class Person { @Id private long id; private String firstName; private String lastName; // constructors, getters, setters }

Kita tidak perlu menggunakan anotasi @Table atau @Column di kelas Person . Strategi penamaan default Spring Data JDBC melakukan semua pemetaan secara implisit antara entitas dan tabel.

4. Mendeklarasikan Repositori JDBC

Spring Data JDBC menggunakan sintaks yang mirip dengan Spring Data JPA. Kita dapat membuat repositori JDBC Spring Data dengan memperluas antarmuka Repository , CrudRepository, atau PagingAndSortingRepository . Dengan mengimplementasikan CrudRepository , kami menerima implementasi metode yang paling umum digunakan seperti simpan , hapus , dan findById , antara lain.

Mari buat repositori JDBC yang akan kita gunakan dalam contoh kita:

@Repository public interface PersonRepository extends CrudRepository { }

Jika kita perlu memiliki fitur pagination dan sortir, pilihan terbaik adalah memperluas antarmuka PagingAndSortingRepository .

5. Menyesuaikan Repositori JDBC

Terlepas dari metode bawaan CrudRepository , kita perlu membuat metode untuk kasus tertentu. Satu hal penting yang perlu diperhatikan adalah Spring Data JDBC tidak mendukung kueri turunan . Ini berarti kita tidak bisa begitu saja menulis nama metode dan mengharapkan Spring Data JDBC menghasilkan kueri.

Setiap kali kita menulis metode kustom, kita perlu menghiasnya dengan anotasi @Query . Di dalam anotasi @Query , kami menambahkan perintah SQL kami. Di Spring Data JDBC, kami menulis kueri dalam SQL biasa. Kami tidak menggunakan bahasa kueri tingkat yang lebih tinggi seperti JPQL. Akibatnya, aplikasi menjadi sangat erat hubungannya dengan vendor database.

Karena alasan ini, mengubah ke database lain juga menjadi lebih sulit.

Perbedaan penting lainnya adalah Spring Data JDBC tidak mendukung referensi parameter dengan nomor indeks . Dalam versi Spring Data JDBC ini, kami hanya dapat mereferensikan parameter berdasarkan nama .

Dengan anotasi @Modifying , kita dapat menganotasi metode kueri yang memodifikasi entitas.

Sekarang mari kita sesuaikan PersonRepository kita dengan kueri non-modifikasi dan kueri yang mengubah:

@Repository public interface PersonRepository extends CrudRepository { @Query("select * from person where first_name=:firstName") List findByFirstName(@Param("firstName") String firstName); @Modifying @Query("UPDATE person SET first_name = :name WHERE id = :id") boolean updateByFirstName(@Param("id") Long id, @Param("name") String name); }

6. Mengisi Database

Terakhir, kita perlu mengisi database dengan data yang akan berfungsi untuk menguji repositori JDBC Spring Data yang kita buat di atas. Jadi, kita akan membuat seeder database yang akan memasukkan data dummy. Mari tambahkan implementasi database seeder untuk contoh ini:

@Component public class DatabaseSeeder { @Autowired private JdbcTemplate jdbcTemplate; public void insertData() { jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Victor', 'Hugo')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Dante', 'Alighieri')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Stefan', 'Zweig')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Oscar', 'Wilde')"); } }

Seperti yang terlihat di atas, kami menggunakan Spring JDBC untuk menjalankan pernyataan INSERT . Secara khusus, Spring JDBC menangani koneksi dengan database dan memungkinkan kita menjalankan perintah SQL menggunakan JdbcTemplate s. Solusi ini sangat fleksibel karena kami memiliki kendali penuh atas kueri yang dieksekusi.

7. Kesimpulan

Untuk meringkas, Spring Data JDBC menawarkan solusi yang sederhana seperti menggunakan Spring JDBC - tidak ada keajaiban di baliknya. Meskipun demikian, ia juga menawarkan sebagian besar fitur yang biasa kami gunakan dengan Spring Data JPA.

Salah satu keuntungan terbesar dari Spring Data JDBC adalah peningkatan kinerja saat mengakses database dibandingkan dengan Spring Data JPA. Ini karena Spring Data JDBC berkomunikasi langsung ke database . Spring Data JDBC tidak berisi sebagian besar keajaiban Spring Data saat membuat kueri database .

Salah satu kelemahan terbesar saat menggunakan Spring Data JDBC adalah ketergantungan pada vendor database. Jika kita memutuskan untuk mengubah database dari MySQL ke Oracle, kita mungkin harus menghadapi masalah yang muncul dari database yang memiliki dialek berbeda .

Implementasi tutorial JDBC Spring Data ini dapat ditemukan di GitHub.