CodeGym/Java Course/All lectures for BN purposes/পরামিতি সহ অনুরোধ

পরামিতি সহ অনুরোধ

বিদ্যমান

4.1 অনুরোধের জন্য পরামিতি

হাইবারনেট আপনাকে প্রশ্নে পরামিতি পাস করতে দেয়। এইভাবে, প্রশ্নগুলির সাথে সমস্ত কাজ এবং ডাটাবেস ব্যাপকভাবে সরলীকৃত হয়।

অপরিবর্তনীয় প্রশ্ন খুঁজে পাওয়া খুবই বিরল। প্রথমে, মনে হচ্ছে আপনাকে ডাটাবেস থেকে পণ্যের একটি তালিকা ফেরত দিতে হবে। এবং তারপর দেখা যাচ্ছে যে আপনার একটি নির্দিষ্ট তারিখে একটি নির্দিষ্ট ব্যবহারকারীর জন্য পণ্যগুলির একটি আপ-টু-ডেট তালিকা প্রয়োজন। প্রয়োজনীয় ক্ষেত্র অনুসারে সাজানো, এবং এখনও পুরো তালিকা নয়, তবে একটি নির্দিষ্ট পৃষ্ঠা: উদাহরণস্বরূপ, 21 থেকে 30 পর্যন্ত পণ্য।

এবং এটি ঠিক কি প্যারামিটারাইজড প্রশ্নগুলি সমাধান করে। আপনি HQL-এ একটি ক্যোয়ারী লেখেন এবং তারপরে আপনি "বিশেষ নাম" - পরামিতিগুলির সাথে পরিবর্তন করা যেতে পারে এমন মানগুলি প্রতিস্থাপন করেন। এবং তারপরে আলাদাভাবে অনুরোধটি কার্যকর করার সময়, আপনি এই পরামিতিগুলির মানগুলি পাস করতে পারেন।

আসুন একটি HQL ক্যোয়ারী লিখি যা একটি নির্দিষ্ট নামের ব্যবহারকারীর জন্য সমস্ত কাজ ফিরিয়ে দেবে:

from EmployeeTask where employee.name = "Ivan Ivanovich"

এখন একটি প্যারামিটার দিয়ে নাম প্রতিস্থাপন করা যাক:

from EmployeeTask where employee.name = :username

এবং এইভাবে কাজ খোঁজার জন্য আমাদের জাভা কোড দেখতে হবে:

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();

এছাড়াও, একটি প্যারামিটার নামের পরিবর্তে, আপনি শুধুমাত্র একটি সংখ্যা ব্যবহার করতে পারেন:

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();

যদিও এটি ভাল, অবশ্যই, নাম ব্যবহার করা - এই ধরনের কোড পড়া এবং বজায় রাখা অনেক সহজ।

4.2 সেট প্যারামিটারলিস্ট() পদ্ধতি।

এমন কিছু ক্ষেত্রেও আছে যখন প্যারামিটারের মান এক নয়, কিন্তু বস্তুর একটি তালিকা উপস্থাপন করে। উদাহরণস্বরূপ, আমরা পরীক্ষা করতে চাই যে কর্মচারীদের পেশাগুলি একটি নির্দিষ্ট তালিকায় রয়েছে।

কিভাবে এটি করা যেতে পারে:


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();

একটি প্যারামিটার মান হিসাবে 4 ধরনের তালিকা পাস করা যেতে পারে:

  • অবজেক্টের অ্যারে: অবজেক্ট[]
  • collection: সংগ্রহ
  • টাইপ করা অ্যারে: T[]
  • টাইপ করা সংগ্রহ: সংগ্রহ<T>

আপনি যদি একটি টাইপ করা সংগ্রহ বা অ্যারে পাস করার সিদ্ধান্ত নেন, তাহলে আপনাকে তৃতীয় প্যারামিটার হিসাবে ডেটা টাইপ পাস করতে হবে। উদাহরণ:


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();

তালিকার পরামিতিগুলির সাথে কাজ করার সময়, আপনি প্যারামিটার নামের পরিবর্তে একটি সংখ্যাও ব্যবহার করতে পারেন। তবে আবার, নামটি আরও সুবিধাজনক।

4.3 এসকিউএল ইনজেকশনের বিরুদ্ধে সুরক্ষা

পরামিতিগুলির অন্যতম গুরুত্বপূর্ণ উদ্দেশ্য হল এসকিউএল ইনজেকশন থেকে ডাটাবেসকে রক্ষা করা। অনেক নবীন প্রোগ্রামার, প্যারামিটার ব্যবহার করার পরিবর্তে, কয়েকটি অংশের একটি স্ট্রিংকে একসাথে আঠালো করে দেয়।

এই মত লেখার পরিবর্তে:

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();

এই মত লিখতে হবে:

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

এটা কখনই করবেন না!একাধিক অংশ থেকে SQL/HQL ক্যোয়ারী একসাথে আটকে রাখবেন না। কারণ শীঘ্রই বা পরে ক্লায়েন্ট থেকে ব্যবহারকারীর নাম আপনার কাছে আসবে। এবং দুষ্ট হ্যাকার আপনাকে একটি স্ট্রিং লাইক দেবে""Ivan"; DROP TABLE user;"

এবং তারপর ডাটাবেসে আপনার ক্যোয়ারী ফর্মটি গ্রহণ করবে:

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

এবং এটি এখনও ভাল যদি আপনার ডেটা কেবল মুছে ফেলা হয়। আপনি এই মত লিখতে পারেন:

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

অথবা এই মত:

from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই