Dalam rilis Spring Data mendatang, nama kode Lovelace, kita akan memasukkan modul baru: Spring Data JDBC .
Gagasan di balik Spring Data JDBC adalah untuk menyediakan akses ke database relasional tanpa menggunakan semua kompleksitas JPA .
JPA menawarkan fitur-fitur seperti pemuatan yang malas , caching, dan perubahan pelacakan (pelacakan kotor). Terlepas dari kenyataan bahwa fitur-fitur ini sangat keren, jika Anda benar-benar membutuhkannya, tentu saja, mereka dapat sangat mempersulit pemahaman tentang logika akses data.
Mekanisme lazy loading tiba-tiba dapat mengeksekusi permintaan sumber daya intensif, atau bahkan gagal dengan pengecualian. Caching dapat menghalangi Anda ketika Anda memutuskan untuk membandingkan dua versi suatu entitas, dan ditambah dengan pelacakan perubahan itu membuatnya lebih sulit untuk memahami pada titik apa semua operasi database sebenarnya akan dilakukan?
Data Musim Semi JDBC berfokus pada model yang jauh lebih sederhana . Tidak akan ada caching, perubahan pelacakan, atau pemuatan malas. Sebaliknya, kueri SQL akan dieksekusi jika dan hanya jika Anda memanggil metode repositori. Hasil yang dikembalikan akan sepenuhnya dimuat ke dalam memori setelah metode ini dijalankan. Tidak akan ada mekanisme "sesi" atau objek proxy untuk entitas. Dan semua ini harus membuat Spring Data JDBC alat yang lebih sederhana dan lebih intuitif untuk mengakses data.
Tentu saja, pendekatan yang disederhanakan seperti itu diterjemahkan ke dalam sejumlah keterbatasan, yang akan kita diskusikan di posting selanjutnya. Rilis yang akan datang adalah versi pertama dari perpustakaan, kami memiliki banyak rencana dan ide yang ingin kami terapkan, tetapi kami harus menundanya untuk memberi Anda kesempatan untuk mulai menggunakan Spring Data JDBC sedini mungkin.
Contoh
Untuk memulai, kita perlu mendefinisikan entitas:
class Customer { @Id Long id; String firstName; LocalDate dob; }
Harap dicatat bahwa kami tidak mendefinisikan getter atau setter. Tentu saja, Anda dapat menambahkannya jika mau. Pada dasarnya, satu-satunya persyaratan untuk entitas adalah memiliki bidang yang dianotasi dengan anotasi Id
(tetapi yaitu org.springframework.data.annotation.Id
, bukan javax.persistence one
).
Selanjutnya, Anda perlu mendefinisikan repositori. Cara termudah untuk melakukan ini adalah memperluas antarmuka CrudRepository
.
interface CustomerRepository extends CrudRepository<Customer, Long> {}
Akhirnya, Anda perlu mengkonfigurasi ApplicationContext
sehingga implementasi antarmuka ini dibuat secara otomatis:
@Configuration @EnableJdbcRepositories (1) public class CustomerConfig extends JdbcConfiguration { (2) @Bean NamedParameterJdbcOperations operations() { (3) return new NamedParameterJdbcTemplate(dataSource()); } @Bean PlatformTransactionManager transactionManager() { (4) return new DataSourceTransactionManager(dataSource()); } @Bean DataSource dataSource(){ (5) return new EmbeddedDatabaseBuilder() .generateUniqueName(true) .setType(EmbeddedDatabaseType.HSQL) .addScript("create-customer-schema.sql") .build(); } }
Mari kita menganalisis konfigurasi lebih terinci.
EnableJdbcRepositories
pembuatan repositori otomatis. Agar ini berfungsi, Anda perlu menyediakan beberapa kacang tambahan, yang akan membutuhkan seluruh kelas konfigurasi kami.- Karena kelas konfigurasi meluas
JdbcConfiguration
, beberapa kacang akan ditambahkan ke konteks secara otomatis. Anda juga bisa tumpang tindih jika Anda perlu mengubah perilaku Spring Data JDBC. Namun dalam contoh ini, kita akan meninggalkan perilaku default. - Komponen yang sangat penting adalah
NamedParameterJdbcOperations
, yang digunakan untuk melakukan query database. - Manajer transaksi, sebenarnya, tidak diperlukan. Tetapi tanpa itu, tidak akan ada dukungan transaksi, dan sedikit yang akan menyukainya, kan?
- Spring Data JDBC tidak menggunakan
DataSource
secara langsung, tetapi TransactionManager
dan NamedParameterJdbcOperation
memerlukan kehadirannya dalam konteks, itulah sebabnya kami menentukan kacang yang diinginkan.
Hanya itu yang diperlukan untuk memulai dengan Data Spring JDBC. Sekarang tulis tes untuk melihat bagaimana semuanya bekerja:
@RunWith(SpringRunner.class) @Transactional @ContextConfiguration(classes = CustomerConfig.class) public class CustomerRepositoryTest { @Autowired CustomerRepository customerRepo; @Test public void createSimpleCustomer() { Customer customer = new Customer(); customer.dob = LocalDate.of(1904, 5, 14); customer.firstName = "Albert"; Customer saved = customerRepo.save(customer); assertThat(saved.id).isNotNull(); saved.firstName = "Hans Albert"; customerRepo.save(saved); Optional<Customer> reloaded = customerRepo.findById(saved.id); assertThat(reloaded).isNotEmpty(); assertThat(reloaded.get().firstName).isEqualTo("Hans Albert"); } }
@Query
Hanya dengan metode CRUD standar yang dapat Anda lakukan jauh dari repositori kelas CrudRepository
. Kami sengaja memutuskan untuk menunda pembuatan kueri otomatis - fitur populer dari Data Spring, ketika kueri SQL dihasilkan berdasarkan nama metode - untuk rilis mendatang. Dan untuk saat ini, Anda cukup menggunakan anotasi @Query
familier untuk menentukan dengan tepat query SQL mana yang harus dieksekusi.
@Query("select id, first_name, dob from customer where upper(first_name) like '%' || upper(:name) || '%' ") List<Customer> findByName(@Param("name") String name);
Jika Anda ingin mengubah atau menghapus data dalam permintaan, Anda dapat menambahkan penjelasan @Modifying
dengan metode ini.
Mari kita menulis tes untuk melihat cara kerja metode baru kita.
@Test public void findByName() { Customer customer = new Customer(); customer.dob = LocalDate.of(1904, 5, 14); customer.firstName = "Albert"; Customer saved = customerRepo.save(customer); assertThat(saved.id).isNotNull(); customer.id= null; (1) customer.firstName = "Bertram"; customerRepo.save(customer); customer.id= null; customer.firstName = "Beth"; customerRepo.save(customer); assertThat(customerRepo.findByName("bert")).hasSize(2); (2) }
- Karena Karena koneksi antara objek Java dan catatan dalam database hanya berdasarkan bidang dan jenis
Id
, pengaturan Id
ke null
dan menyimpan objek ini akan membuat catatan baru. - Dalam permintaan, kami menggunakan case-sensitive seperti, dan oleh karena itu kami menemukan "Albert" dan "Bertram", tetapi tidak "Beth".
Kesimpulannya
Tentu saja, lebih banyak yang bisa dikatakan tentang Spring Data JDBC, dan kami pasti akan memberi tahu Anda di artikel mendatang.
Sementara itu, Anda dapat mempelajari kode sampel , dokumentasi , dan, tentu saja, kode sumber . Jika Anda memiliki pertanyaan, jangan ragu untuk bertanya di StackOverflow . Dan jika Anda menemukan bug atau ingin meminta fitur baru - silakan buat tiket .