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

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

  • مقدمة
  • دوال الإنترفيس Statement
  • مثال شامل

مقدمة

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

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

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


بناؤه

public interface Statement
extends Wrapper, AutoCloseable
public interface Statement extends Wrapper, AutoCloseable

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

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

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

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

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

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

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

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().
4 public ResultSet getResultSet() ترجع نتيجة الإستعلام الذي قمنا بإرساله سابقاً بواسطة كائن الـ Statement الذي قام باستدعائها ككائن نوعه ResultSet.
ترجع null في حال لم يرجع الإستعلام أي نتيجة.

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

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

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

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

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

  • ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات.
  • ترمي الإستثناء SQLTimeoutException في حال بقي كائن الـ Statement في وضعية الإنتظار حتى تخطى المدة التي تم تحديدها بواسطة الدالة setQueryTimeout().
7 public void clearBatch() تمسح الإستعلامات التي تم تجميعها في كائن الـ Statement الذي قام باستدعائها.

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

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

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

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

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

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

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

ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement.
15 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());
}
}
}
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات 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
...
Jihad Amer Rola Farha Malek Salami Rima Saiid Said Houssayyan Mohamad Mostafa ...