مفهوم الـ JDBC في جافا
JDBC إختصار لـ Java DataBase Connectivity, و هي عبارة عن API خاص في جافا للتعامل مع قواعد البيانات على إختلاف أنواعها.
قبل وجود الـ JDBC, كان المبرمجون يستخدمون API آخر للتعامل مع قواعد البيانات يسمى ODBC, و هو مكتوب بلغة برمجة مختلفة تسمى C الأمر الذي قد يؤدي إلى بعض المشاكل الأمنية بالإضافة إلى إبطاء عمل البرنامج. لذلك قام مطوروا لغة جافا ببناء API خاص بها أطلق عليه تسمية JDBC.
مصطلحات تقنية في قواعد البيانات
| المصطلح | معناه |
|---|---|
| API | إختصار لـ Application Programming Interface, و هو عبارة عن ملف يشرح طريقة عمل برنامج محدد و يشرح أيضاً طريقة جعل البرامج الأخرى قادرة على التعامل معه. |
| JDBC API | عبارة عن حزمة (Package) مصممة خصيصاً للتعامل مع قواعد البيانات. |
| JDBC Driver | عبارة عن برنامج يعمل كوسيط بين التطبيق و قاعدة البيانات. |
| Statments | هي جميع أنواع الإستعلامات ( Queries ) التي يتم إرسالها من البرنامج إلى قاعدة البيانات. |
| DataBase Stored Procedures | عبارة عن مجموعة دول خاصة بقاعدة البيانات التي نتعامل معها. كل قاعدة بيانات تملك مجموعة من الدول يمكن إستخدامها للتعامل مع قاعدة البيانات بسهولة أكثر, إضافةً إلى أوامر SQL المشتركة بين جميع قواعد البيانات. |
ملاحظة
في حال كنت لا تملك أي فكرة أو خبرة في التعامل مع قواعد اليبانات فسبق و أعددنا مرجع شامل لتعلمها من الصفر.
الأشياء الأساسية التي تحتاجها للتعامل مع قواعد البيانات في جافا
نظرة عامة على مفهوم قواعد البيانات و شرح المصطلحات الأساسية المتعلقة بها.
نظرة عامة على أوامر SQL التي يمكنك إستخدامها للتعامل مع أي قاعدة بيانات مهما كان نوعها.
البرامج التي تعمل كوسيط بين البرنامج و قاعدة البيانات ( JDBC Drivers ).
لائحة تضم أشهر أسماء الـ Drivers التي يجب إستخدامهم للإتصال بقواعد البيانات على حسب أنواعهم, مع تحديد طريقة وضع الـ URL لكل واحد منهم, بالإضافة إلى تحميل مكتبات الـ jar الخاصة بهم و طريقة تضمينهم في المشروع.
خطوات ربط البرنامج مع أي قاعدة بيانات.
الإنترفيسات و الكلاسات المصممة خصيصاً للتعامل مع قواعد البيانات في جافا
الجدول التالي يحتوي على الإنترفيسات و الكلاسات التي يمكنك إستخدامها للتعامل مع قواعد البيانات سواء لبدء الإتصال, تنفيذ إستعلامات, تخزين نتائج الإستعلامات إلخ..
| الكلاس / الإنترفيس مع تعريفه | |
|---|---|
public class DriverManager
الكلاس DriverManager مصمم لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات مثل إسم الـ Driver الذي سنستخدمه, إسم قاعدة البيانات, إسم المستخدم و كلمة مروره.تابع القراءة » |
|
public interface Connection الإنترفيس مصمم لإنشاء إتصال بين البرنامج و قاعدة البيانات بالإعتماد على المعلومات التي تم تحديدها فيه في كائن الـ |
|
public interface DatabaseMetaData
الإنترفيس يوفر مجموعة ضخمة من الدوال التي يمكن إستخدامها لمعرفة معلومات متعلقة بقاعدة البيانات التي تتعامل معها. |
|
public interface Statement الإنترفيس مصمم لإرسال الإستعلامات الثابتة التي لا تتغير إلى قاعدة البيانات, أي يمكنك إستخدامه في حال كنت تريد تنفيذ نفس أوامر الـ SQL في كل مرة تقوم فيها بتشغيل البرنامج. |
|
public interface PreparedStatement
الإنترفيس PreparedStatement يرث من الإنترفيس Statement, تم تصميمه لإرسال إستعلامات إلى قاعدة البيانات أثناء عمل البرنامج, كما أنه يمكن إستخدامه لتنفيذ نفس أوامر الـ SQL عدة مرات.تابع القراءة » |
|
public interface ResultSet
الإنترفيس ResultSet مصمم لتخزين أي بيانات يتم جلبها من قاعدة البيانات مهما كان نوعها.تابع القراءة » |
|
public interface ResultSetMetaData
الإنترفيس ResultSetMetaData يستخدم لمعرفة معلومات تتعلق بالجدول ( أو الجداول ) المخزنة في كائن الـ ResultSet, مثل:
تابع القراءة » |
|
أمثلة شاملة حول التعامل مع قواعد البيانات في جافا
شرح طريقة جلب بيانات من قاعدة البيانات.
المثال االاول شرح طريقة جلب بيانات من قاعدة البيانات.
شرح طريقة تجهيز إستعلام لتعديل معلومات موجودة في قاعدة البيانات
شرح طريقة تجهيز إستعلام لتعديل معلومات موجودة في قاعدة البيانات.
نص الإستعلام مبني على المعلومات أو الشروط التي سيدخلها المستخدم عند تشغيل البرنامج.شرح طريقة تجهيز إستعلام لجلب معلومات موجودة في قاعدة البيانات و عرضها.
شرح طريقة تجهيز إستعلام لجلب معلومات موجودة في قاعدة البيانات و عرضها.
نص الإستعلام مبني على المعلومات أو الشروط التي سيدخلها المستخدم عند تشغيل البرنامج.شرح طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس Statement.
هذا الأسلوب يسمى ( Batch Processing ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.
شرح طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس PreparedStatement.
هذا الأسلوب يسمى ( Batch Processing ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.
شرح طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس Statement
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس Statement.
هذا الأسلوب يسمى ( Transaction Management ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.
شرح طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس PreparedStatement.
في المثال التالي شرحنا طريقة تجميع الإستعلامات و تنفيذها دفعة واحدة في قاعدة البيانات باستخدام الإنترفيس PreparedStatement.
هذا الأسلوب يسمى ( Transaction Management ) و هو مهم جداً من ناحية سرعة التنفيذ و الأداء.
طريقة تخزين ملف نصي في قاعدة البيانات.
في المثال التالي شرحنا طريقة تخزين ملف نصي في قاعدة البيانات.
طريقة إسترجاع ملف نصي من قاعدة البيانات.
في المثال التالي شرحنا طريقة إسترجاع ملف نصي من قاعدة البيانات.
طريقة تخزين ملف غير نصي في قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.
في المثال التالي شرحنا طريقة تخزين ملف غير نصي في قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.
طريقة إسترجاع ملف غير نصي من قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.
في المثال التالي شرحنا طريقة إسترجاع ملف غير نصي من قاعدة البيانات, مثل الملفات الصوتية, الصور و الفيديوهات.
مفاهيم عامة و مصطلحات أساسية في قواعد البيانات
مقدمة
قاعدة البيانات, عبارة عن ملف واحد يحتوي بيانات كثيرة و مرتبة من مختلف الأنواع, حيث أنه يمكنك إضافة بيانات جديدة أو إستخراج بيانات قديمة أو البحث أو التعديل فيها بسرعة و سهولة.
يمكنك تخزين أي نوع البيانات في قاعدة البيانات, فمثلاً يمكنك تخزين نصوص, ملفات نصية, صور, فيديوهات إلخ..
لبناء قاعدة بيانات عليك إستخدام برامج خاصة مثل MySQL Workbench - Oracle Database - CUBRID - Microsoft Access.
كيف تتخزن البيانات في قاعدة البيانات
عند التعامل مع قاعدة بيانات, عليك معرفة كيف تم ترتيب المعلومات بداخلها و كيف تم ربط المعلومات ببعضها البعض قبل أن تبدأ مباشرةً بكتابة الكود, حتى تعرف كيف تتعامل معها.
هنا وضعنا صورة لقاعدة بيانات صغيرة, تحتوي على أربع جداول.
هنا وضعنا صورة نظهر فيها المعلومات المخزنة في جدول الموظفين ( Clients ).
مصطلحات أساسية في قواعد البيانات
| المصطلح | معناه |
|---|---|
| Database | تعني قاعدة بيانات, وهي عبارة عن ملف يحتوي على عدة جداول مرتبطة ببعضها البعض. |
| Table | تعني جدول. الجدول يتألف من عدد محدد من الأعمدة و عدد غير محدد من الأسطر. قاعدة البيانات تتألف من مجموعة جداول. |
| Field | عبارة عن حقل أو عمود في الجدول, و هو يمثل معلومة لها نوع محدد في الجدول. فمثلاً يمكن أن تكون هذه المعلومة نص, رقم, صورة, فيديو, صوت, أي ملف من أي نوع. الجدول الواحد يتألف من عدة حقول. |
| Record | عبارة عن سطر في الجدول, أي عبارة عن مجموعة معلومات. مجموعة المعلومات هذه تمثل سجل في الجدول. الجدول الواحد يمكن أن يحتوي على عدد غير محدد من السجلات. |
نظرة عامة على أوامر SQL
مقدمة
SQL إختصار لـ Structured Query Language و هي عبارة عن مجموعة من الأوامر تستخدم للتعامل مع أي قاعدة بيانات مهمة كان نوعها. هذه الأوامر تتيح لك إنشاء قاعدة بيانات, إضافة جدوال فيها, إضافة سجلات في الجدوال, تحديثهم, حذفهم, إسترجاع البيانات من قاعدة البيانات, البحث فيها و وضع شروط أثناء البحث إلخ..
إنشاء أو حذف قاعدة بيانات
لإنشاء قاعدة بيانات جديدة نستخدم الأمر: CREATE DATABASE
مثال
•هنا قمنا بإنشاء قاعدة بيانات إسمها company
لحذف قاعدة بيانات نستخدم الأمر: DROP DATABASE
مثال
•هنا قمنا بحذف قاعدة بيانات إسمها compnay
إنتبه
في حال قمت بحذف قاعدة البيانات, سيجعلك ذلك تخسر جميع البيانات الموجودة فيها.
إنشاء جدول في قاعدة البيانات أو حذف جدول منها
لإنشاء جدول جديد في قاعدة البيانات نستخدم الأمر: CREATE TABLE
مثال
•هنا قمنا بإنشاء جدول إٍسمه clients يتألف من أربعة حقول: id - first_name - last_name و phone
id INT NOT NULL AUTOINCREMENT PRIMARY KEY,
first-name VARCHAR(50),
last-name VARCHAR(50),
phone VARCHAR(50),
);
لحذف جدول من قاعدة البيانات نستخدم الأمر: DROP TABLE
مثال
•هنا قمنا بحذف الجدول و حذف جميع البيانات الموجودة فيه.
إنتبه
في حال قمت بحذف جدول من قاعدة البيانات, سيجعلك ذلك تخسر جميع السجلات الموجودة فيها.
إضافة سجلات في الجدول
لإضافة سجل في الجدول نستخدم الأمر: INSTERT INTO
مثال
•هنا قمنا بإضافة أربع سجلات في الجدول clients
INSTERT INTO clients values ('Wissam', 'Al ali', '03 568 975');
INSTERT INTO clients values ('Jihad', 'Sadek', '80 907 056');
INSTERT INTO clients values ('Khaled', 'Amer', '76 234 654');
ملاحظة
عند إضافة سجل في جدول الموظفين نضع إسمه و إسم عائلته و رقم هاتفه, بعدها سيتم إعطائه رقم id بشكل تلقائي لأن الحقل id يعطي رقم موحد لكل سجل تم إدخاله بشكل تلقائي.
إستخراج البيانات من قاعدة البيانات
لإستخراج بيانات من قاعدة البيانات نستخدم الأمر: SELECT FROM
المثال الأول
•هنا قمنا بعرض جميع السجلات الموجودة في الجدول client
•سنحصل على النتيجة التالية عند تنفيذ الإستعلام في قاعدة البيانات.
| id | first-name | last-name | phone |
+----+------------+-----------+------------+
| 1 | Ahmad | Saad | 71 230 568 |
| 2 | Wissam | Al ali | 03 568 975 |
| 3 | Jihad | Sadek | 80 907 056 |
| 4 | Khaled | Amer | 76 234 654 |
+----+------------+-----------+------------+
المثال الثاني
•هنا قمنا بعرض محتوى العامودين الثاني و الثالث في الجدول client
•سنحصل على النتيجة التالية عند تنفيذ الإستعلام في قاعدة البيانات.
| first-name | last-name |
+------------+-----------+
| Ahmad | Saad |
| Wissam | Al ali |
| Jihad | Sadek |
| Khaled | Amer |
+------------+-----------+
المثال الثالث
•هنا قمنا بعرض جميع الحقول للسجل الذي يحمل الـ id = 1 في الجدول client
•سنحصل على النتيجة التالية عند تنفيذ الإستعلام في قاعدة البيانات.
| id | first-name | last-name | phone |
+----+------------+-----------+------------+
| 1 | Ahmad | Saad | 71 230 568 |
+----+------------+-----------+------------+
تحديث سجلات الجدول SQL
لتحديث بيانات سجل من السجلات الموجودة في الجدول نستخدم الأمر: UPDATE
مثال
•هنا قمنا بتعديل معلومات السجل الذي يحمل الـ id = 3 في الجدول client
SET first-name = 'Jalal'
WHERE id = 3;
حذف سجلات من الجدول SQL
لحذف سجل ( أي سطر كامل ) من السجلات الموجودة في الجدول نستخدم الأمر: DELETE
مثال
•هنا قمنا بحذف السجل الذي يحمل الـ id = 2 في الجدول clients
WHERE id = 2;
أنواع الـ Drivers التي يمكن إستخدامها للإتصال بقواعد البيانات
مقدمة
للتعامل مع قواعد البيانات تحتاج برنامج وسيط يربط برنامجك بقاعدة البيانات, هذا البرنامج يسمى Driver.
هناك أربعة أنواع من الـ Drivers التي يمكن استخدامها لربط البرنامج مع قواعد البيانات:
JDBC-ODBC Bridge Driver.
Native-API Driver.
Network Protocol Driver.
Thin Driver.
JDBC-ODBC Bridge Driver
طريقة عمل JDBC-ODBC Bridge Driver
الـ JDBC-ODBC Bridge Driver يقوم بتحويل أوامر JDBC API إلى أوامر يفهمها الـ ODBC Driver و الذي بدوره يقوم بربط البرنامج بقاعدة البيانات.
فوائد JDBC-ODBC Bridge Driver
سهل الإستخدام.
يمكن ربطه بسهولة مع أي قاعدة بيانات.
مساوئه
أدائه يعتبر ضعيف (بطيئ) حيث أنه يقوم بتحويل أوامر الـ JDBC إلى أوامر ODBC في كل عملية يتم إجراءها مع قاعدة البيانات.
يجب تنصيب الـ ODBC Driver في جهاز المستخدم.
كود الـ API مكتوب بلغة C و C++ و ليس بلغة جافا.
Native-API Driver
طريقة عمله
الـ Native-API Driver يعني إعتماد أوامر الـ API الملائمة لقاعدة البيانات التي سيتم التعامل معها بشكل مباشر.
فائدته
أدائه أفضل ( أسرع ) مقارنة مع الـ JDBC-ODBC Bridge Driver.
مساوئه
يجب تنصيب الـ Native Driver في جهاز المستخدم.
يجب إستخدام API خاص لأي قاعدة بيانات سيتم التعامل معها في جهاز المستخدم.
كود الـ API مكتوب بلغة C و C++ و ليس بلغة جافا.
Network Protocol Driver
طريقة عمله
الـ Network Protocol Driver يقوم بإرسال أوامر JDBC API من جهاز المستخدم إلى خادم, و الذي بدوره يقوم بتنفيذ أوامر البرنامج في قاعدة البيانات مباشرةً أو إرسالها إلى خادم آخر.
فوائده
لا حاجة إلى تنصيب أي برنامج من ناحية المستخدم.
لا حاجة إلى إستخدام APIخاص لقاعدة البيانات التي سيتم التعامل معها.
الكود كله مكتوب بلغة جافا.
مساوئه
يجب إتصال المستخدم بشكبة النت للوصول إلى قاعدة البيانات.
تجهيز الخادم لربط المستخدم بقاعدة البيانات أمر يتطلب بعض الجهد.
أي تعديل من ناحية برنامج المستخدم للتعامل مع قاعدة البيانات, سيجبرك على تعديل الكود الموضوع في الخادم.
Thin Driver
طريقة عمله
الـ Thin Driver يقوم بتحويل أوامر JDBC API مباشرةً إلى أوامر يفهمها الـ API الخاص بقواعد البيانات.
فوائده
أدائه أفضل من أداء جميع الـ Drivers الذين ذكرناهم سابقاً.
لا حاجة إلى تنصيب أي برنامج من ناحية المستخدم أو الخادم.
الكود كله مكتوب بلغة جافا.
مساوئه
يجب تجهيز الـ Drivers في قاعدة البيانات.
ما هو الـ driver المناسب للإتصال بقواعد البيانات؟
إذا كنت ستربط برنامجك بنوع واحد من قواعد البيانات ( مثل Oracle, MySQL, Sybase, IBM إلخ.. ), إستخدم الـ Thin Driver.
إذا كنت ستربط برنامجك بعدة أنواع من قواعد البيانات, إستخدم الـ Network Protocol Driver.
إستخدم الـ Native API Driver لربط برنامجك بقواعد البيانات في حال لم تقم بتجهيز Thin Driver أو Network Protocol Driver بعد.
لا تستخدم الـ JDBC-ODBC Bridge Driver إطلاقاً في برامجك.
تحميل الـ Driver الملائم لقاعدة البيانات و إضافته في المشروع في جافا
مقدمة
تحديد إسم الـ Driver الذي ستستخدمه كوسيط بين البرنامج و قاعدة البيانات يختلف تماماً من قاعدة بيانات إلى أخرى.
و تحديد رابط الوصول لقاعدة البيانات ( أي الـ URL) يختلف أيضاً على حسب نوعها.
إسم الـ Driver الملائم لقاعدة البيانات و طريقة كتابة الـ URL الذي يجعلك تصل إليها
حتى نسهل الأمر عليك, وضعنا في الجدول التالي طريقة التعامل مع أشهر قواعد البيانات.
كل ما عليك فعله هو النظر إلى إسم قاعدة البيانات و رابط الوصول لها, لمعرفة إسم Driver الذي يجب أن تضعه كـ Argument للدالة forName(), و طريقة كتابة رابط الوصول لها و الذي يجب أن تضعه كـ Argument للدالة getConnection().
| قاعدة البيانات | إسم الـ Driver الخاص فيها | طريقة كتابة URL الوصول لها |
|---|---|---|
| ORACLE | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostname:portNumber:databaseName |
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://hostname:portNumber/databaseName |
| DB2 | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2:hostname:portNumber/databaseName |
| Sybase | com.sybase.jdbc.SybDriver | jdbc:sybase:Tds:hostname:portNumber/databaseName |
تحميل مكتبة الـ jar التي تمكنك من التعامل مع قاعدة البيانات
مكتبة الـ jar بشكل عام, عبارة عن مجلد يحتوي على كلاسات مكتوبة بلغة جافا, و مصممة خصيصاً للتعامل مع شيء محدد.
للتعامل مع أي قاعدة بيانات في جافا, عليك تحميل مكتبة الـ jar الخاصة فيها, أي مجموعة الكلاسات الخاصة لربط برنامجك بها.
بعدها عليك إضافتها في برنامجك كما ستتعلم لاحقاً.
في الجدول التالي وضعنا روابط مباشرة لتحميل مكتبات الـ jar بسهولة.
| قاعدة البيانات | مكتبة الـ jar الخاصة فيها | تحميل المكتبة |
|---|---|---|
| ORACLE | oracle-driver-ojdbc-12.1.0.2 | |
| MySQL | mysql-connector-java-5.1.40-bin | |
| DB2 | db2jcc4 | |
| Sybase | jtds-1.3.1 |
خطوات إضافة مكتبة jar جديدة في المشروع
الخطوات التي ستتعملها الآن تختلف على حسب البرنامج الذي تقوم باستخدامه. هنا إستخدمنا برنامج الـ Netbeans.
في البداية, في برنامج الـ Netbeans عند إنشاء أي مشروع نلاحظ أنه يوجد مجلدين أساسيين:
مجلد الـ Source Packages: نضع فيه ملفات الجافا.
مجلد الـ Libraries: نضع فيه مكتبات الـ jar.
إذا قمت بإظهار الأشياء الموجودة بداخل مجلد الـ Libraries ستجد ملف الـ JDK الذي يستخدمه مشروعك.
ملاحظة: إصدار مجلد الـ JDK سيكون قديماً حتماً عن الذي تستخدمه عندك. لكن لا تلقي له بالاً.
الآن, لإضافة أي مكتبة jar في المشروع قم باتباع الخطوات التالية:
أنقر بزر الفأرة الأيمن على مجلد الـ Libraries.
إختر Add JAR/Folder.
إبحث عن مكتبة الـ jar التي قمت بتحميلها سابقاً, ثم أنقر Open.
بعد إضافة المكتبة, ستظهر في مجلد الـ Libraries.
مثال
هنا قمنا بإضافة مكتبة الـ jar الخاصة بقواعد بيانات MySQL. لاحظ كيف ستظهر في مجلد الـ Libraries.
خطوات ربط البرنامج مع قواعد البيانات في جافا
مقدمة
لربط البرنامج مع أي قاعدة بيانات مهما كان نوعها عليك إتباع الخطوات التالية:
تحميل حزمة الـ jar الخاصة بقاعدة البيانات التي سنقوم بالتعامل معها.
إستدعاء كلاسات الـ JDBC المصممة للتعامل مع قواعد البيانات, أي أن نفعل لهم
import.تحديد الـ Driver المناسب لإجراء الإتصال مع قاعدة البيانات.
بدء الإتصال مع قاعدة البيانات.
تجهيز الإستعلامات التي سيتم إرسالها إلى قاعدة البيانات.
تنفيذ الإستعلامات التي تم تجهيزها.
إغلاق الإتصال مع قاعدة البيانات عند الإنتهاء.
تحديد الـ Driver المناسب لإجراء الإتصال مع قاعدة البيانات
لتحديد إسم الـ Driver الملائم للإتصال بقاعدة البيانات التي سيتم التعامل معها نستخدم الدالة الثابتة forName() الموجودة في كلاس إسمه Class.
مثال
•في حال كنا سنربط البرنامج بقاعدة بيانات مبنية بنظام MYSQL نكتب التالي.
Class.forName("com.mysql.jdbc.Driver");
بناء الدالة forName().
public static Class<?> forName(String className)
throws ClassNotFoundException
الـ className هو نص يمثل إسم الكلاس ( أي الـ Driver ) الذي سيربط البرنامج بقاعدة البيانات.
القيمة التي ترجعها الدالة forName().
ترجع كائن نوعه Class يمثل إسم الكلاس ( أي الـ Driver ) الذي سيربط البرنامج بقاعدة البيانات.
الأخطاء التي قد تحدث عند إستدعاء الدالة forName().
LinkageError في حال عدم وجود توافق بين أكواد الكلاسات المستخدمة في عملية ربط البرنامج مع قواعد البيانات.
ExceptionInInitializerError في حال حدث خطأ عند خلق الكائن.
ClassNotFoundException في حال كان الكلاس الذي قمنا بتمريره غير موجود.
بدء الإتصال مع قاعدة البيانات
لبدء عملية الإتصال بقاعدة البيانات نستخدم الدالة الثابتة getConnection() الموجودة في الكلاس DriverManager, و التي ترجع كائن نوعه Connection يمثل الإتصال القائم بين البرنامج و قاعدة البيانات.
مثال
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","root");
شرح الكود
هنا إفترضنا أننا سنتصل بقاعدة بيانات:
مبنية بنظام MYSQL و موجودة في نفس جهاز المستخدم.
إسم المستخدم في قاعدة البيانات هو root.
كلمة مرور المستخدم في قاعدة البيانات هي root.
ملاحظة: شرحنا الدالة getConnection() بتفصيل ضمن شرح الكلاس DriverManager.
تجهيز كائن لإرسال إستعلامات إلى قاعدة البيانات
حتى تستطيع إرسال إستعلامات إلى قاعدة البيانات عليك إنشاء كائن نوع Statement من كائن الـ Connection الذي قمت بإنشائه سابقاً بواسطة الدالة createStatement().
مثال
•هنا قمنا بإنشاء كائن نوعه Statement من كائن نوعه Connection و قمنا بتخزينه في الكائن stmt.
Statement stmt = con.createStatement();
تنفيذ إستعلامات و حفظ و عرض نتائجهم
لتنفيذ أي إستعلام على قاعدة البيانات, نقوم بإرسال نص الإستعلام بواسط الدالة executeQuery() على كائن الـ Statement الذي قمنا بإنشائه سابقاً.
الدالة executeQuery() ترجع نتيجة الإستعلام ككائن نوعه ResultSet.
مثال
•هنا قمنا بإرسال إستعلام إلى قاعدة البيانات, لإرجاع كافة أسماء الموظفين الموجودة في الجدول Employees.
ResultSet rs = stmt.executeQuery("select name from Employees");
•لعرض جميع الأسماء التي تم تخزينها في الكائن rs, نستخدم أي حلقة كالتالي.
while(rs.next()){
System.out.println( rs.getString("name") );
}
إغلاق الإتصال مع قاعدة البيانات عند الإنتهاء
بعد الإنتهاء من التعامل مع قاعدة البيانات عليك إغلاق الإتصال معها بواسطة الدالة close() الموجودة في الإنترفيس Connection.
إذاً, لإغلاق الإتصال مع قاعدة البيانات نستدعي الدالة close() على كائن الـ Connection و التي تقوم بقطع الإتصال مع كائن الـ Statement و كائن الـ ResultSet بشكل تلقائي.
مثال
•هنا قمنا بقطع الإتصال مع قاعدة البيانات.
con.close();
جميع الخطوات السابقة في مثال واحد
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها school تمثل قاعدة بيانات لمدرسة, و مبنية بنظام MySQL.
بعدها سنقوم بطباعة أسماء الطلاب الموجودين فيها و المحفوظين في جدول إسمه students.
تذكر: قبل البدء بكتابة الكود, لا تنسى أن تقوم بتحميل مكتبة الـ jar الخاصة بقواعد بيانات MySQL.
مثال
// 1) هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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 {
// 2) الذي سنعتمد عليه للوصول إلى قاعدة البيانات MYSQL Driver هنا قمنا بتحديد رابط الوصول لبرنامج الـ
Class.forName("com.mysql.jdbc.Driver");
// 3) و الذي سنستخدمه لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات Connection هنا قمنا بإنشاء كائن من الكلاس
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/school","root","root");
// 4) و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
Statement stmt = con.createStatement();
// 5) rs هنا قمنا بإرسال إستعلام إلى قاعدة البيانات لجلب جميع الأسماء الموجودة في جدول الطلاب. بعدها قمنا بتخزين النتيجة في الكائن
ResultSet rs = stmt.executeQuery("select name from students");
// 6) ( ملاحظة: هنا كل سطر يحتوي على إسم واحد ) rs هنا أنشأنا حلقة تمر على جميع الأسطر التي تم تخزينها في الكائن
while(rs.next()) {
// rs هنا في كل دورة سيتم عرض إسم جديد من الأسماء الموجودة في الكائن
System.out.println(rs.getString("name"));
}
// 7) هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج, سيظهر لنا جميع الأسماء الموجودة في الحقل name كالتالي.
Ahmad
Fouad
Said
Rola
Mohamad
Rim
Jana
Salem
Samir
Abdullah
...
ملاحظة
school المذكورة في البرنامج غير موجودة عندك.الهدف من هذا المثال كان تمرينك على إتباع الخطوات الصحيحة للتعامل مع قواعد البيانات.مع العلم أنه في حال كان عندك قاعدة بيانات يمكنك التجربة عليها و سيكون عليك تعديل أوامر sql الموضوعة في الكود فقط حتى تلائم قاعدة بياناتك, مثل إسم قاعدة البيانات, إسم المستخدم و كلمة مروره, إسم الحقل الذي ستقوم بعرض محتوياته إلخ..
الكلاس DriverManager في جافا
مقدمة في الكلاس 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 الذي سنستخدمه لربط البرنامج بقاعدة البيانات مع تحديد إسم المستخدم و كلمة مروره التي تسمح له بالولوج إلى قاعدة البيانات.
ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات. |
|
public static Connection getConnection(String url, Properties info)
تحدد رابط الـ Driver الذي سنستخدمه لربط البرنامج بقاعدة البيانات مع تحديد إسم المستخدم و كلمة مروره التي تسمح له بالولوج إلى قاعدة البيانات.
ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات. |
|
الإنترفيس Connection في جافا
مقدمة في الإنترفيس Connection في جافا
الإنترفيس Connection مصمم لإنشاء إتصال بين البرنامج و قاعدة البيانات بالإعتماد على المعلومات التي تم تحديدها فيه في كائن الـ DriverManager.
ملاحظة: كائن الـ Connection يقوم بشكل تلقائي بحفظ جميع التغيرات التي تحدث في قاعدة البيانات من قبل المستخدم.
✓بنا الإنترفيس 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()
تستخدم لإغلاق الإتصال مع قاعدة البيانات, فعلياً تغلق كائن الـ |
|
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
#الإنترفيس Statement في جافا
مقدمة في الإنترفيس Statement في جافا
الإنترفيس Statement مصمم لإرسال الإستعلامات الثابتة التي لا تتغير إلى قاعدة البيانات, أي يمكنك إستخدامه في حال كنت تريد تنفيذ نفس أوامر الـ SQL في كل مرة تقوم فيها بتشغيل البرنامج.
إفتراضياً, كائن واحد من الإنترفيس ResultSet مقابل كائن واحد من الإنترفيس Statement يمكن فتحه في نفس الوقت.
مع العمل أنه يمكن وجود أكثر من كائن نوعه ResultSet مفتوح في نفس الوقت, بشرط أن يكون كل واحد منهم مرتبط بكائن Statement مختلف.
ملاحظة: إستدعاء أي دالة من الدوال الإنترفيس Statement التي يمكن إستخدامها لإرسال إستعلامات إلى قاعدة البيانات تغلق كائن الـ ResultSet الحالي بشكل تلقائي بعد تنفيذ الإستعلام.
بنا الإنترفيس Statement في جافا
public interface Statement
extends Wrapper, AutoCloseable
دوال الإنترفيس Statement في جافا
الجدول التالي يحتوي على دوال الإنترفيس Statement.
| الدالة مع تعريفها | |
|---|---|
public Connection getConnection()
ترجع كائن الـ |
|
public ResultSet executeQuery(String sql)
تنفذ الإستعلام الذي نقوم بتمريره لها كنص في قاعدة البيانات, ثم ترجع نتيجة الإستعلام ككائن نوعه ResultSet.الأمر الذي يمرر لها في العادة يكون أمر SELECT ثابت.إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.
|
|
public int executeUpdate(String sql)
تنفذ الإستعلام الذي نقوم بتمريره لها كنص في قاعدة البيانات.ترجع عدد الأسطر التي تم إضافتها أو التعديل عليها. و ترجع 0 في حال كان الإستعلام لا يرجع شيء. إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.
|
|
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.قيم عناصر هذه المصفوفة تكون إحدى هذه الإحتمالات:
إنتبه: لا يمكن إستدعاء هذه الدالة من خلال كائن من الإنترفيس PreparedStatement أو الإنترفيس CallableStatement.
|
|
public void clearBatch()
تمسح الإستعلامات التي تم تجميعها في كائن الـ Statement الذي قام باستدعائها.ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات, أو في حال تم إستدعاءها بعد أن تم إغلاق كائن الـ Statement, أو في حال كان الـ Driver المستخدم لا يدعم عملية تجميع الإستعلامات و إرسالها دفعة واحدة (Batching Process). |
|
public void cancel()
تقوم بإلغاء الإستعلام الذي تم تجهيزه في كائن الـ Statement في حال كانت قاعدة البيانات و الـ 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. |
|
مثال شامل في الإنترفيس Statement في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سنقوم بإضافة بيانات موظف جديد في جدول خاص بالموظفين إسمه employee.
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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 في جافا
الإنترفيس PreparedStatement يرث من الإنترفيس Statement, و أدائه أسرع منه أيضاً. تم تصميمه لإرسال إستعلامات إلى قاعدة البيانات أثناء عمل البرنامج, كما أنه يمكن إستخدامه لتنفيذ نفس أوامر الـ SQL عدة مرات.
للحصول على كائن PreparedStatement من كائن الـ Connection نستدعي الدالة prepareStatement().
بنا الإنترفيس PreparedStatement في جاف
public interface PreparedStatement
extends Wrapper, Statement, AutoCloseable
أهمية علامة الإستفهام ? عند إرسال إستعلامات
بما أن الإنترفيس PreparedStatement مصمم لإرسال إستعلامات أثناء تشغيل البرنامج, فهذا يعني أنه عليك:
تجهيز شكل الإستعلام الأساسي الذي سيتم إرساله.
جعل المستخدم يكمل نص الإستعلام.
تنفيذ الإستعلام.
طريقة إستخدام علامة الإستفهام ? في نص الإستعلام
بما أننا سنجهز الإستعلام على مرحلتين قبل إرساله إلى قاعدة البيانات و تنفيذه, يجب أن نضع علامة إستفهام مكان كل معلومة نريد من المستخدم إدخالها عند تشغيل البرنامج حتى يكتمل نص الإستعلام.
عند تجهيز نص الإستعلام الأساسي, نقوم بوضع علامة - أو علامات - الإستفهام فيه كالتالي.
مثال
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.
ماهي دوال الإنترفيس PreparedStateme في جافا
الجدول التالي يحتوي على أهم الدوال الموجودة في الإنترفيس 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 كالتالي:
ملاحظة: الـ JDBC سيهتم بنوع الترميز المستخدم في هذا الملف بشكل تلقائي. ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات. |
|
public void setBinaryStream(int parameterIndex, InputStream is, int length)
تستخدم لتخزين أي نوع من الملفات الغير نصية في قاعدة البيانات. عند إستدعائها نمرر لها ثلاثة قيم كـ Arguments كالتالي:
ملاحظة: الـ JDBC سيهتم بنوع الترميز المستخدم في هذا الملف بشكل تلقائي. ترمي الإستثناء SQLException في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات. |
|
public void setBlob(int parameterIndex, InputStream is, int length)
تستخدم لتخزين صورة في قاعدة البيانات. عند إستدعائها نمرر لها ثلاثة قيم كـ Arguments كالتالي:
ملاحظة: الـ JDBC سيقوم بتحويل نوع القيمة التي تم وضعها مكان الباراميتر blob إلى النوع BLOB.
|
|
public ResultSet executeQuery()
تنفذ الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.ترجع نتيجة الإستعلام ككائن نوعه ResultSet.الأمر الذي يمرر لها في العادة يكون أمر SELECT ثابت.
|
|
public int executeUpdate()
تنفذ الإستعلام الذي تم تجهيزه في كائن الـ PreparedStatement الذي قام باستدعائها.ترجع عدد الأسطر التي تم إضافتها أو التعديل عليها. و ترجع 0 في حال كان الإستعلام لا يرجع شيء.
|
|
#مثال شامل
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه تبديل إسم أي موظف نريد من الجدول.
بعدها, سنجعل البرنامج يطلب من المستخدم إدخال رقم الـ ID الخاص بهذا الموظف, ثم الإسم الجديد.
بعد إدخالهم, سيتم تحديث إسم الموظف في قاعدة البيانات.
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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 الموظف الذي يريد تغيير إسمه, ثم الإسم الجديد الذي سيضعه مكانه.
•قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Enter the new name: Ahmad
الإنترفيس ResultSet في جافا
مقدمة في الإنترفيس ResultSet في جافا
الإنترفيس ResultSet مصمم لتخزين أي بيانات يتم جلبها من قاعدة البيانات مهما كان نوعها.
عند حفظ نتيجة الإستعلام في كائن الـ ResultSet, فإنها تتخزن فيه كجدول يتألف من أسطر ( Rows ) و أعمدة ( Columns ).
يمكنك الوصول إلى البيانات المخزنة في كائن الـ ResultSet بالترتيب عموداً تلو الآخر و سطراً تلو الآخر باستخدام الحلقة while.
ليس من الضروري أن تمر على جميع الأعمدة أو الأسطر الموجودة في كائن الـ ResultSet.
يمكنك تحديد الأعمدة التي تريد الوصول إلى البيانات المخزنة فيها بطرقتين:
من خلال إسم العمود, لأن كل عمود في كائن الـ
ResultSetله إسم مختلف و هو نفس الإسم الموجود في قاعدة البيانات.من خلال رقم الـ Index الخاص بكل عمود, لأنه أيضاُ يتم ترقيم الأعمدة الموجودة في كائن الـ
ResultSetإبتداءاً من الرقم 1.
ملاحظة: يفضل استخدام أرقام الـ Indexes للوصول إلى الأعمدة بدل إستخدام أسمائها.
بنا الإنترفيس ResultSet في جافا
public interface ResultSet
extends Wrapper, AutoCloseable
التعامل بسهولة مع بيانات كائن الـ ResultSet و حل ثلاث مشاكل مهمة
في حال لم تقم بتجهيز كائن الـ Statement أو كائن الـ PreparedStatement الذي ستستخدمه عند تنفيذ الإستعلامات قد تواجه ثلاث مشاكل:
لا تستطيع المرور على نفس العمود أو السطر أكثر من مرة واحدة. أي لا يمكنك العودة للوراء, دائماً تنتقل للعمود التالي أو السطر التالي.
أي تحديث لقاعدة البيانات يحدث لها بعد أن قمت بجلب بيانات منها و تخزينها في كائن الـ
ResultSetلن يظهر لك.عدم التفرقة بين الأحرف الكبيرة و الأحرف الصغيرة. فمثلاً في حال كان الجدول يحتوي على أسماء أعمدة (أي حقول) متشابهة مثل
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.
|
|
public boolean first()
تستخدم للإنتقال إلى أول سطر موجود في كائن الـ ResultSet الذي قام باستدعائها.ترجع true في حال كان يوجد سطر واحد على الأقل في كائن الـ ResultSet, غير ذلك ترجع false.
|
|
public boolean last()
تستخدم للإنتقال إلى آخر سطر موجود في كائن الـ ResultSet الذي قام باستدعائها.ترجع true في حال كان يوجد سطر واحد على الأقل في كائن الـ ResultSet, غير ذلك ترجع false.
|
|
public int getRow()
ترجع رقم السطر الحالي في كائن الـ ResultSet.في حال لم تصل بعد لأي سطر ترجع 0. أول سطر في كائن الـ ResultSet يكون رقمه 1, ثاني سطر 2 إلخ..
|
|
public boolean absolute(int row)
تستخدم للإنتقال إلى سطر محدد في كائن الـ ResultSet الذي قام باستدعائها.ترجع true في حال تم الإنتقال إلى سطر موجود في كائن الـ ResultSet, غير ذلك ترجع false.مكان الباراميتر row نضع رقم أكبر أو أصغر من صفر.- في حال وضعنا عدد أكبر من صفر, فإنها تنتقل إلى السطر الذي يشير له هذا العدد و تبدأ في عد الأسطر كالتالي: أول سطر في كائن الـ ResultSet يكون رقمه 1, ثاني سطر 2 إلخ..- في حال وضعنا عدد أصغر من صفر, فإنها تنتقل إلى السطر الذي يشير له هذا العدد و تبدأ في عد الأسطر بطريقة عكسية كالتالي: آخر سطر في كائن الـ ResultSet يكون رقمه -1, قبل آخر سطر -2 إلخ..ملاحظة: إستدعاء الدالة absolute(1) هكذا يساوي إستدعاء الدالة first().و إستدعاء الدالة absolute(-1) هكذا يساوي إستدعاء الدالة last().
|
|
public boolean relative(int row)
تستخدم للإنتقال إلى سطر محدد في كائن الـ ResultSet الذي قام باستدعائها مقارنة مع السطر الحالي.ترجع true في حال تم الإنتقال إلى سطر موجود في كائن الـ ResultSet, غير ذلك ترجع false.مكان الباراميتر row نضع رقم أكبر أو أصغر من صفر.- في حال وضعنا عدد أكبر من صفر, فإنها تنتقل إلى السطر التالي الذي يشير له هذا العدد كالتالي: أول سطر بعد السطر الحالي يكون رقمه 1, ثاني سطر بعده 2 إلخ.. - في حال وضعنا عدد أصغر من صفر, فإنها تنتقل إلى السطر السابق الذي يشير له هذا العدد كالتالي: أول سطر قبل السطر الحالي يكون رقمه -1, ثاني سطر قبله -2 إلخ.. ملاحظة: إستدعاء الدالة relative(1) هكذا يساوي إستدعاء الدالة next().و إستدعاء الدالة relative(-1) هكذا يساوي إستدعاء الدالة previous().و إستدعاء الدالة relative(0) هكذا ليس له أي تأثير.
|
|
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.
| |
مثال شامل
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سننشئ كائن من الإنترفيس Statement بواسطة الدالة createStatement() مع تمرير الثوابت TYPE_SCROLL_INSENSITIVE و CONCUR_UPDATABLE لها كـ Arguments.
ثم سنرسل إستعلام يقضي بجلب جميع بيانات جدول الموظفين ( employee ) و تخزينهم في كائن من الإنترفيس ResultSet.
في الأخير سنتجاوز أول أربعة أسطر موجودة في كائن الـ ResultSet و سنستخدم الحلقة while لعرض المعلومات المتوفرة حول الموظفين.
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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 في حال حدث خطأ عند محاولة الإتصال بقاعدة البيانات. |
|
مثال شامل الإنترفيس ResultSetMetaData في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سنقوم بجلب جميع البيانات الموجودة في جدول الموظفين ( employee ) و تخزينها في كائن من الإنترفيس ResultSet.
سنفترض أن جدول الموظفين يتألف من أربعة أعمدة ( id, name, email, phone ).
بعدها سننشئ كائن من الإنترفيس ResultSetMetaData و نربطه بكائن الـ ResultSet لعرض خصائص البيانات الموجودة فيه.
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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
طريقة جلب بيانات من قاعدة البيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة, و مبنية بنظام MySQL.
بعدها سنقوم بطباعة أسماء جميع الموظفين الموجودين فيها و المحفوظين في جدول إسمه employee.
تذكر: قبل البدء بكتابة الكود, لا تنسى أن تقوم بتحميل مكتبة الـ jar الخاصة بقواعد بيانات MySQL.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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","pass");
// و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
Statement stmt = con.createStatement();
// rs هنا قمنا بإرسال إستعلام إلى قاعدة البيانات لجلب جميع الأسماء الموجودة في جدول الموظفين. بعدها قمنا بتخزين النتيجة في الكائن
ResultSet rs = stmt.executeQuery("select name from employee");
// ( ملاحظة: هنا كل سطر يحتوي على إسم واحد ) rs هنا أنشأنا حلقة تمر على جميع الأسطر التي تم تخزينها في الكائن
while(rs.next()) {
// rs هنا في كل دورة سيتم عرض إسم جديد من الأسماء الموجودة في الكائن
System.out.println(rs.getString(1));
}
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج, سيظهر لنا جميع الأسماء الموجودة في الحقل name كالتالي.
Ahmad
Fouad
Said
Rola
Mohamad
Rim
Jana
Salem
Samir
Abdullah
...
#طريقة تجهيز إستعلام لتحديث معلومات موجودة في قاعدة بيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه تبديل إسم أي موظف نريد من الجدول.
بعدها, سنجعل البرنامج يطلب من المستخدم إدخال رقم الـ ID الخاص بهذا الموظف, ثم الإسم الجديد.
بعد إدخالهم, سيتم تحديث إسم الموظف في قاعدة البيانات.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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 الموظف الذي يريد تحديث إسمه.
•قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Enter the new name: Ahmad
#طريقة تجهيز إستعلام لجلب معلومات موجودة في قاعدة بيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه عرض كافة المعلومات المتوفرة في الجدول حول موظف غير محدد.
بعدها, سنجعل البرنامج يطلب من المستخدم إدخال رقم الـ ID الخاص بالموظف الذي يريد عرض بياناته.
بعد إدخال الرقم سيقوم البرنامج بعرض جميع المعلومات المتوفرة حول الموظف الذي يحمل هذه الـ ID.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
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("SELECT * FROM employee WHERE id = ?");
// id الموظف الذي يريد معرفة المعلومات المتوفرة حوله و وضعناه في المتغير ID هنا طلبنا من المستخدم إدخال
System.out.print("Select employee, enter his ID: ");
int id = input.nextInt();
// التي أدخلها المستخدم مكان علامة الإستفهام الموضوعة في الإستعلام id هنا قمنا بتمرير قيمة المتغير
pstmt.setInt(1, id);
// rs هنا قمنا بتنفيذ الإستعلام و تخزين النتيجة في الكائن
ResultSet rs = pstmt.executeQuery();
// لأننا نعلم حتماً أن نتيجة الإستعلام ستكون عبارة عن سطر واحد rs هنا توجهنا مباشرةً لأول سطر موجود في الكائن
rs.next();
// rs هنا قمنا بتنفيذ الإستعلام و تخزين النتيجة في الكائن
System.out.println("\nAll existing information about this employee are the following:");
System.out.println("ID: " + rs.getInt(1));
System.out.println("First Name: " + rs.getString(2));
System.out.println("Last Name: " + rs.getString(3));
System.out.println("Email: " + rs.getString(4));
System.out.println("Phone: " + rs.getString(5));
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج, سيطلب من المستخدم إدخال رقم ID الموظف الذي يريد معرفة كافة المعلومات المتعلقة به.
•قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
All existing information about this employee are the following:
ID: 5
First Name: Ziad
Last Name: Harmoush
Email: ziad.h@gmail.com
phone: +96103555442
#مثال عملي حول فكرة Batch Processing باستخدام الكلاس Statement
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إضافة موظف جديد في جدول الموظفين كلما قمنا بتنفيذه.
بعدها, سنقوم بتجهيز خمسة إستعلامات, لتنفيذهم دفعة واحدة في قاعدة البيانات.
ملاحظة: سنطبق مفهوم الـ Batch Processing باستخدام الإنترفيس Statement.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
import java.sql.Connection;
import java.sql.DriverManager;
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","pass");
// لا يحفظ أي تحديث نجريه على قاعدة البيانات من البرنامج بشكل تلقائي con هنا جعلنا الكائن
con.setAutoCommit(false);
// و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
Statement stmt = con.createStatement();
// هنا قمنا بتجهيز 5 إستعلامات في لائحة خاصة
stmt.addBatch("INSERT INTO employee(fname, lname, email, phone) VALUES('Mhamad', 'Harmush', 'mhamad@gmail.com', '+961123456')");
stmt.addBatch("INSERT INTO employee(fname, lname, email, phone) VALUES('Ziad', 'Masri', 'ziad@gmail.com', '+961112233')");
stmt.addBatch("INSERT INTO employee(fname, lname, email, phone) VALUES('Wissam', 'Mostafa', 'wissam@hotmail.com', '+96103876542')");
stmt.addBatch("INSERT INTO employee(fname, lname, email, phone) VALUES('Nader', 'Karim', 'nader1985@outlook.com', '+96170180190')");
stmt.addBatch("INSERT INTO employee(fname, lname, email, phone) VALUES('Rola', 'Dannawi', 'rola.d@gmail.com', '+96180776543')");
// هنا قمنا بتنفيذ الإستعلامات التي قمنا بتجهيزها سابقاً
stmt.executeBatch();
// هنا قمنا بحفظ التحديثات التي أجريناها على قاعدة البيانات
con.commit();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سيتم إضافة 5 سجلات في جدول الموظفين.
#مثال عملي حول فكرة Batch Processing باستخدام الكلاس PreparedStatement
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إضافة موظف جديد في جدول الموظفين بناءاً على المعلومات التي يدخلها المستخدم.
بعدها, سنجعل البرنامج يسأل المستخدم إذا كان يريد إضافة معلومات موظف جديد في قاعدة البيانات أم لا.
في حال أراد إضافة مستخدم جديد, سيطلب منه إدخال بيانات الموظف, بعدها سيتم وضع الإستعلام في لائحة خاصة تسمى Batch List.
في حال لم يريد إضاف أي مستخدم جديد, سيقوم بتنفيذ جميع الإستعلامات التي تم تجهيزها و بالتالي سيضيف جميع المعلومات التي قام المستخدم بإدخالها سابقاً دفعة واحدة.
ملاحظة: سنطبق مفهوم الـ Batch Processing باستخدام الإنترفيس PreparedStatement.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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);
// سنستخدم هذه المتغيرات لحفظ المعلومات التي يدخلها المستخدم عند تشغيل البرنامج
String firstName;
String lastName;
String email;
String phone;
// سنستخدم قيمة هذا المتغير كشرط أساسي لإدخال أو عدم إدخال مستخدم جديد
char addUser;
try {
// الذي سنعتمد عليه للوصول إلى قاعدة البيانات MYSQL Driver هنا قمنا بتحديد رابط الوصول لبرنامج الـ
Class.forName("com.mysql.jdbc.Driver");
// و الذي سنستخدمه لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات Connection هنا قمنا بإنشاء كائن من الكلاس
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","password");
// لا يحفظ أي تحديث نجريه على قاعدة البيانات من البرنامج بشكل تلقائي con هنا جعلنا الكائن
con.setAutoCommit(false);
// و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات بناءاً على المعلومات التي يدخلها المستخدم PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("INSERT INTO employee(fname,lname,email,phone) VALUES(?,?,?,?)");
// 'y' تساوي addUser هنا أنشأنا حلقة تعيد تكرار ما فيها طالما أن قيمة المتغير
do {
// في كل مرة يريد فيها إدخال بيانات موظف جديد. في حال أدخل حرف آخر لن يطلب منه من جديد 'y' هنا سيطلب من المستخدم إدخال الحرف
System.out.print("\nIf you want to add a new user, enter 'y': ");
addUser = input.next().charAt(0);
// سيطلب منه إدخال معلومات الموظف و سيتم تخزين كل واحدة منهم في متغير مختلف 'y' في حال قام المستخدم بإدخال الحرف
if(addUser == 'y')
{
System.out.print("Enter first name: ");
firstName = input.next();
System.out.print("Enter last name: ");
lastName = input.next();
System.out.print("Enter email address: ");
email = input.next();
System.out.print("Enter phone number: ");
phone = input.next();
// هنا قمنا بتمرير قيم المتغيرات التي تحتوي على بيانات الموظف مكان علامات الإستفهام الموضوعة في الإستعلام
pstmt.setString(1, firstName);
pstmt.setString(2, lastName);
pstmt.setString(3, email);
pstmt.setString(4, phone);
// batch هنا قمنا بإضافة الإستعلام في لائحة الخاصة بالـ
pstmt.addBatch();
}
}while(addUser == 'y');
// هنا قمنا بتنفيذ الإستعلامات التي قمنا بتجهيزها سابقاً في اللائحة
pstmt.executeBatch();
// هنا قمنا بحفظ التحديثات التي أجريناها على قاعدة البيانات
con.commit();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Enter first name: Mhamad
Enter last name: Harmush
Enter email address: mhamad@gmail.com
Enter phone number: 70123456
If you want to add a new user, enter 'y': y
Enter first name: Hala
Enter last name: Hassan
Enter email address: hala@hotmail.com
Enter phone number: 76002112
If you want to add a new user, enter 'y': y
Enter first name: Jad
Enter last name: Asmar
Enter email address: jad@outlook.com
Enter phone number: 81222345
If you want to add a new user, enter 'y': n
مثال عملي حول فكرة Transaction Management باستخدام الكلاس Statement
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إضافة موظف جديد في جدول الموظفين كلما قمنا بتنفيذه.
بعدها, سنقوم بتجهيز خمسة إستعلامات, لتنفيذهم دفعة واحدة في قاعدة البيانات.
ملاحظة: سنطبق مفهوم الـ Transaction Management باستخدام الإنترفيس Statement.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
import java.sql.Connection;
import java.sql.DriverManager;
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","pass");
// لا يحفظ أي تحديث نجريه على قاعدة البيانات من البرنامج بشكل تلقائي con هنا جعلنا الكائن
con.setAutoCommit(false);
// و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات Statement هنا قمنا بتجهيز كائن نوعه
Statement stmt = con.createStatement();
// commit() هنا قمنا بتجهيز 5 إستعلامات لن يتم تنفيذهم إلا عند إستدعاء الدالة
stmt.executeUpdate("INSERT INTO employee(fname, lname, email, phone) VALUES('Mhamad', 'Harmush', 'mhamad@gmail.com', '+961123456')");
stmt.executeUpdate("INSERT INTO employee(fname, lname, email, phone) VALUES('Ziad', 'Masri', 'ziad@gmail.com', '+961112233')");
stmt.executeUpdate("INSERT INTO employee(fname, lname, email, phone) VALUES('Wissam', 'Mostafa', 'wissam@hotmail.com', '+96103876542')");
stmt.executeUpdate("INSERT INTO employee(fname, lname, email, phone) VALUES('Nader', 'Karim', 'nader1985@outlook.com', '+96170180190')");
stmt.executeUpdate("INSERT INTO employee(fname, lname, email, phone) VALUES('Rola', 'Dannawi', 'rola.d@gmail.com', '+96180776543')");
// هنا قمنا بحفظ التحديثات التي أجريناها على قاعدة البيانات
con.commit();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سيتم إضافة 5 سجلات في جدول الموظفين.
مثال عملي حول فكرة Transaction Management باستخدام الكلاس PreparedStatement
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إضافة موظف جديد في جدول الموظفين بناءاً على المعلومات التي يدخلها المستخدم.
بعدها, سنجعل البرنامج يسأل المستخدم إذا كان يريد إضافة معلومات موظف جديد في قاعدة البيانات أم لا.
في حال أراد إضافة مستخدم جديد, سيطلب منه إدخال بيانات الموظف, بعدها سيتم وضع الإستعلام قيد الإنتظار حتى يتم إستدعاء الدالة commit().
في حال لم يريد إضاف أي مستخدم جديد, سيقوم بتنفيذ جميع الإستعلامات التي تم تجهيزها و بالتالي سيضيف جميع المعلومات التي قام المستخدم بإدخالها سابقاً دفعة واحدة.
ملاحظة: سنطبق مفهوم الـ Transaction Management باستخدام الإنترفيس PreparedStatement.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع قاعدة البيانات
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);
// سنستخدم هذه المتغيرات لحفظ المعلومات التي يدخلها المستخدم عند تشغيل البرنامج
String firstName;
String lastName;
String email;
String phone;
// سنستخدم قيمة هذا المتغير كشرط أساسي لإدخال أو عدم إدخال مستخدم جديد
char addUser;
try {
// الذي سنعتمد عليه للوصول إلى قاعدة البيانات MYSQL Driver هنا قمنا بتحديد رابط الوصول لبرنامج الـ
Class.forName("com.mysql.jdbc.Driver");
// و الذي سنستخدمه لتحديد المعلومات الأساسية التي نحتاجها للإتصال بقاعدة البيانات Connection هنا قمنا بإنشاء كائن من الكلاس
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","password");
// لا يحفظ أي تحديث نجريه على قاعدة البيانات من البرنامج بشكل تلقائي con هنا جعلنا الكائن
con.setAutoCommit(false);
// و الذي سنستخدمه لإرسال إستعلامات إلى قاعدة البيانات بناءاً على المعلومات التي يدخلها المستخدم PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("INSERT INTO employee(fname,lname,email,phone) VALUES(?,?,?,?)");
// 'y' تساوي addUser هنا أنشأنا حلقة تعيد تكرار ما فيها طالما أن قيمة المتغير
do {
// في كل مرة يريد فيها إدخال بيانات موظف جديد. في حال أدخل حرف آخر لن يطلب منه من جديد 'y' هنا سيطلب من المستخدم إدخال الحرف
System.out.print("\nIf you want to add a new user, enter 'y': ");
addUser = input.next().charAt(0);
// سيطلب منه إدخال معلومات الموظف و سيتم تخزين كل واحدة منهم في متغير مختلف 'y' في حال قام المستخدم بإدخال الحرف
if(addUser == 'y')
{
System.out.print("Enter first name: ");
firstName = input.next();
System.out.print("Enter last name: ");
lastName = input.next();
System.out.print("Enter email address: ");
email = input.next();
System.out.print("Enter phone number: ");
phone = input.next();
// هنا قمنا بتمرير قيم المتغيرات التي تحتوي على بيانات الموظف مكان علامات الإستفهام الموضوعة في الإستعلام
pstmt.setString(1, firstName);
pstmt.setString(2, lastName);
pstmt.setString(3, email);
pstmt.setString(4, phone);
// commit() هنا قمنا بتجهيز إستعلام لن يتم تنفيذه إلا عند إستدعاء الدالة
pstmt.executeUpdate();
}
}while(addUser == 'y');
// هنا قمنا بحفظ التحديثات التي أجريناها على قاعدة البيانات
con.commit();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
•قمنا بتعليم البيانات التي إنتظرنا البرنامج لإدخالها من لوحة المفاتيح باللون الأصفر.
Enter first name: Mhamad
Enter last name: Harmush
Enter email address: mhamad@gmail.com
Enter phone number: 70123456
If you want to add a new user, enter 'y': y
Enter first name: Hala
Enter last name: Hassan
Enter email address: hala@hotmail.com
Enter phone number: 76002112
If you want to add a new user, enter 'y': y
Enter first name: Jad
Enter last name: Asmar
Enter email address: jad@outlook.com
Enter phone number: 81222345
If you want to add a new user, enter 'y': n
طريقة تخزين ملف نصي في قاعدة البيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إدخال ملف نصي لأي موظف موجود في الجدول.
بعدها, سنحدد الموظف الذي نريد وضع ملفه في قاعدة البيانات بالإعتماد على رقم الـ ID الخاص فيه.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع الملفات و قاعدة البيانات
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
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","password");
// و الذي سنستخدمه لإرسال إستعلام إلى قاعدة البيانات PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("INSERT INTO employee(id, file) VALUES(?,?)");
// لأننا سنستخدمه لقراءة محتوى الملف الذي سنضعه في قاعدة البيانات FileReader هنا قمنا بإنشاء كائن من الكلاس
FileReader fr = new FileReader("c:\\myfile.txt");
// هنا قمنا بتمرير الرقم 44 مكان أول علامة إستفهام موضوعة في الإستعلام
pstmt.setInt(1, 44);
// هنا قمنا بتمرير الكائن الذي يشير إلى الملف و تمرير حجمه أيضاً مكان ثاني علامة إستفهام موضوعة في الإستعلام
pstmt.setCharacterStream(1, fr, (int)fr.length());
// هنا قمنا بتنفيذ الإستعلام
pstmt.executeUpdate();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
• لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سيتم إضافة الملف في سجل الموظف.
طريقة إسترجاع ملف نصي من قاعدة البيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إسترجاع ملف لأي موظف موجود في الجدول.
بعدها, سنحدد الموظف الذي نريد إسترجاع ملفه من قاعدة البيانات بالإعتماد على رقم الـ ID الخاص فيه.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع الملفات و قاعدة البيانات
import java.io.Reader;
import java.io.FileWriter;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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","password");
// و الذي سنستخدمه لإرسال إستعلام إلى قاعدة البيانات PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("SELECT file FROM employee WHER id=?");
// هنا قمنا بتمرير الرقم 44 مكان علامة الإستفهام الموضوعة في الإستعلام
pstmt.setInt(1, 44);
// rs هنا قمنا بتنفيذ الإستعلام و تخزين النتيجة في الكائن
ResultSet rs = pstmt.executeQuery();
// لأننا نعلم حتماً أن نتيجة الإستعلام ستكون عبارة عن سطر واحد rs هنا توجهنا مباشرةً لأول سطر موجود في الكائن
rs.next();
// لأننا سنستخدمه لجلب محتوى الملف من قاعدة البيانات Clob هنا قمنا بإنشاء كائن من الإنترفيس
Clob clob = rs.getClob(1);
// clob لأننا سنستخدمه لقراءة محتوى الملف الذي يشير إليه الكائن FileReader هنا قمنا بإنشاء كائن من الكلاس
Reader r = clob.getCharacterStream();
// لأننا سنستخدمه لقراءة محتوى الملف الذي حصلنا عليه من قاعدة البيانات FileWriter هنا قمنا بإنشاء كائن من الكلاس
FileWriter fw = new FileWriter("c:\\retrivedFile.txt");
// fw في الملف الذي يشير إليه الكائن r بواسطة الحلقة التالية قمنا بنسخ محتوى الملف الذي يشير إليه الكائن
int c;
while ((c = r.read()) != -1) {
fw.write((char)c);
}
// هنا قمنا بإغلاق الملف
fw.close();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
• لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سنسترجع الملف الموضوع في سجل الموظف.
طريقة تخزين ملف صوتي, صورة, فيديو في قاعدة البيانات في جافا
في المثال التالي سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إدخال صورة لأي موظف موجود في الجدول.
بعدها, سنحدد الموظف الذي نريد وضع صورته في قاعدة البيانات بالإعتماد على رقم الـ ID الخاص فيه.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع الملفات و قاعدة البيانات
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
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","password");
// و الذي سنستخدمه لإرسال إستعلام إلى قاعدة البيانات PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("INSERT INTO employee(id, image) VALUES(?,?)");
// لأننا سنستخدمه لقراءة محتوى الصورة التي سنضعها في قاعدة البيانات FileInputStream هنا قمنا بإنشاء كائن من الكلاس
FileInputStream fis = new FileInputStream("d:\\my-image.png");
// هنا قمنا بتمرير الرقم 44 مكان أول علامة إستفهام موضوعة في الإستعلام
pstmt.setInt(1, 44);
// هنا قمنا بتمرير الكائن الذي يشير إلى الصورة و تمرير حجمها أيضاً مكان ثاني علامة إستفهام موضوعة في الإستعلام
pstmt.setBinaryStream(2, fis, fis.available());
// هنا قمنا بتنفيذ الإستعلام
pstmt.executeUpdate();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
• لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سيتم إضافة الصورة في سجل الموظف.
#طريقة إسترجاع ملف صوتي, صورة, فيديو من قاعدة البيانات في جافا
في هذا المثال سنفترض أننا سنقوم بالإتصال بقاعدة بيانات إسمها company تمثل قاعدة بيانات لشركة و مبنية بنظام MySQL.
يوجد في هذه القاعدة جدول خاص للموظفين إسمه employee.
في البداية سنجهز إستعلام الهدف منه إسترجاع صورة أي موظف موجود في الجدول.
بعدها, سنحدد الموظف الذي إسترجاع صورته من قاعدة البيانات بالإعتماد على رقم الـ ID الخاص فيه.
مثال
// هنا قمنا بإستدعاء الكلاسات و الإنترفيسات التي سنستخدمها للتعامل مع الملفات و قاعدة البيانات
import java.io.FileOutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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","password");
// و الذي سنستخدمه لإرسال إستعلام إلى قاعدة البيانات PreparedStatement هنا قمنا بتجهيز كائن نوعه
PreparedStatement pstmt = con.prepareStatement("SELECT image FROM employee WHER id=?");
// هنا قمنا بتمرير الرقم 44 مكان علامة الإستفهام الموضوعة في الإستعلام
pstmt.setInt(1, 44);
// rs هنا قمنا بتنفيذ الإستعلام و تخزين النتيجة في الكائن
ResultSet rs = pstmt.executeQuery();
// لأننا نعلم حتماً أن نتيجة الإستعلام ستكون عبارة عن سطر واحد rs هنا توجهنا مباشرةً لأول سطر موجود في الكائن
rs.next();
// لأننا سنستخدمه لجلب محتوى الصورة من قاعدة البيانات Blob هنا قمنا بإنشاء كائن من الإنترفيس
Blob b = rs.getBlob(1);
// imageBytes إسمها byte هنا قمنا بتخزين محتوى الصورة في مصفوفة نوعها
byte imageBytes[] = b.getBytes(1,(int)b.length());
// لأننا سنستخدمه لقراءة محتوى الصورة التي حصلنا عليها من قاعدة البيانات FileOutputStream هنا قمنا بإنشاء كائن من الكلاس
FileOutputStream fos = new FileOutputStream("d:\\retrived-image.png");
// بمعنى آخر قمنا بإنشاء نسخة من الصورة ,imageBytes هنا قمنا بكتابة محتوى الصورة الموجود في المصفوفة
fos.wirte(imageBytes);
// هنا قمنا بإغلاق الملف, أي كأننا أغلقنا الصورة
fos.close();
// هنا قمنا بإغلاق الإتصال مع قاعدة البيانات
con.close();
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
• لو كانت قاعدة البيانات موجودة و قمنا بتشغيل البرنامج سنسترجع الصورة الموضوعة في سجل الموظف.