Saya telah mengerjakan aplikasi servlet Java yang perlu membuat pernyataan SQL yang sangat dinamis untuk tujuan pelaporan adhoc. Fungsi dasar dari aplikasi ini adalah untuk memasukkan banyak parameter permintaan HTTP bernama ke dalam kueri yang telah dikodekan sebelumnya, dan menghasilkan tabel keluaran yang diformat dengan baik. Saya menggunakan Spring MVC dan kerangka kerja injeksi ketergantungan untuk menyimpan semua kueri SQL saya dalam file XML dan memuatnya ke dalam aplikasi pelaporan, bersama dengan informasi pemformatan tabel. Akhirnya, persyaratan pelaporan menjadi lebih rumit daripada kemampuan kerangka kerja pemetaan parameter yang ada dan saya harus menulis sendiri. Itu adalah latihan yang menarik dalam pengembangan dan menghasilkan kerangka kerja untuk pemetaan parameter yang jauh lebih kuat daripada apa pun yang dapat saya temukan.
Pemetaan parameter baru terlihat seperti ini:
select app.name as "App",
${optional(" app.owner as "Owner", "):showOwner}
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = ${integer(0,50):serverId}
and app.id in ${integerList(50):appId}
group by app.name, ${optional(" app.owner, "):showOwner} sv.name
order by app.name, sv.name
Keindahan dari framework yang dihasilkan adalah ia dapat memproses parameter permintaan HTTP secara langsung ke dalam kueri dengan pemeriksaan jenis dan pemeriksaan batas yang tepat. Tidak ada pemetaan tambahan yang diperlukan untuk validasi input. Dalam contoh kueri di atas, parameter bernama serverId
akan diperiksa untuk memastikannya dapat mentransmisikan ke integer dan berada dalam kisaran 0-50. Parameter appId akan diproses sebagai larik bilangan bulat, dengan batas panjang 50. Jika bidang showOwnerada dan disetel ke "true", bit SQL dalam tanda kutip akan ditambahkan ke kueri yang dihasilkan untuk pemetaan bidang opsional. field Beberapa pemetaan tipe parameter lainnya tersedia termasuk segmen opsional SQL dengan pemetaan parameter lebih lanjut. Ini memungkinkan pemetaan kueri serumit yang bisa dihasilkan oleh pengembang. Ia bahkan memiliki kontrol dalam konfigurasi laporan untuk menentukan apakah kueri tertentu akan memiliki pemetaan akhir melalui PreparedStatement atau hanya dijalankan sebagai kueri yang dibuat sebelumnya.
Untuk contoh nilai permintaan Http:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
Ini akan menghasilkan SQL berikut:
select app.name as "App",
app.owner as "Owner",
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = 20
and app.id in (1,2,3,5,7,11,13)
group by app.name, app.owner, sv.name
order by app.name, sv.name
Saya benar-benar berpikir bahwa Spring atau Hibernate atau salah satu kerangka kerja tersebut harus menawarkan mekanisme pemetaan yang lebih kuat yang memverifikasi tipe, memungkinkan tipe data kompleks seperti array dan fitur serupa lainnya. Saya menulis mesin saya hanya untuk tujuan saya, tidak cukup dibaca untuk rilis umum. Saat ini hanya berfungsi dengan kueri Oracle dan semua kode itu milik perusahaan besar. Suatu hari nanti saya dapat mengambil ide-ide saya dan membangun kerangka kerja sumber terbuka baru, tetapi saya berharap salah satu pemain besar yang ada akan mengambil tantangan.