Mungkin menggunakan JDBI - Evolving An Open Source Project presentasi untuk beberapa materi
Catatan dari migrasi proyek kecil:
Mengganti nama kelas (jadi tidak sesederhana menghapus impor dan membiarkan IDE memperbaikinya):
DBI
-> Jdbi
IDBI
-> Jdbi
DBIException
-> JdbiException
Konstruktor untuk Jdbi
telah diganti dengan metode pabrik create()
.
ResultSetMapper
diganti dengan RowMapper
dan metode map
tidak lagi memiliki indeks baris. Kelas bernama ResultSetMapper
ada di Jdbi 3, tetapi memiliki tujuan yang berbeda. @Mapper
diganti dengan @UseRowMapper
. registerMapper()
pada Jdbi
diganti dengan registerRowMapper()
.
@BindIn
diganti dengan @BindList
dan tidak lagi membutuhkan StringTemplate.
Dengan templating Jdbi default, tanda kurung sudut tidak dikutip, yang berarti IntelliJ memahami sintaks setelah Anda mengonfigurasi Pola Parameter di bawah Tools -> Database -> User Patterns .
Query
tidak lagi memiliki tipe default Map
dan dengan demikian list()
tidak dapat dipanggil secara langsung. Hubungi mapToMap()
sebelum menelepon list()
.
TransactionStatus
tidak ada lagi.
TransactionConsumer.useTransaction()
hanya membutuhkan Handle
sekarang, jadi argumen TransactionStatus
perlu dihapus saat menggunakan ini dengan metode useTransaction()
pada Jdbi
atau Handle
.
TransactionCallback.inTransaction()
hanya membutuhkan Handle
sekarang, jadi argumen TransactionStatus
perlu dihapus saat menggunakan ini dengan metode inTransaction()
pada Jdbi
atau Handle
.
CallbackFailedException
tidak ada lagi. Berbagai antarmuka fungsional seperti HandleConsumer
, HandleCallback
, TransactionalConsumer
, dan TransactionalCallback
, sekarang dapat membuang semua jenis pengecualian (tetapi dibatasi menggunakan obat generik untuk menghindari pemeriksaan yang tidak perlu penanganan pengecualian).
Dukungan SQL Object tidak lagi tersedia secara default. Itu harus didaftarkan setiap instance Jdbi
yang dibuat.
Migrate Refactor IntelliJ sangat membantu untuk memulai migrasi.
Terima kasih @electrum untuk menyatukan ini! Ini akan sangat membantu
Beberapa catatan tambahan dari meninjau presentasi saya:
java.lang.reflect.Type
, sedangkan v2 menggunakan java.lang.Class
. Ini berarti v3 mampu menangani tanda tangan tipe generik kompleks yang tidak bisa dilakukan v2.@Bind
pada parameter metode Objek SQL dapat dibuat opsional, dengan mengkompilasi kode Anda dengan flag -parameters
diaktifkan.StatementLocator
dihapus dari inti. Semua pernyataan inti berharap untuk menerima SQL aktual sekarang. Konsep serupa, SqlLocator
telah ditambahkan tetapi hanya di bidang Objek SQL.Satu lagi: StatementRewriter
telah difaktorkan ulang menjadi TemplateEngine
dan SqlParser
.
Sangat penting untuk ditambahkan ke daftar adalah perilaku pilih. Itu pergi dari ini:
List<Map<String, Object>> rs = h.select("select id, name from something");
Untuk ini:
List<Map<String, Object>> rs = h.select("select id, name from something").mapToMap().list();
Saya berharap kekuatan ekstra dan fleksibilitas dan keamanan v3 tidak datang dengan harga bertele-tele.
Hai @javajosh , kami tidak menganggap yang satu itu terlalu buruk karena kami mencoba untuk mencegah pemetaan ke objek Map
. Jika tidak ada yang lain, aturan seputar sensitivitas huruf besar/kecil untuk kunci membingungkan. Apakah ada alasan Anda harus mengeluarkan Map
daripada membuat tipe yang Anda tentukan sendiri? Saya pribadi akan selalu menulis kelas hasil kecil (menggunakan konstruktor/bidang/pemeta dan pengikat properti) dan selalu menghindari penggunaan Map
. Apakah Anda memiliki beberapa kasus penggunaan yang sangat nyaman?
Hai @stevenschlansker - Saya membahasnya dari perspektif "pengalaman pertama pengembang". Kode di atas diambil dari tutorial v2 Anda sendiri, yang menurut saya sangat minimalis. Dan memang, dengan bahasa yang dihosting JVM seperti Groovy, yang memiliki peta bawaan seperti javascript, Anda mungkin akan lebih sering melihat hasil yang tidak diketik.
@javajosh apa pendapat Anda tentang https://github.com/jdbi/jdbi/pull/925 ?
@stevenschlansker Apakah maksud Anda #928 ?
@stevenschlansker Pasti peningkatan! Tapi itu masih lebih verbose dari v2. :) Ini selain verbositas yang lebih besar di maven, dll. Saya hanya tidak ingin melihat JDBI mengikuti JUnit yang berjuang untuk membuat orang mengadopsi v4 karena memiliki beberapa fitur yang bagus, tetapi jauh lebih rumit daripada v3 dan v3 adalah "cukup baik". Saya memiliki perasaan yang sama tentang sintaks "withHandle" (walaupun saya mengerti naluri Anda untuk menghilangkan semua pegangan yang menggantung).
@javajosh Anda masih memiliki Jdbi.open()
jika Anda ingin kontrol yang lebih besar, meskipun kami menyarankan Anda menggunakannya di dalam blok coba-dengan-sumber daya untuk keamanan.
Mulai mengerjakan dokumen migrasi v2 ke v3.
@javajosh Kembali ke metode ResultBearing.list()
yang mengembalikan List<Map<String,Object>>
: Saya tidak yakin menambahkan ini adalah ide yang bagus, terutama di akhir siklus rilis ini.
Saya berempati dengan kekhawatiran Anda tentang verbositas, tetapi verbositas itu bertujuan untuk memperjelas maksud pengembang:
handle.createQuery(sql)
.mapToMap()
.list()
lebih jelas bagi pembaca daripada:
handle.createQuery(sql)
.list()
Ini hal yang rumit, dan saya tidak iri dengan posisi Anda yang harus memilih. JDBI adalah perpustakaan yang bagus, dan saya senang telah mencatat kekhawatiran saya tentang verbositas; apakah masuk akal untuk menambahkan metode kenyamanan dalam kasus khusus ini, saya tidak yakin dan akan cenderung mempercayai penilaian Anda atas penilaian saya, karena saya tidak terlibat secara serius dalam proyek tersebut! Terima kasih untuk mendengarkan!
Beri tahu kami jika Anda menemukan contoh nyata tentang bagaimana nama yang lebih pendek lebih baik, atau contoh bagaimana kami dapat meningkatkannya
Komentar yang paling membantu
Catatan dari migrasi proyek kecil:
Mengganti nama kelas (jadi tidak sesederhana menghapus impor dan membiarkan IDE memperbaikinya):
DBI
->Jdbi
IDBI
->Jdbi
DBIException
->JdbiException
Konstruktor untuk
Jdbi
telah diganti dengan metode pabrikcreate()
.ResultSetMapper
diganti denganRowMapper
dan metodemap
tidak lagi memiliki indeks baris. Kelas bernamaResultSetMapper
ada di Jdbi 3, tetapi memiliki tujuan yang berbeda.@Mapper
diganti dengan@UseRowMapper
.registerMapper()
padaJdbi
diganti denganregisterRowMapper()
.@BindIn
diganti dengan@BindList
dan tidak lagi membutuhkan StringTemplate.Dengan templating Jdbi default, tanda kurung sudut tidak dikutip, yang berarti IntelliJ memahami sintaks setelah Anda mengonfigurasi Pola Parameter di bawah Tools -> Database -> User Patterns .
Query
tidak lagi memiliki tipe defaultMap
dan dengan demikianlist()
tidak dapat dipanggil secara langsung. HubungimapToMap()
sebelum meneleponlist()
.TransactionStatus
tidak ada lagi.TransactionConsumer.useTransaction()
hanya membutuhkanHandle
sekarang, jadi argumenTransactionStatus
perlu dihapus saat menggunakan ini dengan metodeuseTransaction()
padaJdbi
atauHandle
.TransactionCallback.inTransaction()
hanya membutuhkanHandle
sekarang, jadi argumenTransactionStatus
perlu dihapus saat menggunakan ini dengan metodeinTransaction()
padaJdbi
atauHandle
.CallbackFailedException
tidak ada lagi. Berbagai antarmuka fungsional sepertiHandleConsumer
,HandleCallback
,TransactionalConsumer
, danTransactionalCallback
, sekarang dapat membuang semua jenis pengecualian (tetapi dibatasi menggunakan obat generik untuk menghindari pemeriksaan yang tidak perlu penanganan pengecualian).Dukungan SQL Object tidak lagi tersedia secara default. Itu harus didaftarkan setiap instance
Jdbi
yang dibuat.Migrate Refactor IntelliJ sangat membantu untuk memulai migrasi.