وصل Java 8 أخيرًا بعد بضع سنوات من الانتظار ، يمكن لمبرمجي Java أخيرًا الحصول على برمجة وظيفية في Java. قم بتشغيل قاعدة البيانات الوظيفية.
الطريقة الوظيفية لمعالجة البيانات
لا يضيف Java 8 الدعم الوظيفي فحسب ، بل يوسع أيضًا فئة التجميع حسب بيانات معالجة الوظائف الجديدة.
على سبيل المثال ، افترض أن لديك مجموعة من المجموعة: العميل: العميل:
مجموعة <Customer> عملاء ؛
إذا كنت مهتمًا فقط بالعملاء من بلجيكا ، فستكون لديك جميع كائنات العملاء وحفظ ما تحتاجه فقط.
Collection <Customer> Belgians = New ArrayList <() () ؛
هذا لا يكلف 5 أسطر من الكود فحسب ، ولكنه ليس مجردة للغاية. رمز الخيوط لإعادة كتابة جميع التعليمات البرمجية.
مع Java 8 ، يمكن لسطر واحد فقط من الكود تحقيق نفس الميزات. فقط جعل الترشيح.
العملاء.
إن كود Java 8 أعلاه أقصر ، ولكنه أسهل في الفهم. تضيع الوقت في تفسير الكود في دورة التفسير لفهم ما تفعله لبياناتها.
ما الذي يجب أن أفعله إذا كنت ترغب في تنفيذ هذا الرمز بشكل متزامن؟
عملاء. parallelstream ().
الأمر الأكثر إثارة هو أن رمز النمط الوظيفي هذا ينطبق أيضًا على قاعدة البيانات
استخدم طريقة وظيفة في قاعدة البيانات
تقليديًا ، يحتاج المبرمجون إلى استخدام قاعدة بيانات خاصة للاستعلام عن بيانات قاعدة البيانات.
reparedStatement s = con.preparestatement ("Select *" + "من العميل C" + "حيث c.country =؟") ؛معظم هذه الكود ، والتي ستجعل البرمجيات لا تجد أخطاء وسيؤدي هذا الرمز المتسرع إلى حدوث مشاكل أمان. توفير لغة استعلام قاعدة البيانات ، يمكنك حل الشيكات الخاطئة ومشاكل الأمان. أو استخدم أداة تعيين علاقة الكائن لتجنب عدد كبير من التعليمات البرمجية الممل ، ولكن لا يمكن استخدامها إلا في الوصول العام إلى الاستفسارات.
استخدم Java 8 للاستعلام عن قاعدة البيانات بواسطة API الوظيفية. على سبيل المثال ، JinQ هو مشروع مفتوح المصدر ، وما هو واجهة برمجة تطبيقات قاعدة البيانات المستقبلية التي يمكن أن تجعل البرمجة الوظيفية ممكنة. فيما يلي استعلام قاعدة البيانات باستخدام Jinq:
العملاء. where (c-> c.getCountry (). equals ("Belgium") ؛هذا الرمز هو نفس الرمز باستخدام واجهة برمجة تطبيقات دفق. عند تشغيل الرمز ، ستترجم JINQ تلقائيًا إلى رمز استعلام قاعدة البيانات ، تمامًا مثل استعلام JDBC من قبل.
في هذه الحالة ، حتى لو لم تتعلم بعض لغة استعلام قاعدة البيانات الجديدة ، يمكنك كتابة استعلام فعال لقاعدة البيانات. يمكنك استخدام نفس نمط التعليمات البرمجية لجمع على Java. لا تحتاج إلى مترجم Java خاص أو جهاز افتراضي. جميع تجميع الكود وتشغيله على Java 8 JDK العادية. إذا كان رمزك خاطئًا ، فسيجدهم المترجم والإبلاغ عنه لك ، تمامًا مثل رمز Java العادي.
يدعم JINQ نفس الاستعلام المعقد مثل SQL92. خوارزمية رمز Java للترجمة في استعلام قاعدة البيانات مرنة للغاية ، طالما أنها يمكن أن تقبلها ، يمكن أن تترجم. على سبيل المثال ، يمكن لـ JINQ ترجمة استعلام قاعدة البيانات أدناه ، على الرغم من أنه معقد.
العملاء. (C-> C.GetCountry (). يساوي ("بلجيكا") ctctctctctct عمل العمل العمل العمل العمل العمل عمل عمل عمل عمل آخر.كما ترون ، فإن البرمجة الوظيفية لـ Java 8 مناسبة جدًا لاستعلام قاعدة البيانات. والاستعلام مضغوط وحتى الاستفسارات المعقدة يمكن أن تكون مختصة.
العملية الداخلية
لكن كيف تعمل؟ كيف يمكن لمرسلات Java العادية تحويل رمز Java إلى استعلام قاعدة البيانات؟ ما الذي يميز Java 8 لجعل هذا ممكنًا؟
إن مفتاح دعم PIs الجديد لقاعدة البيانات التي تدعم هذه الوظائف هي طريقة تحليل Bytecode تسمى "التنفيذ الرمزي". على الرغم من أن الكود الخاص بك يتم تجميعه بواسطة مترجم Java عادي ويعمل في جهاز Virtual Java العادي ، يمكن لـ Jinq تحليل وإنشاء استعلام قاعدة بيانات منه عند تجميع كود Java. عند استخدام API Java 8 Streams ، غالبًا ما يتم العثور على أنه عند تحليل الوظائف القصيرة ، يكون تأثير عمل التنفيذ الرمزي هو الأفضل.
لفهم كيفية عمل هذا التنفيذ الرمزي ، أسهل طريقة هي استخدام مثال. دعنا نتحقق من كيفية تحويل الاستعلامات التالية إلى لغة استعلام SQL بواسطة Jinq:
العملاء. في مكان (c-> c.getCountry (). متساوٍ ("بلجيكا")))))))))) في البداية ، فإن عملاء المتغيرات عبارة عن مجموعة ، واستعلام قاعدة البيانات المقابلة هو:
حدد * من العملاء ج
ثم ، يتم استدعاء طريقة () ، ويتم تمرير الوظيفة إليها. في طريقة () ، يفتح JINQ ملف .class لهذه الوظيفة للحصول على رمز البايت الذي تم تجميعه بواسطة هذه الوظيفة للتحليل. في هذا المثال ، لا تستخدم رمز البايت الحقيقي ، دعنا نستخدم بعض الإرشادات البسيطة لتمثيل رمز البايت لهذه الوظيفة:
d = c.getCountry () e = "belgium" e = d.equals (e) return e
هنا ، نفترض أن الوظيفة تم تجميعها بواسطة برنامج التحويل البرمجي Java في هذه التعليمات الأربع. عندما تسمى طريقة () ، يرى Jinq هذه. كيف يمكن لـ Jinq فهم هذه الكود؟
يتم تحليل JINQ عن طريق تنفيذ رمز. لكن Jinq لا يدير الرمز مباشرة. إنه رمز تشغيل "مجردة": بدون متغيرات حقيقية وقيم حقيقية ، يستخدم JINQ الرموز للإشارة إلى جميع القيم عند تنفيذ التعليمات البرمجية. هذا هو السبب في أن هذا التحليل يسمى "التنفيذ الرمزي".
يقوم Jinq بتنفيذ كل تعليمات ويتتبع كل ما يتغير فيه جميع الآثار الجانبية أو التعليمات البرمجية أثناء حالة البرنامج. فيما يلي مخطط يوضح جميع الآثار الجانبية التي تم العثور عليها عندما تنفذ JINQ الأسطر الأربعة من التعليمات البرمجية في التنفيذ الرمزي.
مثال على التنفيذ الرمزي
في الشكل ، يمكنك أن ترى أنه بعد تشغيل التعليمات الأولى ، اكتشف Jinq آثار جانبية: تم تغيير المتغير D ، وتم استدعاء طريقة customer.getCountry (). نظرًا لأنه تنفيذ رمزي ، فإن المتغير D لا يعطي قيمة حقيقية للحقيقية ، مثل "الولايات المتحدة الأمريكية" أو "الدنمارك" ، والتي يتم تعيينها لقيمة رمزية لـ C.GetCountry ().
بعد تنفيذ كل هذه التعليمات ، تنقذ JINQ الآثار الجانبية. نظرًا لأن المتغير D و E متغيرات محلية ، سيتم تجاهل أي متغيرات بعد خروج الوظيفة ، بحيث يمكن تجاهل هذه الآثار الجانبية. يعلم Jinq أيضًا أن customer.getCountry () و string.equals () لا يعدل أي متغيرات أو يعرض أي إخراج ، بحيث يمكن تجاهل هذه الطرق. نتيجة لذلك ، يمكن أن تستنتج Jinq أن هذه الوظيفة ستنتج دورًا واحدًا فقط ، وسوف تعيد C.GetCountry ().
بمجرد أن يفهم Jinq الوظائف التي تم تمريرها إليها في طريقة () ، يمكنها مزج المعرفة باستعلام قاعدة البيانات وإعطاء استعلام جديد لقاعدة البيانات في مجموعة العملاء.
إنشاء استعلام قاعدة البيانات
هذه هي الطريقة التي تقوم بها Jinq بإنشاء استعلام قاعدة البيانات من الكود الخاص بك. يعني استخدام التنفيذ الرمزي أن هذه الطريقة قوية جدًا لأنماط التعليمات البرمجية المختلفة من مختلف مجمعي Java. إذا كان للرمز الذي واجهته JINQ الآثار الجانبية التي لا يمكن تحويلها إلى استعلام قاعدة بيانات ، فسيحافظ Jinq على الكود الخاص بك دون تغيير. نظرًا لأن كل شيء مكتوب برمز Java العادي ، يمكن لـ Jinq تشغيل هذه الكود مباشرة ، وسيقوم الرمز الخاص بك بإنتاج النتائج المتوقعة.
يجب أن يتيح لك مثال الترجمة البسيط هذا فهم كيفية استعلام الترجمة. يمكنك التأكد من أن هذه الخوارزميات يمكنها إنشاء استعلامات قاعدة البيانات بشكل صحيح من الكود الخاص بك.
احتمال جميل
آمل أن أتركك تتذوق طريقة جديدة لأعمال قاعدة البيانات التي قدمها Java 8 في Java. تتيح لك البرمجة الوظيفية التي تدعمها Java 8 كتابة رمز لقاعدة البيانات لكتابة رمز لمجموعة Java. من المأمول أن يتم توسيع واجهات برمجة تطبيقات قاعدة البيانات الحالية لدعم هذه الأنواع من الاستعلام.