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

مقدمه ل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 :
Derby
أو من موقع أباتشي :
Derby
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 الموجود في الجهاز installed jdk
اذا ظهر exception فهذا يعني أن ملفين الjar السابقيين غير موجودين في الclasspath .ويجب وضعهم كما بينا سابقا ،، ويمكن استخدامهم مباشره عند تشغيل البرنامج باستخدام المعامل -classpath ولكن يفضل التعديل في الEnvironment Variable .
Using Derby :
نبدأ الأن بأول جوله لإستكشاف القاعده Derby ، ومن سطر الأوامر cmd.exe قم بتشغيل الأداه ij ، بعد ذلك سنقوم بانشاء القاعده ArabTeam وسوف تكون في المسار : C:\MyDb\ArabTeam وسوف يحتوي هذا المسار على عده ملفات تكون لنا القاعده db
ij version 10.5
ij> connect ‘jdbc:derby:/MyDB/ArabTeam;create=true’ ;
ij>
سنصنع الأن عده جدوال للتجربه وسنقوم بوضع الأوامر التالية في ملف نسميه go.sql :
[sourcecode language='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 ); [/sourcecode] ا
سنقوم الأن بتشغيل الملف السابق لكي يصنع لنا هيكل القاعده باستخدام الأمر run
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 :
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 :
كما يلي :
[sourcecode language='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);
[/sourcecode]
ا
بنفس الأمر السابق run سنقوم بتشغيل الملف In.sql لكي يدخل بيانات للجدول ، وأخيرا سوف نرى الحقول عن طريق أمر SELECT :
FIRST_NAME |LAST_NAME |EMP_NO
————————————————————————-
Wajdy |Essam |2
Ahmed |Ali |5
Java & Derby:
سوف نتصل الأن بهذه القاعده من خلال برنامج بسيط بجافا ،، كما يبين الكود التالي code
[sourcecode language='java']
// 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();
}
}
}
[/sourcecode]
ا
في المثال السابق اتصل البرنامج بالقاعده عن طريق الEmbedded Derby JDBC driver حيث يتم تحميل الderby engine الى الjvm اثناء العمل مثلها مثل التطبيق العادي ، كما يوضح ذلك الشكل التالي :

Derby Embedded Architecture
بالنسبة للطور الثاني Client/Server فيحتاج الى derbynet.jar أن يكون موجود في الclasspath ، الرابط التالي يوضح كيفية اعداده :
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 كونها كلها مكتوبة بالجافا ..
والسلام عليكم ورحمه الله وبركاته ،،
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
مقال جميل أخ عصام !
استخدمت الـ Derby مؤخراً وكل يوم أكتشف فيها مآخذ جديدة …
فهي ليست خياراً مفضلاً بالنسبة لي في قواعد البيانات المضمنة Embedded Database
فهي بطيئة نسبياً، ولا أعتبرها “صغيرة جداً” كما تقول ! فـ SQLite تقوم مقامها ولا يتجاوز حجم الملف (الفارغ) 2 كيلو بايت!! مع أداء أسرع بكثير!
و HSQLDB تقوم مقامها أيضا وهي أسرع بكثير وأصغر …
حتى أنه ليس فيها نمط بيانات boolean !
وعانيت منها عند استخدامها بشكل مضمن Embedded من مشكلة القفل: فكما تعلم عند استخدامها بشكل مضمن من أكثر من اتصل واحد، حيث يتم انشاء ملف باسم db.lck في مسار القاعدة عند أول اتصال، وإذا كان الملف موجوداً مسبقاً لا يتم الاتصال.
ومشكلتي هي أنها لا تقوم بإغلاق الاتصال على لينكس، فيتوجب عليك حذف ملف القفل يدوياً !
ملاحظة: لم لا تستخدم capatcha للتخلص من هذا الـ Spam المزعج ؟!