اتصال قاعدة بيانات جافا

تُعدّ JDBC ( Java Database Connectivity ) واجهة برمجة تطبيقات (API) للغة برمجة Java ، تُحدد كيفية وصول العميل إلى قاعدة البيانات . وهي تقنية للوصول إلى البيانات مبنية على Java، وتُستخدم للاتصال بقواعد بيانات Java. تُعدّ JDBC جزءًا من منصة Java Standard Edition من شركة Oracle . توفر JDBC طرقًا للاستعلام عن البيانات وتحديثها في قاعدة البيانات، وهي مُصممة خصيصًا لقواعد البيانات العلائقية . يُمكّن جسر JDBC-to- ODBC من الاتصال بأي مصدر بيانات يُمكن الوصول إليه عبر ODBC في بيئة مضيف آلة Java الافتراضية (JVM).

التاريخ والتنفيذ

أصدرت شركة Sun Microsystems برنامج JDBC كجزء من Java Development Kit (JDK) 1.1 في 19 فبراير 1997. [ 1 ] ومنذ ذلك الحين أصبح جزءًا من Java Platform, Standard Edition (Java SE).

تُضمَّن فئات JDBC في حزمة Javajava.sql ، javax.sqlبالإضافة إلى بعض الفئات الأخرى الموجودة في أماكن أخرى. ويتم تصدير كل ما يتعلق بـ JDBC من خلال الوحدة النمطيةjava.sql .

ابتداءً من الإصدار 3.1، تم تطوير JDBC ضمن عملية مجتمع جافا . يحدد JSR 54 مواصفات JDBC 3.0 (المضمنة في J2SE 1.4)، ويحدد JSR 114 إضافات JDBC Rowset (لـ javax.sql.RowSet)، بينما يمثل JSR 221 مواصفات JDBC 4.0 (المضمنة في Java SE 6). [ 2 ]

JDBC 4.1، تم تحديده بواسطة إصدار الصيانة 1 من JSR 221 [ 3 ] وهو مضمن في Java SE 7. [ 4 ]

JDBC 4.2، تم تحديده بواسطة إصدار الصيانة 2 من JSR 221 [ 5 ] وهو مضمن في Java SE 8. [ 6 ]

تم تحديد أحدث إصدار، JDBC 4.3، بواسطة إصدار الصيانة 3 من JSR 221 [ 7 ] وهو مضمن في Java SE 9. [ 8 ]

إصدارات JDBC
إصدار JDBCإصدار جافانوع الإصدارتاريخ الافراج عنه
1.1JDK 1.1رئيسي1997-02-19. [ 1 ]
3.0J2SE 1.4رئيسي2002-05-09
4.0جافا إس إي 6رئيسي11-12-2006
4.1جافا إس إي 7صيانة2011-10-13
4.2جافا إس إي 8صيانة2014-03-04
4.3جافا إس إي 9صيانة2017-09-21

الوظائف

أنواع قواعد البيانات المضيفة التي يمكن لـ Java التحويل إليها باستخدام دالة
نوع بيانات أوراكلsetXXX()طُرق
CHARsetString()
VARCHAR2setString()
NUMBERsetBigDecimal()
setBoolean()
setByte()
setShort()
setInt()
setLong()
setFloat()
setDouble()
INTEGERsetInt()
FLOATsetDouble()
CLOBsetClob()
BLOBsetBlob()
RAWsetBytes()
LONGRAWsetBytes()
DATEsetDate()
setTime()
setTimestamp()

بما أن JDBC عبارة عن مجموعة من تعريفات ومواصفات الواجهات، فإنه يسمح بوجود تطبيقات متعددة لهذه الواجهات واستخدامها من قِبل التطبيق نفسه أثناء التشغيل. توفر واجهة برمجة التطبيقات (API) آلية لتحميل حزم Java الصحيحة ديناميكيًا وتسجيلها لدى مدير برامج تشغيل JDBC java.sql.DriverManager. java.sql.DriverManagerويُستخدم هذا المدير كأداة java.sql.Connectionلإنشاء اتصالات JDBC.

تدعم اتصالات JDBC إنشاء وتنفيذ العبارات. تدعم اتصالات JDBC عبارات التحديث مثل عبارات SQL CREATE و INSERT و UPDATE و DELETE ، أو عبارات الاستعلام مثل SELECT . بالإضافة إلى ذلك، يمكن استدعاء الإجراءات المخزنة من خلال اتصال JDBC. يُمثل JDBC العبارات باستخدام إحدى الفئات التالية:

  • Statement يتم java.sql.Statementإرسالها إلى خادم قاعدة البيانات في كل مرة. بعبارة أخرى، java.sql.Statementيتم تنفيذ الطرق باستخدام عبارات SQL للحصول على java.sql.ResultSetكائن يحتوي على البيانات. [ 9 ]
  • PreparedStatementjava.sql.PreparedStatement هي واجهة فرعية للواجهة الرئيسية java.sql.Statement. [ 9 ] يتم تخزين العبارة مؤقتًا، ثم يتم تحديد مسار التنفيذ مسبقًا على خادم قاعدة البيانات، مما يسمح بتنفيذها عدة مرات بكفاءة. [ 9 ]java.sql.PreparedStatement تُستخدم لتنفيذ عبارات SQL المُجمَّعة مسبقًا. [ 9 ] يؤدي تشغيل العبارات المُجمَّعة مسبقًا إلى زيادة كفاءة تنفيذ العبارات وأدائها. java.sql.PreparedStatementغالبًا ما تُستخدم هذه الواجهة للعبارات الديناميكية حيث يجب تمرير بعض معلمات الإدخال إلى قاعدة البيانات المستهدفة. [ 10 ] تسمح هذه java.sql.PreparedStatementالواجهة للاستعلام الديناميكي بالتغير بناءً على معلمات الاستعلام. [ 11 ]
  • CallableStatementjava.sql.CallableStatement هي واجهة فرعية للواجهة الرئيسية java.sql.Statement. [ 11 ] تُستخدم لتنفيذ الإجراءات المخزنة على قاعدة البيانات. [ 11 ] [ 12 ] يجب تمرير كل من معلمات الإدخال والإخراج إلى قاعدة البيانات لتنفيذ الإجراءات المخزنة. [ 13 ]

تُعيد عبارات التحديث، مثل INSERT` UPDATEupdate` و` DELETEupdate`، عدد التحديثات الذي يُشير إلى عدد الصفوف المتأثرة في قاعدة البيانات كرقم صحيح. [ 13 ] ولا تُعيد هذه العبارات أي معلومات أخرى.

تُعيد عبارات الاستعلام مجموعة نتائج صفوف JDBC. تُستخدم مجموعة نتائج الصفوف للتنقل بين عناصر مجموعة النتائج . يتم استرجاع الأعمدة الفردية في الصف إما بالاسم أو برقم العمود. قد تحتوي مجموعة النتائج على أي عدد من الصفوف. تتضمن مجموعة نتائج الصفوف بيانات وصفية تُحدد أسماء الأعمدة وأنواعها.

يوجد امتداد لواجهة برمجة تطبيقات JDBC الأساسية في javax.sql.

غالبًا ما تتم إدارة اتصالات JDBC عبر مجموعة اتصالات بدلاً من الحصول عليها مباشرة من برنامج التشغيل، مثل [ 14 ]javax.sql.DataSource .

أمثلة

عندما يحتاج تطبيق جافا إلى اتصال بقاعدة بيانات ، تُستخدم إحدى DriverManager.getConnection()الطرق لإنشاء اتصال JDBC java.sql.Connection. يعتمد عنوان URL المستخدم على قاعدة البيانات وبرنامج تشغيل JDBC المُستخدمين. يبدأ دائمًا بالبروتوكول jdbc:، أما باقي التفاصيل فتعتمد على مُورّد قاعدة البيانات.

استيراد java.sql.Connection ؛ استيراد java.sql.DriverManager ؛ استيراد java.sql.SQLException ؛Connection conn = DriverManager.getConnection ( " jdbc :somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" ) ;حاول { // استخدم الاتصال هنا } أخيرًا { حاول { // أغلق الاتصال بعد الانتهاء conn.close ( ); } catch ( SQLException e ) { // انشر الاستثناء الأصلي، وليس الاستثناء الذي تم التقاطه هنا logger.warn ( " تعذر إغلاق اتصال JDBC" , e ) ; } }

ابتداءً من Java SE 7، يمكن استخدام عبارة try-with-resources في Java لتبسيط الكود أعلاه:

استيراد java.sql.Connection ؛ استيراد java.sql.DriverManager ؛try ( Connection conn = DriverManager.getConnection ( " jdbc :somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { // استخدم الاتصال هنا } // يتم استدعاء conn.close() تلقائيًا // سيتم إغلاق الاتصال تلقائيًا بعد الخروج من كتلة try

بمجرد إنشاء الاتصال، java.sql.Statementيمكن إنشاء...

استيراد java.sql.Statement ؛try ( Statement stmt = conn . createStatement ()) { stmt . executeUpdate ( "INSERT INTO MyTable(name) VALUES ('my name')" ); }

لاحظ أن java.sql.Connectionعمليات s و java.sql.Statements و java.sql.ResultSets غالبًا ما تستهلك موارد نظام التشغيل، مثل المقابس أو مُعرّفات الملفات . في حالة عمليات java.sql.Connections مع خوادم قواعد البيانات البعيدة، تُستهلك موارد إضافية على الخادم، مثل مؤشرات عمليات s المفتوحة حاليًا java.sql.ResultSet. من الضروري close()لأي كائن JDBC إيقاف تشغيله فور انتهاء دوره؛ ولا ينبغي الاعتماد على جمع البيانات المهملة . يُعدّ بناء try-with-resources المذكور أعلاه نمطًا برمجيًا يُغني عن ذلك.

يتم استرجاع البيانات من قاعدة البيانات باستخدام آلية استعلام قاعدة البيانات. يوضح المثال أدناه إنشاء عبارة وتنفيذ استعلام.

استيراد java.sql.ResultSet ؛ استيراد java.sql.Statement ؛try ( Statement stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery ( " SELECT * FROM MyTable" ) ) { while ( rs.next ( )) { int numColumns = rs.getMetaData ( ) . getColumnCount ( ) ; for ( int i = 1 ; i <= numColumns ; i ++ ) { // تبدأ أرقام الأعمدة من 1. // كما توجد العديد من الطرق في مجموعة النتائج لإرجاع // العمود بنوع معين. راجع وثائق Sun // للاطلاع على قائمة التحويلات الصالحة. System.out.printf ( "COLUMN %d = %s%n" , i , rs.getObject ( i )) ; } } }

الكود التالي هو مثال على java.sql.PreparedStatementاستعلام يستخدم connفئة من المثال الأول:

استيراد java.sql.PreparedStatement ؛ استيراد java.sql.ResultSet ؛try ( PreparedStatement ps = conn.prepareStatement ( " SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // في عبارة SQL التي يتم إعدادها، كل علامة استفهام هي عنصر نائب // يجب استبدالها بقيمة تُحددها من خلال استدعاء دالة "set". // يستدعي استدعاءا الدالتين التاليتين العنصرين النائبين؛ الأول // يُستبدل بقيمة نصية، والثاني بقيمة عددية. ps.setString ( 1 , "Poor Yorick" ); ps.setInt ( 2 , 8008 ) ;// تُشير مجموعة النتائج، rs، إلى نتيجة تنفيذ عبارة SQL. // في كل مرة تستدعي فيها rs.next()، يتم تحريك مؤشر صف داخلي، أو مؤشر، // إلى الصف التالي من النتيجة. يكون المؤشر في البداية // قبل الصف الأول. try ( ResultSet rs = ps.executeQuery ()) { while ( rs.next ()) { for (int i = 1 ; i < = rs.getMetaData ( ) . getColumnCount ( ) ; i ++ ) { // تبدأ أرقام الأعمدة من 1. // كما توجد العديد من الطرق في مجموعة النتائج لإرجاع // العمود بنوع معين. راجع وثائق Sun // للاطلاع على قائمة التحويلات الصالحة. System.out.printf ( " COLUMN %d = %s% n " , i , rs.getObject ( i ) ) ; } } } }

في حال فشل عملية قاعدة البيانات، يُصدر JDBC استثناءً SQLException. عادةً ما يكون من الصعب جدًا التعافي من هذا الخطأ، باستثناء تسجيله بأكبر قدر ممكن من التفاصيل. يُوصى java.sql.SQLExceptionبتحويل هذا الاستثناء إلى استثناء في نطاق التطبيق (استثناء غير مُعالَج) يؤدي في النهاية إلى التراجع عن المعاملة وإشعار المستخدم.

الكود التالي هو مثال على معاملة قاعدة بيانات :

استيراد java.sql.SQLException ؛boolean autoCommitDefault = conn.getAutoCommit ( ) ; try { conn.setAutoCommit ( false ) ;// تنفيذ العبارات على الاتصال هنا بشكل معامليconn.commit (); } catch ( SQLException e ) { try { conn.rollback ( ); } catch ( Throwable e ) { logger.warn ( " تعذر التراجع عن العملية" , e ) ; } throw e ; } finally { try { conn.setAutoCommit ( autoCommitDefault ); } catch ( Throwable e ) { logger.warn ( " تعذر استعادة إعداد الالتزام التلقائي " , e ) ; } }

للحصول على مثال على java.sql.CallableStatement(استدعاء الإجراءات المخزنة في قاعدة البيانات)، راجع وثائق دليل واجهة برمجة تطبيقات JDBC .

package org.wikipedia.examples ;استيراد java.sql.Connection ؛ استيراد java.sql.DriverManager ؛ استيراد java.sql.Statement ؛public class DatabaseExample { private static final String DB_URL = "jdbc:mysql://localhost/mydb" ;public static void main ( String [] args ) { try { Class . forName ( "com.mysql.jdbc.Driver" );Connection conn = DriverManager.getConnection ( DB_URL , "root" , "root" ); Statement stmt = conn.createStatement (); String sql = " INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt.executeUpdate ( sql ) ; System.out.println ( " تم إدخال السجلات في الجدول..." ) ; } catch ( SQLException e ) { System.err.printf ( " حدث خطأ في SQL: %s%n" , e.getMessage ( ) ) ; } catch ( Exception e ) { System.err.println ( " حدث خطأ غير معروف . " ) ; e.printStackTrace ( ) ; } } }

برامج تشغيل JDBC

برامج تشغيل JDBC هي محولات من جانب العميل (مثبتة على جهاز العميل، وليس على الخادم) تقوم بتحويل الطلبات من برامج Java إلى بروتوكول يمكن لنظام إدارة قواعد البيانات فهمه.

الأنواع

توفر برامج التشغيل التجارية والمجانية إمكانية الاتصال بمعظم خوادم قواعد البيانات العلائقية. وتنقسم هذه البرامج إلى أحد الأنواع التالية:

  • النوع 1 الذي يستدعي الكود الأصلي لبرنامج تشغيل ODBC المتوفر محليًا. (ملاحظة: في JDBC 4.2، تمت إزالة جسر JDBC-ODBC [ 15 ] )
  • النوع الثاني يستدعي مكتبة بائع قاعدة البيانات الأصلية من جانب العميل. ثم يتواصل هذا الكود مع قاعدة البيانات عبر الشبكة.
  • النوع 3 ، برنامج التشغيل المكتوب بلغة جافا النقية والذي يتحدث مع البرامج الوسيطة من جانب الخادم والتي تتحدث بدورها مع قاعدة البيانات.
  • النوع 4 ، برنامج التشغيل المكتوب بلغة جافا النقية والذي يستخدم بروتوكول قاعدة البيانات الأصلي.

Note also a type called an internal JDBC driver - a driver embedded with JRE in Java-enabled SQL databases. It is used for Java stored procedures. This does not fit into the classification scheme above, although it would likely resemble either a type 2 or type 4 driver (depending on whether the database itself is implemented in Java or not). An example of this is the KPRB (Kernel Program Bundled) driver[16] supplied with Oracle RDBMS. "jdbc:default:connection" offers a relatively standard way of making such a connection (at least the Oracle database and Apache Derby support it). However, in the case of an internal JDBC driver, the JDBC client actually runs as part of the database being accessed, and so can access data directly rather than through network protocols.

Sources

  • Oracle provides a list of some JDBC drivers and vendors
  • Simba Technologies ships an SDK for building custom JDBC Drivers for any custom/proprietary relational data source
  • CData Software ships type 4 JDBC Drivers for various applications, databases, and Web APIs.[17]
  • DataDirect Technologies provides a comprehensive suite of fast Type 4 JDBC drivers for all major database they advertise as Type 5[18]
  • IDS Software provides a Type 3 JDBC driver for concurrent access to all major databases. Supported features include resultset caching, SSL encryption, custom data source, dbShield
  • JDBaccess is a Java persistence library for MySQL and Oracle which defines major database access operations in an easy usable API above JDBC
  • JNetDirect provides a suite of fully Sun J2EE certified high-performance JDBC drivers.
  • JDBCR4 is a service program written by Scott Klement to allow access to JDBC from RPG on the IBM i.[19]
  • HSQLDB is a RDBMS with a JDBC driver and is available under a BSD license.
  • SchemaCrawler[20] is an open source API that leverages JDBC, and makes database metadata available as plain old Java objects (POJOs)

See also

Citations

  1. ١ ٢ "أصدرت صن JDK 1.1 - يتضمن Javabeans" . www.sun.com . صن مايكروسيستمز . ١٩ فبراير ١٩٩٧. مؤرشف من الأصل في ١٠ فبراير ٢٠٠٨. تم الاسترجاع في ١٥ فبراير ٢٠١٠. ١٩ فبراير ١٩٩٧ - JDK 1.1 [...] متوفر الآن [...]. يتضمن هذا الإصدار من JDK ما يلي: [...] ميزات جديدة قوية، بما في ذلك JDBC للاتصال بقواعد البيانات.
  2. مواصفات واجهة برمجة تطبيقات JDBC الإصدار: 4.0 .
  3. "برنامج عملية مجتمع جافا (SM) - communityprocess - mrel" . jcp.org . تم الاطلاع عليه في 22 مارس 2018 .
  4. "JDBC 4.1" . docs.oracle.com . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
  5. "برنامج عملية مجتمع جافا (SM) - communityprocess - mrel" . jcp.org . تم الاطلاع عليه في 22 مارس 2018 .
  6. "JDBC 4.2" . docs.oracle.com . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
  7. "برنامج عملية مجتمع جافا (SM) - communityprocess - mrel" . jcp.org . تم الاطلاع عليه في 22 مارس 2018 .
  8. "java.sql (Java SE 9 & JDK 9)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
  9. 1 2 3 4 باي 2022 ، ص. 74.
  10. باي 2022 ، ص 122-124، §4.2.3.5 المزيد حول أساليب التنفيذ.
  11. 1 2 3 باي 2022 ، ص 72-74 ، §3.2 مكونات وبنية JDBC.
  12. هورستمان 2022 ، §5.5.3 الهروب من SQL.
  13. 1 2 باي 2022 ، ص 122-124 ، §4.2.3.5 مكونات وبنية JDBC.
  14. باي 2022 ، ص 83، §3.5.1 مصدر بيانات JDBC.
  15. "Java JDBC API" . docs.oracle.com . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
  16. غرينوالد، ريك؛ ستاكوفياك، روبرت؛ ستيرن، جوناثان (1999). أساسيات أوراكل: قاعدة بيانات أوراكل 10g . سلسلة الأساسيات ( الطبعة الثالثة). سيباستوبول، كاليفورنيا: أورايلي ميديا، إنك. (نُشر عام 2004). ص 318. ISBN   9780596005856تم الاطلاع عليه في 3 نوفمبر 2016. يستخدم برنامج تشغيل JDBC الموجود في قاعدة البيانات (JDBC KPRB) [:] إصدار JDBC KPRB (Kernel Program Bundled) للوصول إلى SQL على نفس الخادم.
  17. "برامج تشغيل JDBC - شركة CData Software" . شركة CData Software . تم الاطلاع عليه بتاريخ 22 مارس 2018 .
  18. "برنامج تشغيل JDBC من النوع 5 الجديد - اتصال DataDirect" . 
  19. "الوصول إلى قواعد البيانات الخارجية من لغة RPG باستخدام JDBCR4: جوهر الموضوع" . 28 يونيو 2012. تم الاطلاع عليه بتاريخ 12 أبريل 2016 .
  20. سواله فاتحي. "SchemaCrawler" . GitHub .

مراجع