Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

Javaالإنترفيس ResultSet في جافا

  • مقدمة
  • التعامل بسهولة مع بيانات كائن الـ ResultSet و حل ثلاث مشاكل مهمة
  • دوال الإنترفيس ResultSet
  • مثال شامل

مقدمة

الإنترفيس ResultSet مصمم لتخزين أي بيانات يتم جلبها من قاعدة البيانات مهما كان نوعها.
عند حفظ نتيجة الإستعلام في كائن الـ ResultSet, فإنها تتخزن فيه كجدول يتألف من أسطر ( Rows ) و أعمدة ( Columns ).

يمكنك الوصول إلى البيانات المخزنة في كائن الـ ResultSet بالترتيب عموداً تلو الآخر و سطراً تلو الآخر باستخدام الحلقة while.

ليس من الضروري أن تمر على جميع الأعمدة أو الأسطر الموجودة في كائن الـ ResultSet.
يمكنك تحديد الأعمدة التي تريد الوصول إلى البيانات المخزنة فيها بطرقتين:

  1. من خلال إسم العمود, لأن كل عمود في كائن الـ ResultSet له إسم مختلف و هو نفس الإسم الموجود في قاعدة البيانات.
  2. من خلال رقم الـ Index الخاص بكل عمود, لأنه أيضاُ يتم ترقيم الأعمدة الموجودة في كائن الـ ResultSet إبتداءاً من الرقم 1.

ملاحظة: يفضل استخدام أرقام الـ Indexes للوصول إلى الأعمدة بدل إستخدام أسمائها.


بناؤه

public interface ResultSet
extends Wrapper, AutoCloseable

التعامل بسهولة مع بيانات كائن الـ ResultSet و حل ثلاث مشاكل مهمة

في حال لم تقم بتجهيز كائن الـ Statement أو كائن الـ PreparedStatement الذي ستستخدمه عند تنفيذ الإستعلامات قد تواجه ثلاث مشاكل:

  1. لا تستطيع المرور على نفس العمود أو السطر أكثر من مرة واحدة. أي لا يمكنك العودة للوراء, دائماً تنتقل للعمود التالي أو السطر التالي.
  2. أي تحديث لقاعدة البيانات يحدث لها بعد أن قمت بجلب بيانات منها و تخزينها في كائن الـ ResultSet لن يظهر لك.
  3. عدم التفرقة بين الأحرف الكبيرة و الأحرف الصغيرة. فمثلاً في حال كان الجدول يحتوي على أسماء أعمدة (أي حقول) متشابهة مثل Name و name فإنه لن يفرق بينهما. أي في حال وضعت الكلمة name في نص الإستعلام, سيظنك تقصد أول عمود Name.

لحل هذه المشاكل نقوم بتمرير الثوابت TYPE_SCROLL_INSENSITIVE و CONCUR_UPDATABLE للدالة التي سنستخدمها لإنشاء كائن من الإنترفيس Statement أو الإنترفيس PreparedStatement الذي سنستخدمه لتنفيذ الإستعلامات كالتالي:


مثال

لإنشاء كائن Statement مع حل هذه المشاكل, نقوم بإستدعاء الدالة createStatement() كالتالي.

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

لإنشاء كائن PreparedStatement مع حل هذه المشاكل, نقوم بإستدعاء الدالة prepareStatement() كالتالي.

PreparedStatement pstmt = con.prepareStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); 

ملاحظة: يتم إغلاق كائن الـ ResultSet بشكل تلقائي عندما يتم إغلاق كائن الـ Statement أو كائن الـ ResultSet الذي أنشئ بواسطته.

دوال الإنترفيس ResultSet

الجدول التالي يحتوي على دوال الإنترفيس ResultSet.

الدالة مع تعريفها
1 public boolean next() تستخدم للإنتقال إلى السطر التالي الموجود في كائن الـ ResultSet الذي قام باستدعائها.
ترجع true في حال كان يوجد سطر يلي السطر الحالي, غير ذلك ترجع false.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
2 public boolean previous() تستخدم للإنتقال إلى السطر السابق الموجود في كائن الـ ResultSet الذي قام باستدعائها.
ترجع true في حال كان يوجد سطر يسبق السطر الحالي, غير ذلك ترجع false.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
3 public boolean first() تستخدم للإنتقال إلى أول سطر موجود في كائن الـ ResultSet الذي قام باستدعائها.
ترجع true في حال كان يوجد سطر واحد على الأقل في كائن الـ ResultSet, غير ذلك ترجع false.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
4 public boolean last() تستخدم للإنتقال إلى آخر سطر موجود في كائن الـ ResultSet الذي قام باستدعائها.
ترجع true في حال كان يوجد سطر واحد على الأقل في كائن الـ ResultSet, غير ذلك ترجع false.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
5 public int getRow() ترجع رقم السطر الحالي في كائن الـ ResultSet.
في حال لم تصل بعد لأي سطر ترجع 0. أول سطر في كائن الـ ResultSet يكون رقمه 1, ثاني سطر 2 إلخ..

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
6 public boolean absolute(int row) تستخدم للإنتقال إلى سطر محدد في كائن الـ ResultSet الذي قام باستدعائها.
ترجع true في حال تم الإنتقال إلى سطر موجود في كائن الـ ResultSet, غير ذلك ترجع false.

مكان الباراميتر row نضع رقم أكبر أو أصغر من صفر.
- في حال وضعنا عدد أكبر من صفر, فإنها تنتقل إلى السطر الذي يشير له هذا العدد و تبدأ في عد الأسطر كالتالي:
  أول سطر في كائن الـ ResultSet يكون رقمه 1, ثاني سطر 2 إلخ..
- في حال وضعنا عدد أصغر من صفر, فإنها تنتقل إلى السطر الذي يشير له هذا العدد و تبدأ في عد الأسطر بطريقة عكسية كالتالي:
  آخر سطر في كائن الـ ResultSet يكون رقمه -1, قبل آخر سطر -2 إلخ..

ملاحظة:
إستدعاء الدالة absolute(1) هكذا يساوي إستدعاء الدالة first().
و إستدعاء الدالة absolute(-1) هكذا يساوي إستدعاء الدالة last().

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
7 public boolean relative(int row) تستخدم للإنتقال إلى سطر محدد في كائن الـ ResultSet الذي قام باستدعائها مقارنة مع السطر الحالي.
ترجع true في حال تم الإنتقال إلى سطر موجود في كائن الـ ResultSet, غير ذلك ترجع false.

مكان الباراميتر row نضع رقم أكبر أو أصغر من صفر.
- في حال وضعنا عدد أكبر من صفر, فإنها تنتقل إلى السطر التالي الذي يشير له هذا العدد كالتالي:
  أول سطر بعد السطر الحالي يكون رقمه 1, ثاني سطر بعده 2 إلخ..
- في حال وضعنا عدد أصغر من صفر, فإنها تنتقل إلى السطر السابق الذي يشير له هذا العدد كالتالي:
  أول سطر قبل السطر الحالي يكون رقمه -1, ثاني سطر قبله -2 إلخ..

ملاحظة:
إستدعاء الدالة relative(1) هكذا يساوي إستدعاء الدالة next().
و إستدعاء الدالة relative(-1) هكذا يساوي إستدعاء الدالة previous().
و إستدعاء الدالة relative(0) هكذا ليس له أي تأثير.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.
8 public String getString(int columnIndex) تستخدم للحصول على النص الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كنص عادي String.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
9 public String getString(String columnLabel) تستخدم للحصول على النص الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كنص عادي String.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
10 public int getInt(int columnIndex) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه int.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
11 public int getInt(String columnLabel) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه int.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
12 public long getLong(int columnIndex) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه long.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
13 public long getLong(String columnLabel) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه long.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
14 public float getFloat(int columnIndex) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه float.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
15 public float getFloat(String columnLabel) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه float.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
16 public double getDouble(int columnIndex) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه double.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
17 public double getDouble(String columnLabel) تستخدم للحصول على الأرقام التي تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه double.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
18 public boolean getBoolean(int columnIndex) تستخدم للحصول على قيمة نوعها BOOLEAN تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كـ boolean, أي ترجع true أو false.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ false.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
19 public boolean getBoolean(String columnLabel) تستخدم للحصول على قيمة نوعها BOOLEAN تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كـ boolean, أي ترجع true أو false.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ false.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
20 public byte getByte(int columnIndex) تستخدم للحصول على بيانات نوعها BYTE تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه byte.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
21 public byte getByte(String columnLabel) تستخدم للحصول على بيانات نوعها BYTE تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كعدد نوعه byte.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
22 public byte[] getBytes(int columnIndex) تستخدم للحصول على بيانات نوعها BYTE تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كمصفوفة نوعها byte.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
23 public byte[] getBytes(String columnLabel) تستخدم للحصول على بيانات نوعها BYTE تم جلبها من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعها لنا كمصفوفة نوعها byte.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
24 public Date getDate(int columnIndex) تستخدم للحصول على التاريخ الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعه لنا ككائن من الكلاس Date.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
25 public Date getDate(String columnLabel) تستخدم للحصول على التاريخ الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها إسم العمود الذي نريد الحصول على قيمته. فترجعه لنا ككائن من الكلاس Date.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
26 public Clob getClob(String columnIndex) تستخدم للحصول على الملف الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على الملف الموجود فيه. فترجعه لنا ككائن من الإنترفيس Clob.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو كان كائن الـ ResultSet مغلقاً.
  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.

مثال شامل

في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سننشئ كائن من الإنترفيس Statement بواسطة الدالة createStatement() مع تمرير الثوابت TYPE_SCROLL_INSENSITIVE و CONCUR_UPDATABLE لها كـ Arguments.
ثم سنرسل إستعلام يقضي بجلب جميع بيانات جدول الموظفين ( employee ) و تخزينهم في كائن من الإنترفيس ResultSet.
في الأخير سنتجاوز أول أربعة أسطر موجودة في كائن الـ ResultSet و سنستخدم الحلقة while لعرض المعلومات المتوفرة حول الموظفين.


Main.java
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
 
public class Main {
 
    public static void main(String[] args) {
 
        try {
            // الذي سنعتمد عليه للوصول إلى قاعدة البيانات MYSQL Driver هنا قمنا بتحديد رابط الوصول لبرنامج الـ
            Class.forName("com.mysql.jdbc.Driver");
 
            // و الذي سنستخدمه لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات Connection هنا قمنا بإنشاء كائن من الكلاس
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","thepassword");
 
            // و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
            Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
 
            // rs هنا قمنا بإرسال إستعلام إلى قاعدة البيانات لجلب جميع أسماء الموظفين الموجودة في جدول الموظفين. بعدها قمنا بتخزين النتيجة في الكائن
            ResultSet rs = stmt.executeQuery("select * from employee");
 
            // rs هنا إنتقلنا إلى خامس سطر موجود في الكائن
            rs.absolute(5);
 
            // و التي ستبدأ من خامس سطر موجود فيه rs هنا أنشأنا حلقة تمر على جميع الأسطر التي تم تخزينها في الكائن
            while(rs.next()) {
                // ( ID + First Name + Last Name + Email ) هنا في كل دورة سيتم عرض معلومات موظف واحد
                System.out.println(rs.getInt(1) +": "+ rs.getString(2) +" "+ rs.getString(3)+" - "+ rs.getString(4));
            }
 
            // هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
            con.close();
        }
        catch(Exception e) {
            System.out.println(e.getMessage());
        }
 
    }
 
}

لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج, سيظهر لنا جميع الأسماء التي أرجعها لنا الإستعلام كالتالي.

5: Said Houssayyan - said.houssayyan@gmail.com
6: Mohamad Mostafa - Moh.mostafa@hotmail.com
7: Rana Sablouh - rana1992@gmail.com
8: Dima Masri - dima_masri@outlook.com
9: Tamer Al-halabi - tamer_h@gmail.com
...