Statements turlari
Biz allaqachon eng oddiy interfeys Statementni ko'rdik. Va u ishlash uchun juda mos keladi, lekin murakkab so'rovlar uchun u unchalik mos emas. Ba'zi manbalarda Statementni umuman ishlatmaslik kerak degan fikr keltiriladi — uning o'rniga yanada murakkab va yanada funksional interfeyslardan foydalanish mumkin.
- PreparedStatement
- CallableStatement
Xo'sh, bu interfeyslar nima uchun kerak? Birgalikda tushunaylik.
Birinchi navbatda biz PreparedStatement interfeysini va boshqa JDBC imkoniyatlarini ko'rib chiqamiz. CallableStatement interfeysiga keyinroq murojaat qilamiz — uning ishlatilishi, birinchidan, unchalik tez-tez uchramaydi, ikkinchidan, u haqidagi barcha ko'rib chiqilgan narsalardan so'ng, endi bu haqida qisqa gaplashsa bo'ladi.
Bundan tashqari, PreparedStatement SQL Injection deb ataladigan ma'lumotlar bazasini buzishning mashhur usulidan himoya qilishda juda yaxshi yordam beradi.
Lekin bu haqida batafsilroq keyinroq.
PreparedStatement
Agar biz PreparedStatement nomini tarjima qilishga harakat qilsak, taxminan "tayyorlangan operator" degan ma'noda bo'ladi. Bu yerda eng muhim so'z "tayyorlangan". "Tayyorlanganlik" nimada?
Bu savolni ko'rib chiqishdan oldin, juda qulaylik nuqtai nazaridan muhim bir lahzani ko'rishni taklif qilaman, bu juda tez-tez uchraydi. Demak, biror dasturda CONTACT jadvaliga kontakt ma'lumotlarini kiritishimiz kerak. Buning uchun quyidagi kabi bir so'rovni tayyorlashimiz kerak:
INSERT INTO
JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)
VALUES
(
'Harry',
'Potter',
'+79112345678',
'harry@example.com'
);
Birinchi qarashda, hammasi unchalik qiyin va qo'rqinchli emasdek ko'rinadi. Bizga kerakli qatorni parametrlar: ism, familiya, manzil va telefon orqali yig'uvchi kodni yozish kerak. Faqat unutmang, barcha satrli ma'lumotlarni turgan oddiy qo'shtirnoqlar bilan o'rash kerak bo'ladi.
Agar biz buni alohida funksiyada qilsak, u quyidagicha bo'ladi:
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;
}
Biz funksiyaga ism, familiya, telefon va manzil ko'rinishidagi parametrlarni yuboramiz va ulardan SQL-so'rov qatorini to'playmiz. Qo'shtirnoqlar biroz rasmni buzadi, lekin hali unchalik qo'rqinchli emas.
Ok, raqamlar bilan nima qilish kerak? Ularni qo'shtirnoqlar bilan o'rash kerak emas. Oppa, ba'zi hollarda qo'shtirnoqlar kerak, ba'zilarida esa kerak emas. Vaziyat qiyinlashmoqda.
Endi yana bir muammoni qo'shamiz — agar satr ichida oddiy qo'shtirnoq (hatto bir nechta) bo'lsa nima bo'ladi? Bunday qo'shtirnoqlarni oldindan topib, ularni qayta ishlash kerak. Mdaaa. O'zimizni qandaydir noqulay his qila boshladik.
Agar endi sana ishlovini qo'shsak, vazifa butunlay zerikarli bo'ladi — juda ko'p ish qilish kerak. Sanalar bilan umuman yoqimsiz — turli SQL serverlar sanalar uchun turli formatlarni qabul qiladi.
Demak, nima ko'rib turibmiz? Agar biz so'rov ichida parametrlarni ishlatishimiz kerak bo'lsa, qo'lda so'rov tuzish juda yoqimsiz ish bo'lib qoladi. Faqat yoqimsizgina emas — hatto zerikarli ham deyish mumkin. Juda ko'p holatlarni hisobga olish kerak, va bu juda zerikarli ish. Asosan shunday hollarda PreparedStatement interfeysi taklif qilingan.
Bu so'rov sizga ikki narsani bajarishga imkon beradi:
- Parametrlar o'rni ko'rsatilgan holda so'rovni oldindan tayyorlash
- Aniq turdagi parametrlarni o'rnatib, shundan so'ng allaqachon o'rnatilgan parametrlar bilan so'rovni bajarish
PreparedStatementdan foydalanish namunasi
Bizning parametrlarni o'rnatish variantimiz uchun PreparedStatement konstruktsiyasi quyidagicha ko'rinadi:
// Misol uchun o'zgaruvchilar
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";
// Parametrlar uchun o'rin ko'rsatilgan so'rov, savol belgisi "?" ko'rinishida
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";
// So'rovni yaratish. con o'zgaruvchisi Connection turidagi obyekt
PreparedStatement stmt = con.prepareStatement(sql);
// Parametrlarni o'rnatish
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);
// So'rovni bajarish
stmt.executeUpdate();
Ko'rib turganingizdek, hammasi unchalik murakkab emas.
Birinchidan, SQL-so'rov yozishda parametrlar o'rniga savol belgisi — "?" belgilanadi.
Ikkinchidan — so'rov con.prepareStatement() chaqirig'i orqali yaratiladi.
Uchinchidan — parametrlarni o'rnatish raqam va qiymat ko'rsatilishi orqali amalga oshiriladi. E'tibor bering, parametr raqamlari 1 dan boshlanadi, biz odatda massivlar va kolleksiyalar bilan ishlashda 0 dan boshlanishiga o'rganib qolganmiz.
PreparedStatement interfeysi satrlarni o'rnatish uchun metodlarni o'z ichiga oladi — setString(), raqamlarni o'rnatish uchun — setInt(), setLong(), setDouble(), sanalarni o'rnatish uchun — setDate(). Va yanada murakkab turlar — bularni dokumentatsiyada ko'rish mumkin.
To'rtinchidan — stmt.executeUpdate() chaqirig'i allaqachon so'rov qatori ko'rsatilmasdan bajariladi.
Juda ham PreparedStatement bilan do'stlashishni tavsiya qilaman — bu juda samarali vosita.
GO TO FULL VERSION