SQLJ
SQLJ عنوانی کاربردی برای تلاش برای ترکیب جاوا و SQL است. این تلاش مشترک در حدود سال 1997 توسط مهندسان IBM Oracle، Compaq ، Informix ، Sybase ، Cloudscape و Sun Microsystems بود.
از سه بخش 0، 1 و 2 تشکیل شده است. قسمت 0 تعبیه عبارات SQL در برنامه های جاوا را توصیف میکند .QLJ قسمت 0 اساس بخش 10 استاندارد SQL:1999 است که با نام SQL Object Language Bindings (SQL/OLB) شناخته می شود. بخشهای 1 و 2 SQLJ امکان معکوس استفاده از کلاسهای جاوا (روالها و انواع) از دستورات SQL را توضیح میدهد. بخشهای 1 و 2 مبنای قسمت 13 استاندارد SQL، روالها و انواع SQL با استفاده از زبان برنامهنویسی جاوا (SQL/JRT) هستند.
"SQLJ" معمولاً برای اشاره به بخش 0 SQLJ استفاده می شود، معمولاً زمانی که با سایر ابزارهای جاسازی SQL در جاوا، مانند JDBC ، در تضاد است.
استانداردهای ANSI و ISO
- SQLJ قسمت 0: ANSI X3.135.10-1998، "SQL زبان پایگاه داده—بخش 10: اتصالات زبان شی (SQL/OLB)"
- SQLJ قسمت 1: ANSI NCITS 331.1-1999، "SQLJ—Part 1: SQL Routines Using the Java Programming Language"
- SQLJ قسمت 2: ANSI NCITS 331.2-2000، "SQLJ—بخش 2: انواع SQL با استفاده از زبان برنامه نویسی جاوا"
قسمت 0 برای سازگاری JDBC 2.0 به روز شد و در سال 2000 توسط ISO تأیید شد. دو بخش آخر هنگام ارسال به ISO با هم ترکیب شدند. قسمت 2 اساساً برای ارسال ISO بازنویسی شد زیرا نسخه ANSI به اندازه کافی رسمی برای یک مشخصات نبود و به سبک یک کتابچه راهنمای کاربر نزدیکتر بود. نسخه ترکیبی در سال 2002 تصویب شد.
- ISO/IEC 9075-10:2000، فناوری اطلاعات-زبان های پایگاه داده-SQL-بخش 10: پیوندهای زبان شی (SQL/OLB)
- ISO/IEC 9075-13:2002، فناوری اطلاعات-زبان های پایگاه داده-SQL-بخش 13: روال ها و انواع SQL با استفاده از زبان برنامه نویسی جاوا (SQL/JRT) .
SQLJ قسمت 0
مشخصات بخش 0 SQLJ عمدتاً از اوراکل نشات گرفته است که اولین پیاده سازی مرجع را نیز ارائه کرد.
در زیر SQLJ مترادف SQLJ قسمت 0 است.
در حالی که JDBC یک API ارائه می دهد، SQLJ از یک پسوند زبان تشکیل شده است. بنابراین برنامه های حاوی SQLJ باید قبل از کامپایل شدن از طریق یک پیش پردازنده (مترجم SQLJ) اجرا شوند.
مزایا:
برخی از مزایای SQLJ نسبت به JDBC عبارتند از:
- دستورات SQLJ نسبت به برنامه های JDBC معادل کوتاه تر هستند.
- دستورات SQL را می توان در زمان کامپایل بررسی کرد. نتایج پرس و جو برگشتی را نیز می توان به شدت بررسی کرد.
- پیش پردازنده ممکن است SQL ثابت تولید کند که بهتر از SQL پویا عمل می کند زیرا کویری در زمان کامپایل برنامه ایجاد می شود، در پایگاه داده ذخیره می شود و در زمان اجرا مجددا استفاده می شود. Static SQL می تواند ثبات طرح دسترسی را تضمین کند. IBM DB2 از استفاده Static SQL در برنامه های SQLJ پشتیبانی می کند.
معایب:
- SQLJ به یک مرحله پیش پردازش نیاز دارد.
- بسیاری از IDE ها از 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); // Print row... } 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 }; // Print row... } 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()) { // Error—no rows found } maxSalary = rs.getBigDecimal(1); avgSalary = rs.getBigDecimal(2); if (rs.next()) { // Error—more than one row found } 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) }; |
همچنین ببینید
- Embedded SQL
- Language Integrated Query (LINQ)
منابع
Jim Melton (2003). Advanced SQL: 1999. Morgan Kaufmann. pp. 352-364. ISBN 978-1-55860-677-7.
بیشتر خواندن
- Connie Tsui, Considering SQLJ for Your DB2 V8 Java Applications, IBM developerworks, 13 Feb 2003
- Owen Cline, Develop your applications using SQLJ, IBM developerworks, 16 Dec 2004
- Jason Price (2001). Java Programming With Oracle SQLJ. O'Reilly Media. ISBN 978-0-596-00087-5.