Parametrli so'rovlar

All lectures for UZ purposes
Daraja, Dars
Mavjud

4.1 So'rovlarga parametrlar

Hibernate so'rovlarga parametrlar uzatishga imkoniyat beradi. Bu esa so'rovlar va ma'lumotlar bazasi bilan ishlashni juda osonlashtiradi.

O'zgarmas so'rovlarni juda kam uchratish mumkin. Avvaliga, ma'lumotlar bazasidan faqat mahsulotlar ro'yxatini qaytarishingiz kerakdek tuyulishi mumkin. Keyinchalik, ma'lum bir foydalanuvchi uchun ma'lum bir sanaga tegishli mahsulotlar ro'yxati kerak bo'lib chiqadi. Zarur bo'lgan maydon bo'yicha saralangan, va yana butun ro'yxat emas, balki muayyan sahifa: misol uchun, 21dan 30gacha bo'lgan mahsulotlar.

Bu vazifani parametrli so'rovlar hal qiladi. Siz HQL so'rovini yozasiz, va keyinchalik o'zgarishi mumkin bo'lgan qiymatlarni "maxsus nomlar" – parametrlar bilan almashtirasiz. So'ngra so'rovni bajarishda parametrlarning qiymatlarini alohida uzatishingiz mumkin.

Keling, foydalanuvchi uchun barcha vazifalarni qaytaruvchi HQL-so'rovini yozaylik:


from EmployeeTask where employee.name = "Ivan Ivanovich"

Endi ismini parametrrga almashtiramiz:


from EmployeeTask where employee.name = :username

Mana bizning Java-kodimiz qanday ko'rinadi:


String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Parametr ismi o'rniga raqamni ham ishlatish mumkin:


String hql = "from EmployeeTask where employee.name = :1";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(1, "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Lekin, albatta, ismni ishlatish yaxshiroq – bunday kodni o'qish va qo'llab-quvvatlash ancha oson.

4.2 setParameterList() metodi

Sizning parametr qiymatingiz yagona bo'lmagan hollari ham bo'ladi, balki ob'ektlar ro'yxatini ifodalaydi. Masalan, biz xodim kasblarning muayyan ro'yxatdagi mavjudligini tekshirishni xohlaymiz.

Bu qanday amalga oshirilishi mumkin:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"});
List<EmployeeTask> resultLIst = query.list();

Parametr qiymati sifatida 4 turdagi ro'yxatni uzatishingiz mumkin:

  • ob'ektlar massivi: Object[]
  • kollektsiya: Collection
  • tiplangan massiv: T[]
  • tiplangan kollektsiya: Collection<T>

Agar tiplangan kollektsiya yoki massiv uzatishni xohlasangiz, tip ma'lumotlarini uchinchi parametr sifatida berishingiz kerak. Masalan:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"}, String.class);
List<EmployeeTask> resultLIst = query.list();

Parametrlar ro'yxati bilan ishlashda parametr ismi o'rniga raqamni ham ishlatishingiz mumkin. Lekin yana ism bilan ishlash qulayroq.

4.3 SQL Injection'dan himoya

Parametrlarning muhim vazifalaridan biri – bu baza ma'lumotlarini SQL-in'ektsiyalaridan himoya qilish. Ko'pgina dasturchilar boshlovchi o'rniga parametrdan foydalanishdan ko'ra, shunchaki bir nechta qismdan iborat qatorni yopishtiradi.

Bunday yozish o'rniga:


String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Quyidagi kabi yozgan bo'lurdilar:


String hql = "from EmployeeTask where employee.name = " + "Ivan Ivanovich";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
List<EmployeeTask> resultLIst = query.list();

Hech qachon bunday qilmang! Hech qachon SQL/HQL-so'rovini bir nechta qismdan yopishtirma. Chunki tez orada foydalanuvchi ismini sizga mijozdan yuboradilar. Va yovuz xaker mijozning ismi sifatida sizga "Ivan"; DROP TABLE user;" kabi qatorni uzatadi.

Shunda sizning ma'lumotlar bazangiz uchun so'rovingiz quyidagicha ko'rinishni oladi:


from EmployeeTask where employee.name = "Ivan"; DROP TABLE user;

Bu esa yaxshi, agar sizning ma'lumotlaringizni shunchaki o'chirib tashlashsa. Axir, quyidagicha yozish ham mumkin:


from EmployeeTask where employee.name = "Ivan";
UPDATE user SET password = '1' WHERE user.role = 'admin'

Yoki shunday:


from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION