SQLJ
SQLJ هو اسم مؤقت لجهود دمج Java و SQL . وقد كان جهدًا مشتركًا بدأ حوالي عام 1997 من قبل مهندسين من IBM و Oracle و Compaq و Informix و Sybase و Cloudscape و Sun Microsystems .
يتألف هذا المعيار من ثلاثة أجزاء: 0 و1 و2. يصف الجزء 0 كيفية تضمين عبارات SQL في برامج Java. ويُعدّ الجزء 0 من SQLJ أساسًا للجزء 10 من معيار SQL:1999 ، المعروف أيضًا باسم SQL Object Language Bindings (SQL/OLB). [ 1 ] أما الجزآن 1 و2 من SQLJ فيصفان إمكانية استخدام فئات Java (الروتينات والأنواع) من عبارات SQL. ويُعدّ هذان الجزآن أساسًا للجزء 13 من معيار SQL، وهو SQL Routines and Types Using the Java Programming Language (SQL/JRT).
يُستخدم مصطلح "SQLJ" عادةً للإشارة إلى الجزء 0 من SQLJ فقط، وعادةً ما يتم مقارنته بوسائل أخرى لتضمين SQL في Java، مثل JDBC .
معايير ANSI و ISO
- الجزء 0 من SQLJ: ANSI X3.135.10-1998، "لغة قواعد البيانات SQL - الجزء 10: روابط لغة الكائنات (SQL/OLB)"
- الجزء الأول من SQLJ: ANSI NCITS 331.1-1999، "SQLJ - الجزء 1: إجراءات SQL باستخدام لغة برمجة Java"
- الجزء الثاني من SQLJ: ANSI NCITS 331.2-2000، "SQLJ—الجزء الثاني: أنواع SQL باستخدام لغة برمجة Java"
تم تحديث الجزء 0 ليتوافق مع JDBC 2.0، وتمت المصادقة عليه من قبل المنظمة الدولية للمقاييس (ISO) في عام 2000. دُمج الجزآن الأخيران عند تقديمهما إلى المنظمة الدولية للمقاييس. أُعيدت كتابة الجزء 2 بشكل جوهري لتقديمه إلى المنظمة الدولية للمقاييس، لأن نسخة ANSI لم تكن رسمية بما يكفي لتكون مواصفة، إذ كانت أقرب إلى أسلوب دليل المستخدم . تمت المصادقة على النسخة المدمجة في عام 2002. [ 1 ]
- ISO/IEC 9075-10:2000، تكنولوجيا المعلومات - لغات قواعد البيانات - SQL - الجزء 10: روابط لغة الكائنات (SQL/OLB)
- ISO/IEC 9075-13:2002، تكنولوجيا المعلومات - لغات قواعد البيانات - SQL - الجزء 13: إجراءات وأنواع SQL باستخدام لغة برمجة Java (SQL/JRT) .
الجزء 0 من SQLJ
نشأت مواصفات الجزء 0 من SQLJ إلى حد كبير من شركة أوراكل، التي قدمت أيضًا أول تطبيق مرجعي. [ 1 ]
فيما يلي، SQLJ هو مرادف لـ SQLJ الجزء 0.
بينما يوفر JDBC واجهة برمجة تطبيقات (API) ، فإن SQLJ عبارة عن امتداد للغة . لذا، يجب تشغيل البرامج التي تحتوي على SQLJ من خلال معالج مسبق (مترجم SQLJ) قبل تجميعها.
المزايا
تتضمن بعض مزايا SQLJ مقارنةً بـ JDBC ما يلي:
- تميل أوامر SQLJ إلى أن تكون أقصر من برامج JDBC المكافئة.
- يمكن التحقق من صحة بناء جملة SQL أثناء عملية الترجمة. كما يمكن التحقق بدقة من نتائج الاستعلام المُعادة.
- قد يُولّد المعالج المسبق استعلامات SQL ثابتة، والتي تُحقق أداءً أفضل من استعلامات SQL الديناميكية، لأن خطة الاستعلام تُنشأ أثناء تجميع البرنامج، وتُخزّن في قاعدة البيانات، ويُعاد استخدامها أثناء التشغيل. تضمن استعلامات SQL الثابتة استقرار خطة الوصول. يدعم IBM DB2 استخدام استعلامات SQL الثابتة في برامج SQLJ.
العيوب
- يتطلب SQLJ خطوة معالجة مسبقة.
- العديد من بيئات التطوير المتكاملة (IDEs) لا تدعم SQLJ.
- يفتقر SQLJ إلى دعم معظم أطر عمل الثبات الشائعة، مثل Hibernate .
- لقد أوقفت Oracle 18c (12.2) دعم SQLJ في قاعدة البيانات.
أمثلة
تقارن الأمثلة التالية بين بناء جملة SQLJ واستخدام JDBC.
| JDBC | SQLJ |
|---|---|
PreparedStatement stmt = conn.prepareStatement ( " SELECT LASTNAME" + " , FIRSTNME" + " , SALARY" + "FROM DSN8710.EMP" + " WHERE SALARY BETWEEN ? AND ?" ) ; stmt.setBigDecimal ( 1 , min ); stmt.setBigDecimal ( 2 , max ); ResultSet rs = stmt.executeQuery ( ); while ( rs.next ( ) ) { lastname = rs.getString ( 1 ) ; firstname = rs.getString ( 2 ) ; salary = rs.getBigDecimal ( 3 ) ; // طباعة الصف ... } rs.close ( ) ; stmt.close ( ) ; | #sql private static iterator EmployeeIterator ( String , String , BigDecimal ) ; ... EmployeeIterator iter ; #sql [ ctx ] iter = { SELECT LASTNAME , FIRSTNME , SALARY FROM DSN8710.EMP WHERE SALARY BETWEEN : min AND : max } ; do { #sql { FETCH : iter INTO : lastname , : firstname , : salary } ; // طباعة الصف ... } while ( ! iter.endFetch ( ) ) ; iter.close ( ) ; |
| JDBC | SQLJ |
|---|---|
PreparedStatement stmt = conn.prepareStatement ( " SELECT MAX (SALARY) , AVG(SALARY)" + " FROM DSN8710.EMP" ) ; rs = stmt.executeQuery (); if ( ! rs.next ()) { // خطأ - لم يتم العثور على صفوف } maxSalary = rs.getBigDecimal ( 1 ) ; avgSalary = rs.getBigDecimal ( 2 ) ; if ( rs.next ( ) ) { // خطأ - تم العثور على أكثر من صف واحد } rs.close ( ) ; stmt.close ( ) ; | # sql [ ctx ] { SELECT MAX ( SALARY ), AVG ( SALARY ) INTO : maxSalary , : avgSalary FROM DSN8710 . EMP } ; |
| JDBC | SQLJ |
|---|---|
stmt = conn.prepareStatement ( " INSERT INTO DSN8710.EMP " + "(EMPNO, FIRSTNME, MIDINIT , LASTNAME, HIREDATE, SALARY) " + " VALUES (?, ? , ? , ? , CURRENT DATE, ?)" ) ; stmt.setString ( 1 , empno ); stmt.setString ( 2 , firstname ) ; stmt.setString ( 3 , midinit ) ; stmt.setString ( 4 , lastname ) ; stmt.setBigDecimal ( 5 , salary ) ; stmt.executeUpdate ( ) ; stmt.close ( ) ; | # sql [ ctx ] { INSERT INTO DSN8710 . EMP ( EMPNO , FIRSTNME , MIDINIT , LASTNAME , HIREDATE , SALARY ) VALUES (: empno , : firstname , : midinit , : lastname , CURRENT DATE , : salary ) } ; |
انظر أيضاً
مراجع
للمزيد من القراءة
- كوني تسوي، التفكير في استخدام SQLJ لتطبيقات جافا الخاصة بك على DB2 V8 ، IBM developerworks، 13 فبراير 2003
- أوين كلاين، تطوير تطبيقاتك باستخدام SQLJ ، IBM developerworks، 16 ديسمبر 2004
- جيسون برايس (2001). برمجة جافا باستخدام أوراكل SQLJ . دار نشر أورايلي. رقم ISBN 978-0-596-00087-5.
روابط خارجية
- جافا (منصة برمجية)
- واجهات برمجة تطبيقات قواعد البيانات
- الوصول إلى بيانات SQL
