الإنترفيسات و الكلاسات المصممة خصيصاً للتعامل مع قواعد البيانات في جافا

الإنترفيسات و الكلاسات المصممة خصيصاً للتعامل مع قواعد البيانات في جافا

الجدول التالي يحتوي على الإنترفيسات و الكلاسات التي يمكنك إستخدامها للتعامل مع قواعد البيانات سواء لبدء الإتصال, تنفيذ إستعلامات, تخزين نتائج الإستعلامات إلخ..

الكلاس / الإنترفيس مع تعريفه
public class DriverManager الكلاس DriverManager مصمم لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات مثل إسم الـ Driver الذي سنستخدمه, إسم قاعدة البيانات, إسم المستخدم و كلمة مروره.
تابع القراءة »
public interface Connection

    الإنترفيس Connection

مصمم لإنشاء إتصال بين البرنامج و قاعدة البيانات بالإعتماد على المعلومات التي تم تحديدها فيه في كائن الـ DriverManager.
تابع القراءة »
public interface DatabaseMetaData

 الإنترفيس DatabaseMetaData

 يوفر مجموعة ضخمة من الدوال التي يمكن إستخدامها لمعرفة معلومات متعلقة بقاعدة البيانات التي تتعامل معها.
تابع القراءة »
public interface Statement

    الإنترفيس Statement

 مصمم لإرسال الإستعلامات الثابتة التي لا تتغير إلى قاعدة البيانات, أي يمكنك إستخدامه في حال كنت تريد تنفيذ نفس أوامر الـ SQL في كل مرة تقوم فيها بتشغيل البرنامج.
تابع القراءة »
public interface PreparedStatement الإنترفيس PreparedStatement يرث من الإنترفيس Statement, تم تصميمه لإرسال إستعلامات إلى قاعدة البيانات أثناء عمل البرنامج, كما أنه يمكن إستخدامه لتنفيذ نفس أوامر الـ SQL عدة مرات.
تابع القراءة »
public interface ResultSet الإنترفيس ResultSet مصمم لتخزين أي بيانات يتم جلبها من قاعدة البيانات مهما كان نوعها.
تابع القراءة »
public interface ResultSetMetaData الإنترفيس ResultSetMetaData يستخدم لمعرفة معلومات تتعلق بالجدول ( أو الجداول ) المخزنة في كائن الـ ResultSet, مثل:

  • أسماء الجداول المخزنة فيه.

  • عدد الأعمدة المخزنة فيه.

  • أسماء الأعمدة المخزنة فيه.

  • أنواع البيانات التي يمكن تخزينها في الأعمدة إلخ..


تابع القراءة »

Javaالكلاس DriverManager في جافا

مقدمة

الكلاس DriverManager مصمم لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات مثل:

  • إسم الـ Driver الذي سنستخدمه.

  • إسم قاعدة البيانات.

  • إسم المستخدم في قاعدة البيانات.

  • كلمة مرور المستخدم في قاعدة البيانات.


بناؤه

                  public interface DriverManager
                  extends Object
                

دوال الكلاس DriverManager

الجدول التالي يحتوي على دوال الكلاس DriverManager التي تستخدم للإتصال بقاعدة البيانات.

الدالة مع تعريفها
public static Connection getConnection(String url) تحدد رابط الـ Driver الذي سنستخدمه لربط البرنامج بقاعدة البيانات.
الـ url هو نص يكتب بهذا الشكل jdbc:subprotocol:subname و يمثل رابط الوصول إلى قاعدة البيانات.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public static Connection getConnection(String url, String name, String password) تحدد رابط الـ Driver الذي سنستخدمه لربط البرنامج بقاعدة البيانات مع تحديد إسم المستخدم و كلمة مروره التي تسمح له بالولوج إلى قاعدة البيانات.
  • الـ url هو نص يكتب بهذا الشكل jdbc:subprotocol:subname و يمثل رابط الوصول إلى قاعدة البيانات.

  • الـ name هو نص يمثل إسم المستخدم في قاعدة البيانات.

  • الـ password هو نص يمثل كلمة مرور المستخدم في قاعدة البيانات.


ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public static Connection getConnection(String url, Properties info) تحدد رابط الـ Driver الذي سنستخدمه لربط البرنامج بقاعدة البيانات مع تحديد إسم المستخدم و كلمة مروره التي تسمح له بالولوج إلى قاعدة البيانات.
  • الـ url هو نص يكتب بهذا الشكل jdbc:subprotocol:subname و يمثل رابط الوصول إلى قاعدة البيانات.

  • الـ infoعبارة عن كائن نوعه Properties يمثل معلومات كثيرة متعلقة بالإتصال بقاعدة البيانات و يجب أن يحتوي على الأقل إسم المستخدم كلمة مروره في قاعدة البيانات..


ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
__________&&&______;&&&___________;

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

مقدمة

الإنترفيس Connection مصمم لإنشاء إتصال بين البرنامج و قاعدة البيانات بالإعتماد على المعلومات التي تم تحديدها فيه في كائن الـ DriverManager.

ملاحظة: كائن الـ Connection يقوم بشكل تلقائي بحفظ جميع التغيرات التي تحدث في قاعدة البيانات من قبل المستخدم.


بناؤه

                  public interface Connection
                  extends Wrapper, AutoCloseable
                

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

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

الدالة مع تعريفها
public Statement createStatement() ترجع كائن نوعه Statement من كائن الـ Connection الذي قام باستدعائها.
يمكن إستخدام كائن الـ Statement الذي تم إرجاعه لإرسال إستعلامات ثابتة إلى قاعدة البيانات.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً.
public PreparedStatement prepareStatement(String sql) ترجع كائن نوعه PreparedStatement من كائن الـ Connection الذي قام باستدعائها.
يمكن إستخدام كائن الـ PreparedStatement الذي تم إرجاعه لإرسال إستعلامات غير ثابتة إلى قاعدة البيانات.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً.
public void setAutoCommit(boolean autoCommit) إفتراضياً, كائن الـ Connection يقوم بشكل تلقائي بحفظ جميع التغيرات التي تحدث في قاعدة البيانات من قبل المستخدم.
في حال قمت باستدعاء هذه الدالة من قبل كائن الـ Connection و قمت بتمرير القيمة false لها مكان الباراميتر autoCommit, عندها لن يقوم بحفظ التغيرات التي تحدث في قاعدة البيانات بشكل تلقائي. و سيكون عليك إستدعاء الدالة commit() لحفظ التغيرات.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً.
public void commit() في حال تم جعل الكائن الـ Connection لا يقوم بحفظ التغيرات التي نجريها في قاعدة البيانات بشكل تلقائي, يجب إستدعاء هذه الدالة من قبل كائن الـ Connection لحفظ جميع التغيرات التي حدثت.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً أو في حال كان كائن الـ Connection أصلاً يحفظ التغيرات التي تحدث بشكل تلقائي.
public void rollback() في حال كان كائن الـ Connection يقوم بحفظ التغيرات التي نجريها في قاعدة البيانات بشكل تلقائي, يمكن إستدعاء هذه الدالة من قبل كائن الـ Connection لإلغاء جميع التغيرات التي حدثت بسبب آخر عملية أجريت في قاعدة البيانات.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً أو في حال كان كائن الـ Connection أصلاً يحفظ التغيرات التي تحدث بشكل تلقائي.
public void close()

تستخدم لإغلاق الإتصال مع قاعدة البيانات, فعلياً تغلق كائن الـ Connection و جميع الكائنات المرتبطة فيه.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

public DatabaseMetaData getMetaData() ترجع كائن نوعه DatabaseMetaData يمثل كامل معلومات الإتصال المتعلقة بكائن الـ Connection الذي قام باستدعائها. هذه المعلومات تجعلك قادراً على معرفة جميع خصائص قاعدة البيانات و الأعمدة و الأسطر التي فيها, بالإضافة إلى جميع البيانات المتوفرة حول الـ Driver المستخدم.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال كان كائن الـ Connection مغلقاً.
__________&&&______;&&&___________;

الإنترفيس DatabaseMetaData في جافا

مقدمة

الإنترفيس DatabaseMetaData يوفر مجموعة ضخمة من الدوال التي يمكن إستخدامها لمعرفة معلومات متعلقة بقاعدة البيانات التي تتعامل معها. مثل:

  • إسم قاعدة البيانات ( Database Name ).

  • إصدار قاعدة اليبانات ( Database Version ).

  • رابط الوصول لقاعدة البيانات ( Database URL ).

  • الأوامر الموجودة في قاعدة البيانات ( Database Keywords ).

  • إسم الـ Driver المستخدم ( Driver Name ).

  • إصدار الـ Driver المستخدم ( Driver Version ).

  • أسماء الجداول الموجودة في قاعدة البيانات ( Tables Names ).

  • إسم المستخدم المتصل بقاعدة البيانات من التطبيق ( User Name ).


للحصول على كائن DatabaseMetaData من كائن الـ Connection نستدعي الدالة getMetaData().


بناؤه

                  public interface DatabaseMetaData
                  extends Wrapper
                
__________&&&______;&&&___________;

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

مقدمة

الإنترفيس Statement مصمم لإرسال الإستعلامات الثابتة التي لا تتغير إلى قاعدة البيانات, أي يمكنك إستخدامه في حال كنت تريد تنفيذ نفس أوامر الـ SQL في كل مرة تقوم فيها بتشغيل البرنامج.

إفتراضياً, كائن واحد من الإنترفيس ResultSet مقابل كائن واحد من الإنترفيس Statement يمكن فتحه في نفس الوقت.
مع العمل أنه يمكن وجود أكثر من كائن نوعه ResultSet مفتوح في نفس الوقت, بشرط أن يكون كل واحد منهم مرتبط بكائن Statement مختلف.

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


بناؤه

      public interface Statement
      extends Wrapper, AutoCloseable
    

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

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

الدالة مع تعريفها
public Connection getConnection()

ترجع كائن الـ Connection الذي تم من خلاله إنشاء كائن الـ Statement الذي قام باستدعائها.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

public ResultSet executeQuery(String sql) تنفذ الإستعلام الذي نقوم بتمريره لها كنص في قاعدة البيانات, ثم ترجع نتيجة الإستعلام ككائن نوعه ResultSet.
الأمر الذي يمرر لها في العادة يكون أمر SELECT ثابت.
إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().

public int executeUpdate(String sql) تنفذ الإستعلام الذي نقوم بتمريره لها كنص في قاعدة البيانات.
ترجع عدد الأسطر التي تم إضافتها أو التعديل عليها. و ترجع 0 في حال كان الإستعلام لا يرجع شيء.
إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().

public ResultSet getResultSet() ترجع نتيجة الإستعلام الذي قمنا بإرساله سابقاً بواسطة كائن الـ Statement الذي قام باستدعائها ككائن نوعه ResultSet.
ترجع null في حال لم يرجع الإستعلام أي نتيجة.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو تم إستدعاءها على كائن Statement مغلق.
public void addBatch(String sql) تضيف نص الإستعلام الذي نمرره لها كـ Argument في لائحة خاصة في كائن الـ Statement الذي قام باستدعائها. الهدف من هذه الائحة تجميع الإستعلامات المراد إرسالها إلى قاعدة البيانات و إرسالهم دفعة واحدة مما يسرع الأداء.
نص الإستعلام الذي نمررها مكان الباراميتر sql يكون عبارة عن أمر INSERT أو UPDATE.

إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement, أو في حال كان الـ Driver المستخدم لا يدعم عملية تجميع الإستعلامات و إرسالها دفعة واحدة (Batching Process), أو في حال تم إستدعاءها من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.
public int[] executeBatch() ترسل أمر يقضي بتنفيذ مجموعة أوامر الـ SQL المعدة للإرسال دفعة واحدة و بنفس الترتيب الذي تم إضافتهم فيها بواسطة الدالة addBatch().
إذا تم تنفيذ جميع الأوامر التي تم تجهيزها بواسطة الدالة addBatch(), ترجع مصفوفة نوعها int.

قيم عناصر هذه المصفوفة تكون إحدى هذه الإحتمالات:
  1. رقم أكبر أو يساوي صفر يؤكد أن الأمر قد تم تنفيذه بنجاح. الرقم عبارة عن عدد الأسطر التي تم إضافتها أو تحديث قيمها.

  2. قيمة المتغير SUCCESS_NO_INFO التي يمكنك تحديدها بنفسك, لأن هذا المتغير هو ثابت مجهز في الكلاس Statement. هذا الرقم يؤكد أن عدد الأسطر التي أضيفت أو تم تعديل قيمها غير معروف.

  3. قيمة المتغير EXECUTE_FAILED التي يمكنك تحديدها بنفسك, لأن هذا المتغير هو ثابت مجهز في الكلاس Statement أيضاً. هذا الرقم يؤكد أنه لم يتم تنفيذ جميع الأوامر بنجاح و لكن الـ Driver إستمر في تنفيذ الأوامر الموضوعة.


إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().

public void clearBatch() تمسح الإستعلامات التي تم تجميعها في كائن الـ Statement الذي قام باستدعائها.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement, أو في حال كان الـ Driver المستخدم لا يدعم عملية تجميع الإستعلامات و إرسالها دفعة واحدة (Batching Process).
public void cancel() تقوم بإلغاء الإستعلام الذي تم تجهيزه في كائن الـ Statement في حال كانت قاعدة البيانات و الـ Driver المستخدم يدعمان عملية إلغاء الإستعلام.

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

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver لا يدعم هذه الدالة.

public void close() تستخدم لإغلاق الإتصال مع قاعدة البيانات, فعلياً تغلق كائن الـ Statement و كائن الـ ResultSet المرتبط به.

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

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setQueryTimeout(int seconds) تحدد عدد الثواني الأقصى الذي قد يتنظره الـ Driver المستخدم في عملية الإتصال لتنفيذ أوامر من كائن الـ Statement.
عند إستدعائها نمرر لها رقم أكبر أو يساوي صفر يمثل عدد الثواني كـ Argument.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال قمنا بإعطائها قيمة أصغر من صفر.
public int getQueryTimeout() ترجع عدد الثواني الأقصى الذي قد يتنظره الـ Driver المستخدم في عملية الإتصال لتنفيذ أوامر من كائن الـ Statement.
ترجع 0 في حال لم يتم تحديد فترة الإنتظار.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو تم إستدعاءها على كائن Statement مغلق.
public void setMaxRows(int max) تحدد عدد الأسطر الأقصى الذي يمكن أن يحتويه أي كائن ResultSet ينتج من كائن الـ Statement.
عند إستدعائها نمرر لها رقم رقم أكبر أو يساوي 0 كـ Argument يمثل عدد الأسطر الأقصى الذي يمكن أن يحتويه كائن الـ ResultSet. في حال قمنا بتمرير 0 فهذا يعني أنه لا حدود للأسطر التي يمكن أن يحتويها كائن الـ ResultSet.
ملاحظة: في حال كان عدد الأسطر الذي نتج عن الإستعلام أكبر من عدد الأسطر التي يمكن أن يستوعبها كائن الـ ResultSet, يتم تجاهل الأسطر الزائدة.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات أو في حال قمنا بإعطائها قيمة أصغر من صفر.
public SQLWarning getWarnings() ترجع أول تحذير قام بإطلاقه كائن الـ Statement الذي قام باستدعائها ككائن نوعه SQLWarning. ترجع null في حال لم يكن هناك أي تحذير.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement.
public void clearWarnings() تمسح جميع التحذيرات التي تم إصدارها بسبب كائن الـ Statement الذي قام باستدعائها.
ملاحظة: إذا قمت باستدعاء الدالة getWarnings() بعد استدعاء هذه الدالة, سترجع لك null.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement.

مثال شامل

في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سنقوم بإضافة بيانات موظف جديد في جدول خاص بالموظفين إسمه employee.


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","root");

        // و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
        Statement stmt = con.createStatement();

        // rs هنا قمنا بإرسال إستعلام إلى قاعدة البيانات لجلب جميع أسماء الموظفين الموجودة في جدول الموظفين. بعدها قمنا بتخزين النتيجة في الكائن
        ResultSet rs = stmt.executeQuery("select first_name, last_name from employee");

        // rs هنا أنشأنا حلقة تمر على جميع الأسطر التي تم تخزينها في الكائن
        while(rs.next()) {
        // rs هنا في كل دورة سيتم عرض إسم جديد من الأسماء الموجودة في الكائن
        System.out.println(rs.getString("first_name") +" "+ rs.getString("last_name"));
        }

        // هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
        con.close();
        }
        catch(Exception e) {
        System.out.println(e.getMessage());
        }

        }

        }
      

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

        Jihad Amer
        Rola Farha
        Malek Salami
        Rima Saiid
        Said Houssayyan
        Mohamad Mostafa
        ... 
      
__________&&&______;&&&___________;

الإنترفيس PreparedStatement في جافا

مقدمة

الإنترفيس PreparedStatement يرث من الإنترفيس Statement, و أدائه أسرع منه أيضاً. تم تصميمه لإرسال إستعلامات إلى قاعدة البيانات أثناء عمل البرنامج, كما أنه يمكن إستخدامه لتنفيذ نفس أوامر الـ SQL عدة مرات.

للحصول على كائن PreparedStatement من كائن الـ Connection نستدعي الدالة prepareStatement().


بناؤه

      public interface PreparedStatement
      extends Wrapper, Statement, AutoCloseable
    

أهمية علامة الإستفهام ? عند إرسال إستعلامات

بما أن الإنترفيس PreparedStatement مصمم لإرسال إستعلامات أثناء تشغيل البرنامج, فهذا يعني أنه عليك:

  1. تجهيز شكل الإستعلام الأساسي الذي سيتم إرساله.

  2. جعل المستخدم يكمل نص الإستعلام.

  3. تنفيذ الإستعلام.


طريقة إستخدام علامة الإستفهام ? في نص الإستعلام

بما أننا سنجهز الإستعلام على مرحلتين قبل إرساله إلى قاعدة البيانات و تنفيذه, يجب أن نضع علامة إستفهام مكان كل معلومة نريد من المستخدم إدخالها عند تشغيل البرنامج حتى يكتمل نص الإستعلام.


عند تجهيز نص الإستعلام الأساسي, نقوم بوضع علامة - أو علامات - الإستفهام فيه كالتالي.

مثال

        PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET name = ? WHERE id = ?"); 
      

لاحقاً نستخدم دالة من دوال الإدخال المصمة لإتمام نص الإستعلام أثناء تشغيل البرنامج كالتالي.

مثال

        pstmt.setString(1, "Ahmad");     // Ahmad مكان أول رمز ? سيتم وضع الإسم
        pstmt.setInt(2, 12);             //   مكان ثاني رمز ? سيتم وضع الرقم 12
      

لاحقاً نستخدم دالة تنفيذ الإستعلام كالتالي.

مثال

        pstmt.executeUpdate();
      

إذاً هنا أصبح شكل نص الإستعلام الذي تم تنفيذه كالتالي: "UPDATE employee SET name = 'ahmad' WHERE id = 12".

إنتبه: علامات الإستفهام التي تضعها في نص الإستعلام, يتم ترقيمها إبتداءاً من الرقم 1 كما لاحظت في المثال السابق.



معلومة تقنية

عندما نكتب إستعلام و نضع فيه علامة إستفهام أو أكثر, يطلق على هذا الإستعلام تسمية Parameterized Query.
الدوال التي نستخدمها لتمرير القيم التي حصلنا عليها من المستخدم لوضعها مكان علامات الإستفهام, تسمى Setter Methods.

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

الجدول التالي يحتوي على أهم الدوال الموجودة في الإنترفيس PreparedStatement.

الدالة مع تعريفها
public void setInt(int parameterIndex, int value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه int يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع INTEGER.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setLong(int parameterIndex, long value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه long يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع BIGINT.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setFloat(int parameterIndex, float value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه float يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع REAL.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setDouble(int parameterIndex, double value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه double يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع DOUBLE.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setBoolean(int parameterIndex, boolean value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن قيمة نوعها boolean تحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع BIT أو BOOLEAN.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setByte(int parameterIndex, byte value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه byte يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع TINYINT.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setShort(int parameterIndex, short value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن رقم نوعه short يحدد القيمة التي سيتم وضعها مكان علامة السؤال الموضوعة في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع SMALLINT.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setString(int parameterIndex, String value) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن نص يحدد القيمة التي سيتم وضعها مكان علامة السؤال في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر value إلى النوع VARCHAR أو LONGVARCHAR.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setDate(int parameterIndex, Date date) نمرر لها قيمتين كـ Arguments, الأولى عبارة عن رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة, و الثانية عبارة عن كائن من الكلاس Date يحدد القيمة التي سيتم وضعها مكان علامة السؤال في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.

ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر date إلى النوع DATE.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setCharacterStream(int parameterIndex, Reader reader, int length) تستخدم لتخزين ملف نصي في قاعدة البيانات عند إستدعائها نمرر لها ثلاثة قيم كـ Arguments كالتالي:
  1. مكان الباراميتر parameterIndex, نمرر رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة.

  2. مكان الباراميتر reader, نمرر كائن من الكلاس Reader يحدد إسم و رابط الملف الذي سيتم وضعه مكان علامة السؤال في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement.

  3. مكان الباراميتر length, نمرر رقم نوعه int يمثل عدد الأحرف التي يحتويها هذا الملف.


ملاحظة: الـ JDBC سيهتم بنوع الترميز المستخدم في هذا الملف بشكل تلقائي.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setBinaryStream(int parameterIndex, InputStream is, int length) تستخدم لتخزين أي نوع من الملفات الغير نصية في قاعدة البيانات. عند إستدعائها نمرر لها ثلاثة قيم كـ Arguments كالتالي:
  1. مكان الباراميتر parameterIndex, نمرر رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة.

  2. مكان الباراميتر is, نمرر كائن من الكلاس InputStream يحدد إسم و رابط الصورة التي سيتم وضعها مكان علامة السؤال في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement.

  3. مكان الباراميتر length, نمرر رقم نوعه int يمثل حجم الملف بالـ Byte.


ملاحظة: الـ JDBC سيهتم بنوع الترميز المستخدم في هذا الملف بشكل تلقائي.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public void setBlob(int parameterIndex, InputStream is, int length) تستخدم لتخزين صورة في قاعدة البيانات. عند إستدعائها نمرر لها ثلاثة قيم كـ Arguments كالتالي:
  1. مكان الباراميتر parameterIndex, نمرر رقم نوعه int يحدد index علامة السؤال التي سيتم تبديلها بقيمة.

  2. مكان الباراميتر is, نمرر كائن من الكلاس InputStream يحدد إسم و رابط الملف الذي سيتم وضعه مكان علامة السؤال في نص الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement.

  3. مكان الباراميتر length, نمرر رقم نوعه int يمثل حجم الملف بالـ Byte.


ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر blob إلى النوع BLOB.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ JDBC لا يدعم هذه الدالة.

public ResultSet executeQuery() تنفذ الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.
ترجع نتيجة الإستعلام ككائن نوعه ResultSet.
الأمر الذي يمرر لها في العادة يكون أمر SELECT ثابت.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال لم يرجع الإستعلام كائن ResultSet.

  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().

public int executeUpdate() تنفذ الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.
ترجع عدد الأسطر التي تم إضافتها أو التعديل عليها. و ترجع 0 في حال كان الإستعلام لا يرجع شيء.

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال أرجع الإستعلام كائن ResultSet.

  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().

مثال شامل

في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه تبديل إسم أي موظف نريد من الجدول.
بعدها, سنجعل البرنامج يطلب من المستخدم إدخال رقم الـ ID الخاص بهذا الموظف, ثم الإسم الجديد.
بعد إدخالهم, سيتم تحديث إسم الموظف في قاعدة البيانات.


Main.java
        // هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.PreparedStatement;

        // لأننا سنطلب من المستخدم إدخال بيانات أثناء تشغيل البرنامج Scanner هنا قمنا بإستدعاء الكلاس
        import java.util.Scanner;

        public class Main {

        public static void main(String[] args) {

        // input إسمه Scanner هنا قمنا بإنشاء كائن من الكلاس
        Scanner input = new Scanner(System.in);

        try {
        // الذي سنعتمد عليه للوصول إلى قاعدة البيانات MYSQL Driver هنا قمنا بتحديد رابط الوصول لبرنامج الـ
        Class.forName("com.mysql.jdbc.Driver");

        // و الذي سنستخدمه لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات Connection هنا قمنا بإنشاء كائن من الكلاس
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","password");

        // و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات بناءاً على المعلومات التي يدخلها المستخدم PreparedStatement هنا قمنا بتجهيز كائن نوعه
        PreparedStatement pstmt = con.prepareStatement("UPDATE employee SET name = ? WHERE id = ?");

        // id الموظف الذي سيقوم بتغيير إسمه و وضعناه في المتغير ID هنا طلبنا من المستخدم إدخال
        System.out.print("Select Employee, Enter his ID: ");
        int id = input.nextInt();

        // name هنا طلبنا من المستخدم إدخال الإسم الجديد و وضعناه في المتغير
        System.out.print("Enter the new name: ");
        String name = input.next();

        // التي أدخلها المستخدم مكان أول علامة إستفهام موضوعة في الإستعلام name هنا قمنا بتمرير قيمة المتغير
        pstmt.setString(1, name);

        // التي أدخلها المستخدم مكان ثاني علامة إستفهام موضوعة في الإستعلام id هنا قمنا بتمرير قيمة المتغير
        pstmt.setInt(2, id);

        // هنا قمنا بتنفيذ الإستعلام
        pstmt.executeUpdate();

        // هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
        con.close();
        }
        catch(Exception e) {
        System.out.println(e.getMessage());
        }

        }

        }
      

لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج, سيطلب من المستخدم إدخال رقم ID الموظف الذي يريد تغيير إسمه, ثم الإسم الجديد الذي سيضعه مكانه.

قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.

Select Employee, Enter his ID: 1
Enter the new name: Ahmad
__________&&&______;&&&___________;

الإنترفيس 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.

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

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

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

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.

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

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

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.

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

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

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.

public int getRow() ترجع رقم السطر الحالي في كائن الـ ResultSet.
في حال لم تصل بعد لأي سطر ترجع 0. أول سطر في كائن الـ ResultSet يكون رقمه 1, ثاني سطر 2 إلخ..

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

  • ترمي الإستثناء SQLFeatureNotSupportedException في حال كان الـ Driver المستخدم لا يدعم هذه الدالة.

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 المستخدم لا يدعم هذه الدالة.

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 المستخدم لا يدعم هذه الدالة.

public String getString(int columnIndex) تستخدم للحصول على النص الذي تم جلبه من قاعدة البيانات.
عند إستدعاءها نمرر لها Index العمود الذي نريد الحصول على قيمته. فترجعها لنا كنص عادي String.
في حال كانت القيمة في هذا العمود تساوي NULL, فإنها ترجعها كـ 0.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو كان كائن الـ ResultSet مغلقاً, أو كان Index العمود الموضوع غير موجود أصلاً.
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
        ... 
      
__________&&&______;&&&___________;

الإنترفيس ResultSetMetaData في جافا

مقدمة

الإنترفيس ResultSetMetaData يستخدم لمعرفة معلومات تتعلق بالجدول ( أو الجداول ) المخزنة في كائن الـ ResultSet, مثل:

  • أسماء الجداول المخزنة فيه.

  • عدد الأعمدة المخزنة فيه.

  • أسماء الأعمدة المخزنة فيه.

  • أنواع البيانات التي يمكن تخزينها في الأعمدة إلخ..


للحصول على كائن ResultSetMetaData نستدعي الدالة getMetaData() من كائن الـ ResultSet.


بناؤه

      public interface ResultSetMetaData
      extends Wrapper
    

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

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

الدالة مع تعريفها
public int getColumnCount() ترجع عدد الأعمدة الموجودة في كائن الـ ResultSet.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public String getColumnName(int column) تستخدم لمعرفة أسماء الأعمدة الموجودة في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة إسمه فترجعه لنا كنص عادي.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public String getTableName(int column) تستخدم لمعرفة إسم الجدول الذي أتى منه العمود الموجود في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود فترجع لنا إسم الجدول الذي أتى منه كنص عادي.
ترجع نص فارغ "" في حال لم تستطع تحديد إسم الجدول.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public String getColumnTypeName(int column) تستخدم لمعرفة نوع البيانات الموجودة في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة نوعه.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public String getColumnClassName(int column) تستخدم لمعرفة نوع البيانات المتوفر في لغة جافا و الملائم لتخزين بيانات جدول محدد موجود في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة نوع البيانات التي يمكن تخزينها فيه, فترجعه لنا.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public int getColumnDisplaySize(int column) ترجع عدد الأحرف الأقصى التي يمكن تخزينها في عمود محدد من الأعمدة الموجودة في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة عدد الأحرف الأقصى التي يمكن تخزينها فيه.

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public int getPrecision(int column) ترجع عدد البيانات الأقصى التي يمكن تخزينها في عمود محدد من الأعمدة الموجودة في كائن الـ ResultSet.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة عدد البيانات الأقصى التي يمكن تخزينها فيه, فترجعه لنا كـ int.

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

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
public boolean isCaseSensitive(int column) تستخدم لمعرفة ما إذا كان يهم أن نكتب إسم العمود تماماً كما هو معرف في قاعدة البيانات أم لا في حال أردنا الوصول إليه من خلال إسمه. أي للتأكد ما إذا كان يهم إذا كتبنا إسم العمود بأحرف كبيرة أو أحرف صغيرة عند تجهيز الإستعلام.
عند إستدعاءها نمرر لها Index العمود الذي نريد معرفة ما إذا كان يمكن كتابة إسمه بأحرف كبيرة أو صغيرة.
ترجع true إذا كان حجم الحرف لا يسبب مشكلة. غير ذلك ترجع false.

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

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

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

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.

مثال شامل

في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سنقوم بجلب جميع البيانات الموجودة في جدول الموظفين ( employee ) و تخزينها في كائن من الإنترفيس ResultSet.
سنفترض أن جدول الموظفين يتألف من أربعة أعمدة ( id, name, email, phone ).
بعدها سننشئ كائن من الإنترفيس ResultSetMetaData و نربطه بكائن الـ ResultSet لعرض خصائص البيانات الموجودة فيه.


Main.java
        // هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
        import java.sql.Connection;
        import java.sql.DriverManager;
        import java.sql.ResultSetMetaData;
        import java.sql.ResultSet;
        import java.sql.PreparedStatement;

        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");

        //// و الذي سنستخدمه لإرسال الإستعلام إلى قاعدة البيانات PreparedStatement هنا قمنا بتجهيز كائن نوعه
        PreparedStatement ps = con.prepareStatement("select * from employee");

        // rs هنا قمنا بإرسال الإستعلام إلى قاعدة البيانات و الذي سيرجع لنا جميع الموجودة في جدول الموظفين. بعدها قمنا بتخزين النتيجة في الكائن
        ResultSet rs = ps.executeQuery();

        // rs و الذي سنستخدمه لعرض خصائص البيانات الموجودة في الكائن rsmd هنا قمنا بإنشاء الكائن
        ResultSetMetaData rsmd = rs.getMetaData();

        // rs هنا قمنا بعرض خصائص البيانات الموجودة في الكائن
        System.out.println("First column:  "+rsmd.getColumnName(1)+" ("+rsmd.getColumnTypeName(1)+")");
        System.out.println("Second column: "+rsmd.getColumnName(2)+" ("+rsmd.getColumnTypeName(2)+")");
        System.out.println("Third column:  "+rsmd.getColumnName(3)+" ("+rsmd.getColumnTypeName(3)+")");
        System.out.println("Fourth column: "+rsmd.getColumnName(4)+" ("+rsmd.getColumnTypeName(4)+")");
        System.out.println("------------------------------------------------------");
        System.out.println("Total number of columns: "+rsmd.getColumnCount());
        System.out.println("------------------------------------------------------");
        System.out.println("First column is from the table : "+rsmd.getTableName(1));
        System.out.println("------------------------------------------------------");
        System.out.println("Is First Column have the property AUTOINCREMENT? "+rsmd.isAutoIncrement(1));
        System.out.println("Is currancy the datatype of the first column?    "+rsmd.isCurrency(1));
        System.out.println("Is First Column have the property READONLY?      "+rsmd.isReadOnly(1));

        // هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
        con.close();
        }
        catch(Exception e) {
        System.out.println(e.getMessage());
        }

        }

        }
      

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

        First column:  id (INT)
        Second column: name (VARCHAR)
        Third column:  email (VARCHAR)
        Fourth column: phone (VARCHAR)
        ------------------------------------------------------
        Total number of columns: 4
        ------------------------------------------------------
        First column is from the table : employee
        ------------------------------------------------------
        Is First Column have the property AUTOINCREMENT? true
        Is currancy the datatype of the first column?    false
        Is First Column have the property READONLY?      false
      
__________&&&______;&&&___________;