Berikut adalah pengantar untuk setiap teknologi yang disebutkan.
Musim Semi-DAO
Spring-DAO bukanlah modul pegas dalam arti yang sebenarnya, melainkan konvensi yang harus mendikte Anda untuk menulis DAO, dan menulisnya dengan baik. Dengan demikian, ini tidak menyediakan antarmuka atau implementasi atau template untuk mengakses data Anda. Saat menulis DAO, Anda harus menambahkan catatan @Repository
sehingga pengecualian yang terkait dengan teknologi yang mendasarinya (JDBC, Hibernate, JPA, dll.) Secara konsisten diterjemahkan ke dalam DataAccessException
subkelas yang sesuai .
Sebagai contoh, misalkan Anda sekarang menggunakan Hibernate, dan lapisan layanan Anda menangkapnya HibernateException
untuk bereaksi. Jika Anda mengubah ke JPA, antarmuka DAO Anda tidak boleh berubah, dan lapisan layanan akan tetap dikompilasi dengan blok yang menangkap HibernateException
, tetapi Anda tidak akan pernah memasukkan blok ini karena DAO Anda sekarang melemparkan JPA PersistenceException
. Dengan menggunakan @Repository
DAO Anda, pengecualian yang ditautkan ke teknologi yang mendasari diterjemahkan ke Spring DataAccessException
; lapisan layanan Anda menangkap pengecualian ini dan jika Anda memutuskan untuk mengubah teknologi persistensi, Spring yang sama DataAccessExceptions
akan tetap dilemparkan karena spring telah menerjemahkan pengecualian asli.
Namun perlu dicatat bahwa ini memiliki penggunaan terbatas karena alasan berikut:
- Biasanya Anda tidak akan menangkap pengecualian persistensi, karena penyedia mungkin telah membatalkan transaksi (bergantung pada subtipe pengecualian persisnya), dan karenanya Anda tidak boleh melanjutkan eksekusi dengan jalur alternatif.
- Hierarki pengecualian biasanya lebih kaya di penyedia Anda daripada yang disediakan Spring, dan tidak ada pemetaan pasti dari satu penyedia ke penyedia lainnya. Mengandalkan ini berbahaya. Namun
@Repository
, sebaiknya beri anotasi pada DAO Anda dengan , karena kacang akan ditambahkan secara otomatis oleh prosedur pemindaian. Lebih lanjut, Spring dapat menambahkan fitur berguna lainnya ke anotasi.
Musim Semi-JDBC
Spring-JDBC menyediakan kelas JdbcTemplate, yang menghapus kode pipa dan membantu Anda berkonsentrasi pada kueri dan parameter SQL. Anda hanya perlu mengkonfigurasinya dengan a DataSource
, dan Anda kemudian dapat menulis kode seperti ini:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC juga menyediakan JdbcDaoSupport, yang dapat Anda kembangkan untuk mengembangkan DAO Anda. Ini pada dasarnya mendefinisikan 2 properti: Sumber Data dan JdbcTemplate yang keduanya dapat digunakan untuk mengimplementasikan metode DAO. Ini juga menyediakan penerjemah pengecualian dari pengecualian SQL ke dataAccessExceptions musim semi.
Jika Anda berencana menggunakan jdbc biasa, ini adalah modul yang perlu Anda gunakan.
Spring-ORM
Spring-ORM adalah modul payung yang mencakup banyak teknologi persistensi, yaitu JPA, JDO, Hibernate, dan iBatis. Untuk setiap teknologi ini, Spring menyediakan kelas integrasi sehingga setiap teknologi dapat digunakan mengikuti prinsip konfigurasi Spring, dan terintegrasi dengan lancar dengan manajemen transaksi Spring.
Untuk setiap teknologi, konfigurasi pada dasarnya terdiri dari menginjeksi DataSource
kacang ke dalam sejenis kacang SessionFactory
atau EntityManagerFactory
dll. Untuk JDBC murni, tidak diperlukan kelas integrasi seperti itu (selain JdbcTemplate), karena JDBC hanya mengandalkan DataSource.
Jika Anda berencana menggunakan ORM seperti JPA atau Hibernate, Anda tidak memerlukan spring-jdbc, tetapi hanya modul ini.
Spring-Data
Spring-Data adalah proyek payung yang menyediakan API umum untuk menentukan cara mengakses data (anotasi DAO +) dengan cara yang lebih umum, mencakup sumber data SQL dan NOSQL.
Ide awalnya adalah untuk menyediakan teknologi sehingga pengembang menulis antarmuka untuk DAO (metode finder) dan kelas entitas dengan cara agnostik teknologi dan, berdasarkan konfigurasi saja (penjelasan tentang DAO & entitas + konfigurasi pegas, baik itu xml- atau berbasis java), memutuskan teknologi implementasi, baik itu JPA (SQL) atau redis, hadoop, dll. (NOSQL).
Jika Anda mengikuti konvensi penamaan yang ditentukan oleh spring untuk nama metode finder, Anda bahkan tidak perlu menyediakan string kueri yang sesuai dengan metode finder untuk kasus yang paling sederhana. Untuk situasi lain, Anda harus menyediakan string kueri di dalam anotasi pada metode finder.
Saat konteks aplikasi dimuat, pegas menyediakan proxy untuk antarmuka DAO, yang berisi semua kode boilerplate yang terkait dengan teknologi akses data, dan memanggil kueri yang dikonfigurasi.
Spring-Data berkonsentrasi pada teknologi non-SQL, tetapi masih menyediakan modul untuk JPA (satu-satunya teknologi SQL).
Apa berikutnya
Mengetahui semua ini, Anda sekarang harus memutuskan apa yang akan dipilih. Kabar baiknya di sini adalah Anda tidak perlu membuat pilihan akhir yang pasti untuk teknologi tersebut. Di sinilah sebenarnya kekuatan Spring berada: sebagai pengembang, Anda berkonsentrasi pada bisnis saat Anda menulis kode, dan jika Anda melakukannya dengan baik, mengubah teknologi yang mendasarinya adalah detail implementasi atau konfigurasi.
- Tentukan model data dengan kelas POJO untuk entitas, dan dapatkan / setel metode untuk mewakili atribut entitas dan hubungan dengan entitas lain. Anda pasti perlu membuat anotasi kelas entitas dan bidang berdasarkan teknologi, tetapi untuk saat ini, POJO sudah cukup untuk memulai. Konsentrasi saja pada kebutuhan bisnis untuk saat ini.
- Tentukan antarmuka untuk DAO Anda. 1 DAO mencakup tepat 1 entitas, tetapi Anda pasti tidak memerlukan DAO untuk masing-masing entitas, karena Anda harus dapat memuat entitas tambahan dengan menavigasi hubungan. Tentukan metode finder mengikuti konvensi penamaan yang ketat.
- Berdasarkan ini, orang lain bisa mulai mengerjakan lapisan layanan, dengan tiruan untuk DAO Anda.
- Anda mempelajari berbagai teknologi persistensi (sql, no-sql) untuk menemukan yang paling sesuai dengan kebutuhan Anda, dan memilih salah satunya. Berdasarkan ini, Anda membuat anotasi entitas dan mengimplementasikan DAO (atau membiarkan spring mengimplementasikannya untuk Anda jika Anda memilih untuk menggunakan spring-data).
- Jika persyaratan bisnis berkembang dan teknologi akses data Anda tidak cukup untuk mendukungnya (katakanlah, Anda memulai dengan JDBC dan beberapa entitas, tetapi sekarang membutuhkan model data yang lebih kaya dan JPA adalah pilihan yang lebih baik), Anda harus mengubah penerapannya DAO Anda, tambahkan beberapa anotasi pada entitas Anda dan ubah konfigurasi pegas (tambahkan definisi EntityManagerFactory). Kode bisnis Anda yang lain seharusnya tidak melihat dampak lain dari perubahan Anda.
Catatan: Manajemen Transaksi
Spring menyediakan API untuk manajemen transaksi. Jika Anda berencana menggunakan pegas untuk akses data, Anda juga harus menggunakan pegas untuk manajemen transaksi, karena keduanya terintegrasi dengan sangat baik. Untuk setiap teknologi akses data yang didukung oleh pegas, ada pengelola transaksi yang cocok untuk transaksi lokal, atau Anda dapat memilih JTA jika Anda membutuhkan transaksi terdistribusi. Semuanya menerapkan API yang sama, sehingga (sekali lagi) pilihan teknologi hanyalah masalah konfigurasi yang dapat diubah tanpa berdampak lebih jauh pada kode bisnis.
Catatan: Dokumentasi musim semi
Tautan ke dokumentasi Spring yang Anda sebutkan agak lama. Berikut adalah dokumentasi dari rilis terbaru (4.1.6, mencakup semua topik):
Spring-data bukan bagian dari framework Spring. Ada modul umum yang harus Anda baca terlebih dahulu agar terbiasa dengan prinsip. Dokumentasi dapat ditemukan di sini:
spring-jdbc
menyediakan alat berguna lainnya yang tidak disebutkan di sini? Misalnya, menurut sayaSimpleJdbcInsert
sangat bersih dan berguna untuk penyisipan entri tunggal maupun massal (hingga skala yang wajar, tentu saja).Spring DAO ( D ata A ccess O bject): adalah objek yang menyediakan antarmuka abstrak untuk kerangka implementasi JDBC yaitu Spring DAO adalah konsep umum untuk mengakses JDBC dan Hibernate, MyBatis, JPA, JDO menggunakan kelas Dukungan individualnya. Dan itu menyediakan hierarki pengecualian umum dengan mendefinisikan
@Repository
anotasi. Anotasi ini mendefinisikan penampung Spring untuk terjemahan pengecualian SQL dari hierarkiSQLException
strategi-agnostik akses data SpringDataAccessException
.yaitu pengecualian khusus platform adalah tangkapan dan kemudian lemparan ulang sebagai salah satu pengecualian akses data yang tidak dicentang Spring.
Spring JDBC : Untuk JDBC biasa kami menggunakan modul ini, yang hanya bergantung pada
DataSource
dan kelas Templat sepertiJdbcTemplate
,NamedParameterJdbcTemplate
(membungkusJdbcTemplate
) danSimpleJdbcTemplate
untuk mengurangi masalah lintas sektor.dan di Spring XML:
Semi JDBC juga menyediakan
JdbcDaoSupport
,NamedParameterJdbcDaoSupport
,SimpleJdbcDaoSupport
, yang mendukung (yaitu nyaman ) cara untuk memperpanjang dan mengembangkan kita sendiri DAO antarmuka abstrak sebagai berikut:dan di musim semi XML:
Spring ORM: Untuk dukungan alat ORM seperti Hibernate, JPA, MyBatis ... dengan mudah mengintegrasikan Spring dengan menyuntikkan
DataSource
bersama dengan kelas berikut dan masing-masingDaoSupport
kelas.SessionFactory
untuk HibernateEntityManagerFactory
untuk JPA,SqlSessionFactory
untuk MyBatissumber
Spring-dao lib berhenti di versi 2.0.8 (Januari 2008). Kelas di spring-dao disalin ke spring-tx. Jadi, jika Anda membutuhkan kelas yang Anda temukan di spring-dao, tambahkan dependensi ke spring-tx sebagai gantinya. ( Sumber .)
sumber
Anda membuat antarmuka seperti
SomeObjectDao
dan kemudian membuat implementasi yang berbeda dari antarmuka ini sepertiJdbcSomeObjectDao
,HibernateSomeObjectDao
. Kemudian diSomeObjectService
kelas Anda, Anda akan beroperasi padaSomeObjectDao
antarmuka, dan memasukkan salah satu implementasi konkret di sana. Jadi setiap implementasiSomeObjectDao
akan menyembunyikan detailnya, apakah Anda menggunakan JDBC, atau ORM, dll.Biasanya JDBC, dan implementasi ORM yang berbeda memunculkan jenis pengecualian yang berbeda. Dukungan DAO Spring dapat memetakan pengecualian khusus teknologi yang berbeda tersebut ke pengecualian Spring DAO yang umum. Jadi, Anda lebih dipisahkan dari implementasi yang sebenarnya. Juga dukungan DAO Spring menawarkan sekumpulan
*DataSupport
kelas abstrak yang bahkan lebih membantu dalam pengembangan DAO. Jadi selain mengimplementasikanSomeObjectDao
antarmuka Anda, Anda dapat memperluas salah satu*DataSupport
kelas Spring .sumber
templates
untuk mengakses db? atau hanya abstraksi untuk digunakan dengan komponen pegas lainnya? Misalnya, apakah mungkin untuk menulis kode yang hanya menggunakan spring-dao untuk mengakses db (tanpa menggunakan spring-jdbc, spring-orm, hibernate atau framework lainnya)?Sebagai info tambahan. Saya sarankan Anda menggunakan Spring Data JPA. Menggunakan anotasi seperti: @Repository, @Service. Saya tunjukkan contoh:
Dimana CustomerEntitlementsProjection adalah proyeksi Musim Semi, terkait dengan entitas Anda atau DTO pojo;
sumber