İfade türleri

En basit Deyim arayüzünü zaten gördük . Ve iş için oldukça uygun olmasına rağmen, karmaşık sorgular için pek uygun değildir. Bazı kaynaklarda, Deyim kullanmanın hiç gerekli olmadığı , bunun yerine daha karmaşık ve işlevsel açıdan daha zengin arayüzlerin uygun olduğu görüşü ifade edilmektedir.

  • HazırlananBildirim
  • CallableBildirimi

Oldukça makul bir soru ortaya çıkıyor - bu arayüzlere neden ihtiyaç var? Hadi çözelim.

Öncelikle, PreparedStatement arayüzüne ve diğer JDBC özelliklerine bir göz atacağız . CallableStatement arayüzüne daha sonra döneceğiz - ilk olarak kullanımı o kadar yaygın değildir ve ikincisi, onunla ilgili her şey düşünüldükten sonra, konuşma zaten oldukça kısa yapılabilir.

Ayrıca, PreparedStatement , SQL Injection adı verilen veritabanı korsanlığına yönelik popüler yaklaşımdan büyük bir yardımdır.

Ama biraz sonra bunun hakkında daha fazlası.

HazırlananBildirim

ReadyedStatement adını çevirmeye çalışırsanız , "hazırlanan ifade" gibi bir şey elde edebilirsiniz. Buradaki en önemli kelime “hazırlanmış” tır. "Hazırlık" nedir?

Bu konuyu ele almadan önce, oldukça sık rastlanan kolaylık açısından oldukça önemli bir noktayı görmeyi öneriyorum. Bu nedenle, bazı uygulamalarda, kişi verilerini CONTACT tablosuna eklememiz gerekir. Bunun için aşağıdaki gibi bir sorgu hazırlamamız gerekiyor:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

İlk bakışta, her şey o kadar zor ve korkutucu değilmiş gibi görünüyor. İhtiyacımız olan diziyi şu parametrelerden toplayacak bir kod yazmamız gerekiyor: ad, soyad, adres ve telefon numarası. Tüm dize verilerinin tek bir alıntı karakteriyle çevrelenmesi gerektiğini hatırlamanız yeterlidir.

Bunu ayrı bir işlevde yaparsak, şöyle bir şey elde ederiz:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+
             	”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Formdaki parametre fonksiyonuna ad, soyad, telefon numarası ve adresi aktarıyoruz ve bunlardan bir SQL sorgu dizesi oluşturuyoruz. Alıntılar resmi biraz bozuyor ama şu ana kadar korkutucu değil.

Peki ya sayılar? Tırnak içine alınmaları gerekmez. Ek olarak, bir durumda alıntılara ihtiyacın var, diğerinde yok. Durum daha da karmaşıklaşıyor.

Şimdi bir sorun daha ekleyelim - ya dizgenin içinde sıradan bir alıntı varsa (ve bir tane bile değilse)? Önce bu tür alıntıları aramalı ve bunları işlemelisiniz. Mdaaaa. Bir şekilde kendimizi rahatsız hissetmeye başlıyoruz.

Şimdi tarih işlemeyi eklersek, görev tamamen sıkıcı hale gelir - çok fazla iş yapmanız gerekir. Tarihler genellikle tatsızdır - farklı SQL sunucuları, tarihler için farklı biçimleri kabul eder.

Peki ne görüyoruz? Sorgu içinde parametreler kullanmamız gerekirse, sorguyu manuel olarak oluşturmak çok tatsız hale gelir. Ve sadece tatsız değil - sıkıcı bile diyebilirim. Dikkate alınması gereken çok sayıda vaka var ve bu çok sıkıcı bir iş. Temel olarak, PreparedStatement arabirimi bu tür durumlar için önerilmiştir .

Bu istek iki şey yapmanızı sağlar:

  • Parametrelerin değiştirileceği yerleri önceden belirten bir talep hazırlayın
  • Belirli bir türdeki parametreleri ayarlayın ve ardından önceden ayarlanmış parametrelerle bir sorgu yürütün

Hazırlanan İfade Örneği

Parametreleri ayarlama seçeneğimiz için PreparedStatement yapısı şöyle görünecektir:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Gördüğünüz gibi, her şey oldukça basit.

İlk olarak, bir SQL sorgusu yazarken, parametrelerin değiştirilmesi gereken yerler soru işaretleri - “?” ile yazılır.

İkinci olarak, istek con.prepareStatement() çağrılarak oluşturulur .

Üçüncüsü, parametrelerin ayarlanması, sayı ve değerin gösterilmesinden geçer. Diziler ve koleksiyonlarla çalışırken alıştığımız gibi parametre sayısının 0'dan değil 1'den başladığını lütfen unutmayın.

PreparedStatement arabirimi dizeleri ayarlamak için yöntemler içerir — setString() , sayıları ayarlamak için — setInt() , setLong() , setDouble() , tarihleri ​​ayarlamak için — setDate() . Ve daha karmaşık tipler - bu, belgelerde görülebilir.

Dördüncüsü, stmt.executeUpdate() çağrısı zaten sorgu dizesi belirtilmeden yürütülür.

ReadyedStatement ile arkadaş olmanızı şiddetle tavsiye ederim - bu çok etkili bir araçtır.