لمحة جافاوية 47: من قواعد البيانات

السلام عليكم

نعم أنا مشتاق وعندي لوعة ولكن مثلي لا يذاع له سر
فعلاً أنا مشتاق ولم يكن أبو فراس الحمداني غبياً أبداً
على كل حال أنا هكذا
لا أكف عن التذمر
أحاول من الحين إلى الآخر أن أبدو متفائلاً
لكن محاولاتي تبوء بالفشل الذريع
بالمناسبة الأخ عبده يرسل لكم سلاماً خاصاً
ويسألكم أن تدعو له بالعودة مغفوراً له من الديار الحجازية
هباءاً حاولت أن أخبره أن الحج لا يكون إلا في موعد معين
لكن كما تعرفون فالأخ عبده مصمم على أني لا أفقه شيئاً
ولما سألته عن علمه هو بالفقه أخبرني أنه سيسأل عندما يصل إلى الحجاز
ولن يعود إلا وقد أدى فريضة الحج
بالطبع انتهزت أنا الفرصة وأخبرته كم هو ذكي
فنحن مازلنا في ربيع الأول
ومعنى أن ينتظر الحج في مكة
أنني سأرتاح من غثاثته مدة لا بأس بها
كم تمنيت أنه قرر أن يقوم بهذه الرحلة من شهر محرم
لكن البطر خلق سيء وستة أشهر ليست بالمدة القصيرة
على كل حال دعونا نتخلص من عقدة الأخ عبده ونتفرغ لدرس اليوم
بما أنه لي فترة لم أكتب
فلن أطيل عليكم اليوم
اليوم سأتكلم عن قواعد البيانات
وسأقسم الموضوع إلى قسمين
1- كيف أحصل على مفتاح id لصف row قمت بإضافته مؤخراً؟
2- لماذا PreparedStatment وليس Statment؟

كيف أحصل على مفتاح id لصف row قمت بإضافته مؤخراً؟
في التصاميم الجيدة لقواعد البيانات DataBase
يكثر الحديث عن المفتاح الرئيسي prime key المفتاح الغريب forign key
وذلك لعدة أسباب منها المنطقية ومنها توفير البيانات والحفاظ على مرونة قاعدة البيانات …إلخ
وعلى الأغلب عندما تريد أن تضيف بيانات في جدول يحتوي أحدهما على مفتاح غريب للآخر
لنوضح ذلك نأخذ المثال التالي:
لدينا جدول كتب وجدول مؤلفين
واضح أن جدول الكتب يحتوي على مفتاح غريب من جدول المؤلفين
لهذا فجدول المؤلفين هو الجدول الرئيسي
1- سنقوم بإضافة مؤلف ما بداية
2- ثم سنقوم بالبحث عن أكبر مفتاح في قاعدة البيانات
3- ثم نقوم بإضافة الكتاب الخاص بالمؤلف
ما رأيكم في الخطوة رقم 2
في رأيي أن الخطوة رقم 2 غثيثة وقليلة حياء
لأننا نحن من أضاف الصف row في قاعدة البيانات فيفترض بنا أن نكون على علم بمفتاحه
بدون أن أطيل عليكم يمكننا الإستغناء عنها باستخدام الدالة getGeneratedKeys
هذه الدالة تعطيك القيم لجميع المفاتيح التي أنتجت بشكل تلقائي أثناء تنفيذ جملة معينة
انظروا الشيفرة التالية توضح آلية استخدامها

		PreparedStatement stat1=new PreparedStatement ("insert into author (name) values('alaa')");
		stat1.executeUpdate();
		ResultSet rs=stat1.getGeneratedKeys();
		rs.next();
		PreparedStatement stat2=new PreparedStatement ("insert into book (name,authorId) values('alaa','"+rs.getInt(0)+"')");
		stat2.executeUpdate();

بهذا أصبح لدينا خطوتين بدلاً من ثلاث

لماذا PreparedStatment وليس Statment؟
في البداية PreparedStatment هي عبارة عن precompiled Statment
لن أطيل عليكم باختصار لسببين
1- يمكنك استخدامها أكثر من مرة بدون إعادة الترجمة في كل مرة
طبعاً ظاهر أنها توفر في وقت البرنامج كثيراً من ناحية إنشاء كائنات جديدة لا فائدة منها ومن ناحية الترجمة مرة واحدة
2- حماية من الاختراق المستفيد من ثغرة الحقن Sql Injection

أتمنى لكم التوفيق
تحياتي

Tags: , , , , , , ,

One Response to “لمحة جافاوية 47: من قواعد البيانات”

  1. abuoof قال:

    جزاك الله خير
    مقال مفيد جداً

Leave a Reply