JDBC ResultSet
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
- ResultSet
یک Object در Java که پس از اجرای پرسوجوهای SQL (مانند SELECT) توسط دیتابیس برگردانده میشود و شامل تمام سطرهای دادهای است که با شرط کوری مطابقت دارند.
- Cursor
یک نشانگر داخلی در ResultSet که به سطر جاری (Current Row) اشاره میکند. با استفاده از متدهایی میتوان این نشانگر را بین سطرها حرکت داد.
- Navigation
قابلیت پیمایش در میان دادههای بازگشتی. به طور پیشفرض پیمایش فقط به سمت جلو امکانپذیر است، اما میتوان آن را برای حرکت به عقب یا پرش به سطرهای خاص تنظیم کرد.
- ResultSetMetaData
یک اینترفیس کمکی که اطلاعاتی درباره ساختار خودِ نتایج (نه لزوماً دادهها) ارائه میدهد؛ مانند تعداد ستونها، نام هر ستون و نوع دادهای هر فیلد.
- Column Index
شماره ترتیب ستونها در نتایج بازگشتی که برخلاف اکثر ساختارهای داده در برنامهنویسی، در ResultSet از شماره ۱ شروع میشود.
نکات مهم مصاحبهای
-
موقعیت اولیه Cursor در یک ResultSet جدید کجاست؟
نشانگر در ابتدا در موقعیت "قبل از اولین سطر" قرار دارد. بنابراین همیشه باید قبل از خواندن اولین داده، متدnext()را فراخوانی کنید تا نشانگر روی سطر اول قرار بگیرد. -
تفاوت بین فراخوانی ستونها با نام (Label) و شماره (Index) چیست؟
دسترسی با شماره (Index) سریعتر است، اما دسترسی با نام ستون خوانایی کد را بالاتر برده و در صورت تغییر ترتیب ستونها در کوریSQL(مثلاً با زدنSELECT *) مانع از بروز خطا میشود. -
انواع اصلی اسکرول در ResultSet چیست؟
حالتTYPE_FORWARD_ONLYکه فقط اجازه حرکت به جلو را میدهد و حالتTYPE_SCROLL_INSENSITIVEکه اجازه حرکت به عقب و جلو را میدهد اما تغییرات همزمان دیتابیس را نشان نمیدهد. -
چرا بستن (Close) کردن ResultSet اهمیت دارد؟
برای جلوگیری از نشت حافظه (Memory Leak) و آزادسازی منابع اشغال شده در دیتابیس و اپلیکیشن، حتماً باید بعد از اتمام کار،ResultSetبسته شود.
مثال یا سناریوی کاربردی
در این آموزش، ابتدا یک اتصال به دیتابیس برقرار شده و جدولی به نام users ساخته میشود. پس از درج (Insert) چند کاربر، یک PreparedStatement برای جستجوی کاربران بر اساس نام کاربری ایجاد میگردد.
مراحل گامبهگام استخراج داده:
۱. اجرای کوری با executeQuery() که خروجی را در یک ResultSet قرار میدهد.
۲. استفاده از یک حلقه while که شرط آن resultSet.next() است. این متد تا زمانی که سطر بعدی وجود داشته باشد مقدار true برمیگرداند.
۳. در داخل حلقه، با متدهایی مثل getString(columnName) یا getInt(columnIndex) مقادیر فیلدها استخراج میشوند.
while (rs.next()) {
String fName = rs.getString("first_name");
String uName = rs.getString(4); // دسترسی از طریق ایندکس ستون چهارم
System.out.println(fName + " : " + uName);
}
بیشتر بدانید
- نکته درباره Metadata
با استفاده از متد getColumnType از اینترفیس MetaData میتوان به کد عددی نوع داده در دیتابیس دسترسی پیدا کرد. برای مثال عدد ۴ نماینده Integer و عدد ۱۲ نماینده VarChar (رشته) است.
تنظیمات پیشرفته پیمایش
اگر بخواهید از متدهایی مثل previous() (برگشت به عقب)، first() (رفتن به اولین سطر) یا last() (رفتن به آخرین سطر) استفاده کنید، هنگام ساختن Statement باید صراحتاً نوع اسکرول را مشخص کنید، در غیر این صورت با خطای SQL Exception مواجه خواهید شد.
