الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام قاعده بيانات Derby في جافا

بدأه Wajdy Essam في 1 أغسطس 2009 · 13 رد · 5,246 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

derby-logo-web.png

مقدمه لJava Derby :

أحد أهم الإضافات في جافا 6 هو استخدام قاعده البيانات Derby والتي أصبحت تأتي مع نسخ الجافا الجديده (بالرغم من أني لم أشاهدها ضمن نسخه جافا 6 التحديث 11 !) ، هذه القاعده كانت في الأساس ملك لشركه CloudScape ثم أشترتها شركه informix بالكامل ،وقامت IBM بشراء المنتج من informix وبعدها قدمت IBM هذا المنتج لApache Software Foundation بإسم Derby ، وأخيرا قامت SUN في (2006) بوضع هذا المنتج مع أي نسخه جافا في المسار التالي: C:\Program Files\Java\jdk1.6.0\db . وأصبحت تطلق عليه أحيانا Java DB .

هذه القاعده هي من النوع العلائقي Relational Data Base وهذا يسمح بأن تكون هناك علاقات بين الجداول في القاعده باستخدام Primary Key/Foreign Key وهي مكتوبة بالكامل بلغه جافا . ثانيا هذه القاعده يمكن أن تعمل في طورين مختلفين الأول هو بأن تستخدم القاعده لتخزين البيانات في التطبيق Embedded Database والطور الأخر وهو أنها يمكن أن تستخدم في طور Client/Server حيث تحمل القاعده في السيرفر الذي ينتظر الclients من اللإتصال لهذه الdata base .

من ميزات هذه القاعده وهي أنها صغيره جدا حيث تبلغ حجمها حوالى 2 ميغا فقط .اضافه الى أن هذه القاعده RDMBS تمتاز بسهوله الإستخدام والإداره Administration ، وأخيرا تسهل عملية توزيع المنتج Deployment حيث تدعم هذه القاعده حفظ البيانات في شكل ملف جار JAR File وبالتالي سهوله نشر الملف.

أعتقد أن مميزات كهذه كافيه لأن تبدأ باستخدام Derby في أي مشروع من النوع الصغير أو المتوسط ،، وقبل أن نبدأ الأن بالحديث عن كيفية استخدام هذه القاعده يجب تحميلها لمن لم يجد تلك القاعده كما في حالتي من موقع Apache على هذا الرابط من موقع sun :

http://developers.sun.com/javadb/downloads/index.jsp

أو من موقع أباتشي :

http://db.apache.org/derby/derby_downloads.html

Installing Derby :

بعد تحميلك القاعده وفك الضغط قم بوضعها في أي مسار وسنقوم بعدها بضبط متغيرات النظام حتى يراها سطر الأوامر ، عن نفسي وضعتها في المسار التالي : C:\Program Files\Java\

بعد ذلك نقوم بضبط المسار class path من متغيرات النظام Environment Variable وسوف نستخدم ملفين رئيسين (موجودين في المسار C:\Program Files\Java\db-derby-10.5.1.1-bin\lib) الأول هو derby.jar وهو يحتوي على JDBC Driver والملف الثاني derbytools.jar وهو يحتوي على عده أدوات أهمها الأداه ij (أختصار ل Interactive JDBC Scripting Tool) ويمكن من خلال هذه الأداه انشاء وأداره قاعده البيانات .

بالتالي سوف نضيف المسارين التاليين في classpath :

C:\Program Files\Java\db-derby-10.5.1.1-bin\lib\derby.jar

C:\Program Files\Java\db-derby-10.5.1.1-bin\lib\derbytools.jar

يحتوي الملف bin على ملف bat يصل لهذه الأدوات مباشره (يقوم بتنفيذ الأمر java org.apache.derby.tools.ij) ويمكن وضعه أيضا في path :

C:\Program Files\Java\db-derby-10.5.1.1-bin\bin

للتأكد من عمل كل شيء علي ما يرام ، يتم تنفيذ البرنامج sysinfo والذي يعرض معلومات عن الJDK الموجود في الجهاز :

C:\>java org.apache.derby.tools.sysinfo

اذا ظهر exception فهذا يعني أن ملفين الjar السابقيين غير موجودين في الclasspath .ويجب وضعهم كما بينا سابقا ،، ويمكن استخدامهم مباشره عند تشغيل البرنامج باستخدام المعامل -classpath ولكن يفضل التعديل في الEnvironment Variable .

Using Derby :

نبدأ الأن بأول جوله لإستكشاف القاعده Derby ، ومن سطر الأوامر cmd.exe قم بتشغيل الأداه ij ، بعد ذلك سنقوم بانشاء القاعده ArabTeam وسوف تكون في المسار : C:\MyDb\ArabTeam وسوف يحتوي هذا المسار على عده ملفات تكون لنا القاعده...

C:\>ijij version 10.5
ij> connect 'jdbc:derby:/MyDB/ArabTeam;create=true' ;
ij>

سنصنع الأن عده جدوال للتجربه وسنقوم بوضع الأوامر التالية في ملف نسميه go.sql :

CREATE TABLE USERS (
	FIRST_NAME	VARCHAR(30)	NOT NULL,
	LAST_NAME	VARCHAR(30) NOT NULL,
	EMP_NO		INTEGER		NOT NULL	CONSTRAINT EMP_NO_PK PRIMARY KEY
);

CREATE TABLE PC (
	TYPE_NAME	VARCHAR(10) NOT NULL,
	SERIAL		VARCHAR(50),
	OS			VARCHAR(20),
	EMP_NO		INTEGER,
	CODE_NO		INTEGER NOT NULL CONSTRAINT CODE_NO_PK PRIMARY KEY 
);

سنقوم الأن بتشغيل الملف السابق لكي يصنع لنا هيكل القاعده باستخدام الأمر run :

run '/MyDb/go.sql' ;ij> CREATE TABLE USERS (
        FIRST_NAME      VARCHAR(30)     NOT NULL,
        LAST_NAME       VARCHAR(30) NOT NULL,
        EMP_NO          INTEGER         NOT NULL        CONSTRAINT EMP_NO_PK PRI
MARY KEY
);
0 rows inserted/updated/deleted
ij> CREATE TABLE PC (
        TYPE_NAME       VARCHAR(10) NOT NULL,
        SERIAL          VARCHAR(50),
        OS                      VARCHAR(20),
        EMP_NO          INTEGER,
        CODE_NO         INTEGER NOT NULL CONSTRAINT CODE_NO_PK PRIMARY KEY
);
0 rows inserted/updated/deleted
ij>

ولإستعراض بنية الجدول يمكن أستخدام الأمر describe tableName :

ij> describe USERS ;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
FIRST_NAME          |VARCHAR  |NULL|NULL|30    |NULL      |60        |NO
LAST_NAME           |VARCHAR  |NULL|NULL|30    |NULL      |60        |NO
EMP_NO              |INTEGER  |0   |10  |10    |NULL      |NULL      |NO
3 rows selected

سنقوم الأن باضافه بيانات للجدول عن طريق أمر الsql المختص بالإدخال INSERT وسنضعه داخل الملف in.sql :

INSERT INTO USERS VALUES('Wajdy','Essam',2);
INSERT INTO USERS VALUES('Ahmed','Ali',5);

INSERT INTO PC VALUES('Desktop','0654505','Windows',2,1);
INSERT INTO PC VALUES('Desktop','036545d','Linux',2,2);
INSERT INTO PC VALUES('Laptop','010120101','MAC OS',5,3);

بنفس الأمر السابق run سنقوم بتشغيل الملف In.sql لكي يدخل بيانات للجدول ، وأخيرا سوف نرى الحقول عن طريق أمر SELECT :

ij> SELECT * FROM USERS ;
FIRST_NAME                    |LAST_NAME                     |EMP_NO
-------------------------------------------------------------------------
Wajdy                         |Essam                         |2
Ahmed                         |Ali                           |5

Java & Derby :

سوف نتصل الأن بهذه القاعده من خلال برنامج بسيط بجافا ،، كما يبين الكود التالي :

// Test ArabTeam DB

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo {
	public static void main (String args[]) { 
		Demo app = new Demo();
		app.showUserTable();
	}

	public void showUserTable () {
		try {
			String driver = "org.apache.derby.jdbc.EmbeddedDriver";
			Class.forName(driver);

			String dbName = "/MyDB/ArabTeam"; 
			String connectionURL = "jdbc:derby:" + dbName;
			Connection conn = null;

			conn = DriverManager.getConnection(connectionURL);
			Statement statement = conn.createStatement();

			ResultSet rs = statement.executeQuery("SELECT * FROM PC");

			while ( rs.next() ) { 
				System.out.print(rs.getString(1) + "  " );
				System.out.print(rs.getString(2) + "  " );
				System.out.print(rs.getString(3) + "  " );
				System.out.print(rs.getString(4) + "  " );
				System.out.print(rs.getString(5) + "\n");
			}

			rs.close();
			statement.close();
			conn.close();

		}
		catch ( Exception e ) {
			System.out.println(e);
			e.printStackTrace();
		}
	}
}

في المثال السابق اتصل البرنامج بالقاعده عن طريق الEmbedded Derby JDBC driver حيث يتم تحميل الderby engine الى الjvm اثناء العمل مثلها مثل التطبيق العادي ، كما يوضح ذلك الشكل التالي :

embedded.png

Derby Embedded Architecture

بالنسبة للطور الثاني Client/Server فيحتاج الى derbynet.jar أن يكون موجود في الclasspath ، الرابط التالي يوضح كيفية اعداده :

Derby Network Server

Using Derby in Netbeans :

أيضا نسخه Derby تأتي مع الNetbeans ويمكن استخدامها بشكل مباشر .. الروابط التالية تبين ذلك :

Get Started with Java DB in your Java Console Applications

Working with the Java DB (Derby) Database in NetBeans IDE

Using Java DB in Desktop Applications

كانت هذه تجربة بسيطة لي للتعامل مع derby أحببت أن أشارك بها أخوتي ،، ومن سبق أن عمل عليها أرجوا وضع ملاحظاته وأرائه حول Derby ، بالنسبة لي لاحظت بطئ في التعامل مع القاعده وحتى الأداه ij كونها كلها مكتوبة بالجافا ..

والسلام عليكم ورحمه الله وبركاته ،،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 1 أغسطس 2009 في 10:55 — السبب: كالعاده :)

3

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#2

جزاك الله خيرا .

300_130.gif

#3

جزاك الله خيراً

منذ يومين وانا اقرأ في الـ Embedded DB

HSQL -- SmallSQL وغيرها

وقرات هذا الموضوع الخاص بالـ JavaDB

http://java.sun.com/developer/technicalArt...db/#addressbook

ولكن لي سؤال

انشأت قاعدة بيانات باستخدام الـ PostgreSQL طبعا باستخدام الواجهه

هل هناك طريقه لاستخدام هذه القاعده بدلا من انشاء قاعده من جديد ؟؟

بمعني هل يمكن نقل هذه القاعده للتعامل معها من خلال الـ Derby حيث انها Embedded ويمكن تضمينها داخل المشروع ؟؟

تم تعديل هذه المشاركة بواسطة cIs.Falcon في 1 أغسطس 2009 في 15:59

صــفــر

#4

وعليكــم السـلام ورحمة الله وبركاتـه..

اذا كنت ترغب بنقل هيكل القاعده Structure فصراحه لا أعرف أي طريقة ، راجع منتدى قواعد البيانات فبالتأكيد توجد أوامر يمكن انتزاع هذه الStructure .. واذا كانت القاعده صغيره فقم بانشائها من الصفر في derby ..

للضمان من المشاكل فيما بعد عند انشائك للقاعده الجديده في Derby قم بحفظ تعليمات الإنشاء القاعده والجدوال في ملف sql كما هو موضح في المقال ،، حتى ما اذا أردت يوم من الأيام التحويل لقاعده أخرى فيمكنك تشغيل الملف فقط وسيتم انشائها كما كانت .. هذا يسهل عليك كثيرا ..

هذا بالنسبة لنقل الstructure ، أيضا لنقل البيانات Data لا أعلم أي طريقة :) وقد توجد أوامر لهذا الأمر ، وفي حال لم تجد فيمكنك أن تستخدم الحل البدائي والسهل وهو عمل تطبيق بجافا يقرأ بيانات القاعده الأولى A ويدخلها في قاعده البيانات الثانيه B ..

بالتوفيق :) ..

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#5

وين هالغيبة يا وجدي ... اشتقنالك و الله

ومواضيعك كلها أكثر من رائعة , وبصراحة الواحد بشكل تلقائي بنجذب لقراءة مواضيعك المميزة فعلا ..

جزاك ربي خيرا.

#6

بشكل عام سيكون التعامل مع قاعدة البيانات كهذه شيئاً رائعاً

لو كان لدي أكثر من برنامج تتعامل مع تفس قاعدة البيانات

هل يمكننا ذلك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7

السلام عليكم ،،

للأسف يا استاذ علاء لا يمكن

هذا من خلال تجربتي مع الـ Apache Derby !!

صــفــر

#8

معنى الكلام أنها قاعد بيانات لبرنامج معين

على العموم هذه الفكرة تتوافق مع مفهوم المحمولية لقاعدة البيانات

بالمناسبة أصبح لدينا خبير في الموضوع

:)

هلا عرضت علينا أخ cIs.Falcon

مقتطفات من الشيفرة الخاصة بك (snapshot)

فأظن هذا سيثري الموضوع ويفتح أفاق جيدة للنقاش

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

اخي الكريم بارك الله فيك على الدرس القيم

لكن عند التطبيق اي بعد انشاء قاعدة البيانات و الكود

يظهر لي خطأ عند عمل كومبايل

#10

ماهو هذا الخطأ ؟

اقتباس
لو كان لدي أكثر من برنامج تتعامل مع تفس قاعدة البيانات

هل يمكننا ذلك

يمكنك استخدام Derby Network Server ...

لا أعتبرها خياراً مفضلاً بالنسبة لي في قواعد البيانات المضمنة Embedded Database

فهي بطيئة نسبياً، وليست “صغيرة جداً” كما تقول ! فـ SQLite تقوم مقامها ولا يتجاوز حجم الملف (الفارغ) 2 كيلو بايت!

و HSQLDB تقوم مقامها أيضا وهي أسرع بكثير وأصغر …

حتى أنه ليس فيها نمط بيانات boolean !

وعانيت منها عند استخدامها بشكل مضمن Embedded في لينكس من مشكلة القفل: حيث يتم انشاء ملف باسم db.lck في مسار القاعدة عند أول اتصال بالقاعدة، وإذا كان الملف موجوداً مسبقاً لا يتم الاتصال ... والمشكلة كانت بأن الملف db.lck كان لا يحذف بشكل تلقائي ...

#11

شكرا اخي الكريم

اعتقد ان المشكله في موضع الملفات اي موضع ملف الكلاس بالنسبه لقاعده البيانات

لاني قمت بانشاء الجداول بطريقه عاديه كذلك السورس ايضا

#12

للتوضيح اكثر هذه رسالة الخطا

java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClassInternal(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at Demo.showUserTable(Demo.java:15)java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver

at Demo.main(Demo.java:10)

#13

يجب إضافة الـ Driver إلى مشروعك

إذا كنت تستخدم netbeans انقر باليمين على مجلد الـ Libraries في مشروعك، اختر Add Library، اختر Java DB Driver من القائمة، ثم اضغط زر Add Library

أما في eclipse انقر باليمين على المشروع واختر properties، ابحث عن Java Build Path، من التبويب Libraries اضغط زر Add Library، اختر Connectivity Driver Definition، اضغط Next، حدد التعريف من القائمة ثم Finish.

#14

بارك الله فيك اخي الكريم والله يرحم والديك

الان اصبح يعمل :happy:

وارجوا اظافة هده الملاحظة في الدرس

هذا ما كان ينقصني علما وانني استعمل Eclipse

لكن لماذا لم يعمل المشروع علما وانني قمت بضبط متغيرات النظام

كما اريد معرفة الطريقة في حالة عدم وجود Eclipse or NetBeans

مواضيع مشابهة