Pertama-tama pertimbangkan untuk menggunakan parameter kueri dalam pernyataan yang disiapkan:
PreparedStatement stm = c.prepareStatement("UPDATE user_table SET name=? WHERE id=?");
stm.setString(1, "the name");
stm.setInt(2, 345);
stm.executeUpdate();
Hal lain yang bisa dilakukan adalah menyimpan semua kueri di file properti. Misalnya dalam file queries.properties dapat menempatkan kueri di atas:
update_query=UPDATE user_table SET name=? WHERE id=?
Kemudian dengan bantuan kelas utilitas sederhana:
public class Queries {
private static final String propFileName = "queries.properties";
private static Properties props;
public static Properties getQueries() throws SQLException {
InputStream is =
Queries.class.getResourceAsStream("/" + propFileName);
if (is == null){
throw new SQLException("Unable to load property file: " + propFileName);
}
//singleton
if(props == null){
props = new Properties();
try {
props.load(is);
} catch (IOException e) {
throw new SQLException("Unable to load property file: " + propFileName + "\n" + e.getMessage());
}
}
return props;
}
public static String getQuery(String query) throws SQLException{
return getQueries().getProperty(query);
}
}
Anda mungkin menggunakan kueri Anda sebagai berikut:
PreparedStatement stm = c.prepareStatement(Queries.getQuery("update_query"));
Ini adalah solusi yang agak sederhana, tetapi berfungsi dengan baik.
InputStream
dalamif (props == null)
pernyataan sehingga Anda tidak membuat instance saat tidak diperlukan.Untuk SQL sembarang, gunakan jOOQ . jOOQ saat ini mendukung
SELECT
,INSERT
,UPDATE
,DELETE
,TRUNCATE
, danMERGE
. Anda dapat membuat SQL seperti ini:Alih-alih mendapatkan string SQL, Anda juga bisa menjalankannya, menggunakan jOOQ. Lihat
http://www.jooq.org
(Penafian: Saya bekerja untuk perusahaan di belakang jOOQ)
sumber
"?"
atau apakah akan memasukkan nilai ikatan sebaris.Salah satu teknologi yang harus Anda pertimbangkan adalah SQLJ - cara untuk menyematkan pernyataan SQL langsung di Java. Sebagai contoh sederhana, Anda mungkin memiliki yang berikut ini dalam file bernama TestQueries.sqlj:
Ada langkah precompile tambahan yang mengambil file .sqlj Anda dan menerjemahkannya ke dalam Java murni - singkatnya, ini mencari blok khusus yang dipisahkan dengan
dan mengubahnya menjadi panggilan JDBC. Ada beberapa manfaat utama menggunakan SQLJ:
Ada implementasi penerjemah di sebagian besar vendor database utama, jadi Anda harus dapat menemukan semua yang Anda butuhkan dengan mudah.
sumber
Saya ingin tahu apakah Anda mencari sesuatu seperti Squiggle . Juga sesuatu yang sangat berguna adalah jDBI . Itu tidak akan membantu Anda dengan kueri.
sumber
Saya akan melihat-lihat Spring JDBC . Saya menggunakannya setiap kali saya perlu menjalankan SQL secara terprogram. Contoh:
Ini sangat bagus untuk segala jenis eksekusi sql, terutama query; ini akan membantu Anda memetakan kumpulan hasil ke objek, tanpa menambahkan kompleksitas ORM lengkap.
sumber
Saya cenderung menggunakan Parameter JDBC Bernama Spring sehingga saya dapat menulis string standar seperti "pilih * dari bla di mana colX = ': someValue'"; Saya pikir itu cukup mudah dibaca.
Alternatifnya adalah memasukkan string dalam file .sql terpisah dan membaca konten menggunakan metode utilitas.
Oh, patut juga untuk melihat Squill: https://squill.dev.java.net/docs/tutorial.html
sumber
Saya mendukung rekomendasi untuk menggunakan ORM seperti Hibernate. Namun, pasti ada situasi di mana itu tidak berhasil, jadi saya akan menggunakan kesempatan ini untuk mempromosikan beberapa hal yang telah saya bantu untuk menulis: SqlBuilder adalah pustaka java untuk secara dinamis membangun pernyataan sql menggunakan gaya "pembangun". itu cukup kuat dan cukup fleksibel.
sumber
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:
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:
Ini akan menghasilkan SQL berikut:
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.
sumber
Mengapa Anda ingin membuat semua sql dengan tangan? Pernahkah Anda melihat ORM seperti Hibernate Tergantung pada proyek Anda, itu mungkin akan melakukan setidaknya 95% dari apa yang Anda butuhkan, melakukannya dengan cara yang lebih bersih daripada SQL mentah, dan jika Anda perlu mendapatkan kinerja terakhir Anda dapat membuat Kueri SQL yang perlu disetel secara manual.
sumber
Anda juga dapat mengunjungi MyBatis ( www.mybatis.org ). Ini membantu Anda menulis pernyataan SQL di luar kode java Anda dan memetakan hasil sql ke dalam objek java Anda antara lain.
sumber
Google menyediakan pustaka yang disebut Pustaka Persitensi Ruangan yang menyediakan cara yang sangat bersih untuk menulis SQL untuk Aplikasi Android , pada dasarnya lapisan abstraksi di atas Basis Data SQLite yang mendasarinya . Di bawah ini adalah potongan kode singkat dari situs resmi:
Ada lebih banyak contoh dan dokumentasi yang lebih baik di dokumen resmi untuk perpustakaan.
Ada juga yang disebut MentaBean yang merupakan ORM Java . Ini memiliki fitur bagus dan tampaknya cara yang cukup sederhana untuk menulis SQL.
sumber
Room provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite
. Jadi, ini bukan pustaka ORM generik untuk RDBMS. Ini terutama dimaksudkan untuk Aplikasi Android.Baca file XML.
Anda dapat membacanya dari file XML. Mudah dirawat dan digunakan. Ada parser STaX, DOM, SAX standar yang tersedia di luar sana untuk membuatnya menjadi beberapa baris kode di java.
Lakukan lebih banyak dengan atribut
Anda dapat memiliki beberapa informasi semantik dengan atribut pada tag untuk membantu melakukan lebih banyak hal dengan SQL. Ini bisa berupa nama metode atau jenis kueri atau apa pun yang membantu Anda mengurangi kode.
Pertahankan
Anda dapat meletakkan xml di luar toples dan merawatnya dengan mudah. Manfaat yang sama seperti file properti.
Konversi
XML dapat diperluas dan mudah diubah ke format lain.
Kasus Penggunaan
Metamug menggunakan xml untuk mengkonfigurasi file resource REST dengan sql.
sumber
I don't see a reason to make use of XML.
, karena saya tidak dapat mengeditnya.Jika Anda meletakkan string SQL dalam file properti dan kemudian membacanya di Anda dapat menyimpan string SQL dalam file teks biasa.
Itu tidak menyelesaikan masalah tipe SQL, tapi setidaknya itu membuat menyalin & menempel dari TOAD atau sqlplus jauh lebih mudah.
sumber
Bagaimana Anda mendapatkan penggabungan string, selain dari string SQL yang panjang di PreparedStatements (yang dapat Anda sediakan dengan mudah dalam file teks dan tetap memuat sebagai sumber daya) yang Anda hancurkan beberapa baris?
Anda tidak membuat string SQL secara langsung, bukan? Itu adalah larangan terbesar dalam pemrograman. Harap gunakan PreparedStatements, dan berikan data sebagai parameter. Ini sangat mengurangi kemungkinan SQL Injection.
sumber