JDBC Statement PreparedStatement
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
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مواجه خواهید شد.
