JDBC Statement PreparedStatement
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
JDBC
JDBC یک API در زبان Java است که به برنامهنویسان اجازه میدهد به پایگاههای داده متصل شده و دستورات SQL را اجرا کنند.
Statement
Statement اینترفیسی در JDBC است که برای اجرای دستورات SQL ایستا (Static) استفاده میشود. در این حالت، مقادیر مستقیماً در رشته کوئری قرار میگیرند.
PreparedStatement
PreparedStatement نسخهای پیشرفتهتر از Statement است که اجازه میدهد کوئریها را به صورت پارامتریک تعریف کنید. این اینترفیس از علامت سوال (?) به عنوان جایگاه مقادیر استفاده میکند.
SQL Injection
SQL Injection یک تکنیک نفوذ و حمله امنیتی است که در آن مهاجم کد SQL مخربی را از طریق ورودیهای کاربر به کوئری تزریق میکند تا دیتابیس را تخریب کرده یا اطلاعات غیرمجاز به دست آورد.
Query Compilation/Caching
فرآیندی در دیتابیس که طی آن کوئری تحلیل و برای اجرا آماده میشود. PreparedStatement اجازه میدهد این فرآیند یکبار انجام شده و برای دفعات بعد در حافظه موقت (Cache) ذخیره شود.
نکات مهم مصاحبهای
تفاوت اصلی Statement و PreparedStatement چیست؟
Statement برای کوئریهای ایستا که پارامتر ندارند مناسب است، در حالی که PreparedStatement برای کوئریهای پویا که چندین بار با مقادیر مختلف اجرا میشوند، استفاده میشود.
چرا PreparedStatement از نظر امنیتی برتر است؟
زیرا مقادیر ورودی کاربر را به عنوان بخشی از دستور SQL اجرا نمیکند، بلکه آنها را فقط به عنوان داده (Literal) در نظر میگیرد و مانع از حملات SQL Injection میشود.
کدام یک کارایی (Performance) بهتری دارد؟
PreparedStatement؛ زیرا دیتابیس کوئری را یکبار کامپایل کرده و آن را Cache میکند. در نتیجه در اجراهای مکرر، زمان صرف تحلیل مجدد سینتکس نمیشود.
در چه مواقعی استفاده از 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 مواجه خواهید شد.
