Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

JDBC Statement PreparedStatement

📖توضیحات درس

🎥 این ویدیو قسمت سی‌وسوم از بوت‌کمپ رایگان جاواست. 📚 JDBC – تفاوت Statement با PreparedStatement در این جلسه به یکی از موضوعات مهم و پرکاربرد در JDBC می‌پردازیم: تفاوت بین Statement و PreparedStatement. با هم یاد می‌گیریم چطور با PreparedStatement کوئری‌های پارامتردار اجرا کنیم و چرا این روش در بسیاری از سناریوها انتخاب بهتری نسبت به Statement ساده است. در این ویدیو به‌صورت دقیق بررسی می‌کنیم: - امنیت و جلوگیری از SQL Injection - تفاوت‌ها از نظر سرعت و کارایی - شرایطی که بهتر است از هر کدام استفاده شود در پایان جلسه یک مرور کلی داریم تا تمام نکات کلیدی کاملاً روشن و قابل استفاده در پروژه‌های واقعی باشد. ⚠️ نکته: کیفیت تصویر این ویدیو کمی پایین‌تر از حد معمول است؛ بابت این موضوع عذرخواهی می‌کنیم. 📌 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی می‌تونی توی گروه بپرسی؛ من یا مربی‌های گروه کمکت می‌کنیم 💬 🎯 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق و ورود به بازار کار.
00:41:01🎯رایگان

📄جزوه

مفاهیم کلیدی

  • JDBC یک API در زبان Java که به برنامه‌نویسان اجازه می‌دهد به پایگاه‌های داده متصل شده و دستورات SQL را اجرا کنند.

  • Statement اینترفیسی در JDBC که برای اجرای دستورات SQL ایستا (Static) استفاده می‌شود. در این حالت، مقادیر مستقیماً در رشته کوئری قرار می‌گیرند.

  • PreparedStatement نسخه‌ای پیشرفته‌تر از Statement که اجازه می‌دهد کوئری‌ها را به صورت پارامتریک تعریف کنید. این اینترفیس از علامت سوال (?) به عنوان جایگاه مقادیر استفاده می‌کند.

  • SQL Injection یک تکنیک نفوذ و حمله امنیتی که در آن مهاجم کد SQL مخربی را از طریق ورودی‌های کاربر به کوئری تزریق می‌کند تا دیتابیس را تخریب کرده یا اطلاعات غیرمجاز به دست آورد.

  • Query Compilation/Caching فرآیندی در دیتابیس که طی آن کوئری تحلیل و برای اجرا آماده می‌شود. PreparedStatement اجازه می‌دهد این فرآیند یک‌بار انجام شده و برای دفعات بعد در حافظه موقت (Cache) ذخیره شود.

نکات مهم مصاحبه‌ای

  • تفاوت اصلی Statement و PreparedStatement چیست؟ Statement برای کوئری‌های ایستا که پارامتر ندارند مناسب است، در حالی که PreparedStatement برای کوئری‌های پویا که چندین بار با مقادیر مختلف اجرا می‌شوند استفاده می‌شود.

  • چرا PreparedStatement از نظر امنیتی برتر است؟ چون مقادیر ورودی کاربر را به عنوان بخشی از دستور SQL اجرا نمی‌کند، بلکه آن‌ها را فقط به عنوان داده (Literal) در نظر می‌گیرد و مانع از حملات SQL Injection می‌شود.

  • کدام یک کارایی (Performance) بهتری دارد؟ PreparedStatement؛ زیرا دیتابیس کوئری را یک‌بار کامپایل کرده و آن را کش می‌کند، در نتیجه در اجراهای مکرر، زمان صرف تحلیل مجدد سینتکس نمی‌شود.

  • در چه مواقعی استفاده از Statement منطقی است؟ زمانی که کوئری به صورت ثابت است و هیچ ورودی از کاربر دریافت نمی‌کند، مانند دستورات CREATE TABLE یا DROP TABLE.

مثال یا سناریوی کاربردی

در ویدیو سناریویی نمایش داده شد که در آن کاربر باید نام کاربری خود را وارد کند تا در دیتابیس ذخیره شود.

  • روش ناامن (Statement): برنامه‌نویس با استفاده از عملگر + رشته ورودی کاربر را به کوئری متصل می‌کند. اگر کاربر به جای نام، عبارتی مانند '; DROP TABLE users; -- را وارد کند، دستور اول تمام شده و دستور مخرب حذف جدول اجرا می‌شود.
  • روش امن (PreparedStatement): کوئری به صورت INSERT INTO users (username) VALUES (?) تعریف می‌شود. سپس با متد setString(1, input) مقدار کاربر جایگذاری می‌شود. در این حالت، حتی اگر کاربر دستور مخرب وارد کند، دیتابیس آن را فقط به عنوان یک نام کاربری ساده (و نه یک دستور) ذخیره می‌کند.

بیشتر بدانید

  • مدیریت وابستگی‌ها برای اتصال به دیتابیس‌هایی مثل PostgreSQL، باید وابستگی (Dependency) مربوطه را در فایل pom.xml پروژه (در پروژه‌های Maven) اضافه کنید، در غیر این صورت با خطای No suitable driver found مواجه خواهید شد.