English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC Statement,PreparedStatement وCallableStatement

بمجرد الحصول على الاتصال، يمكننا التفاعل مع قاعدة البيانات. تعريف واجهات JDBC Statement و CallableStatement و PreparedStatement يحددون الأساليب والمواصفات التي تتيح لك إرسال أوامر SQL أو PL/SQL واستقبال البيانات من قاعدة البيانات.

هم يحددون طرق تساعد في تعويض اختلاف أنواع البيانات بين أنواع البيانات المستخدمة في قاعدة البيانات باستخدام Java و SQL.

الجدول التالي يلخص استخدام كل واجهة لتحديد الواجهة التي يجب استخدامها.

الواجهة
يُنصح باستخدام
Statement

استخدمها للوصول الشامل إلى قاعدة البيانات. من المفيد جدًا عند استخدام جمل SQL ثابتة في الوقت الفعلي. لا يمكن للواجهة Statement استقبال معلمات.

PreparedStatement

استخدم هذا الخيار عندما تخطط لتكرار استخدام جمل SQL. يمكن للواجهة PreparedStatement استقبال معلمات إدخال في الوقت الفعلي.

CallableStatement

استخدم هذا الخيار عندما تريد الوصول إلىcedures المحفوظة في قاعدة البيانات. يمكن للواجهة CallableStatement أيضًا استقبال معلمات إدخال في الوقت الفعلي.

كائن Statement

إنشاء كائن Statement

قبل استخدام كائن Statement لتنفيذ جمل SQL، يجب إنشاء جملة SQL باستخدام طريقة createStatement() لكائن Connection، مثل المثال التالي -

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

بمجرد إنشاء كائن Statement، يمكنك استخدام واحد من طرق تنفيذ SQL الثلاثة.

  • boolean execute (String SQL)يسترجع قيمة منطقية true إذا كان يمكن استرجاع كائن ResultSet، وإلا يعود قيمة false. استخدم هذه الطريقة عند الحاجة إلى تنفيذ جمل SQL DDL باستخدام SQL الحقيقي.

  • int executeUpdate (String SQL)يسترجع عدد الأسطر المتأثرة من جملة SQL. يمكنك استخدام هذه الطريقة لت�行امر SQL التي ترغب في تأثيرها على عدد الأسطر، مثل جمل INSERT، UPDATE أو DELETE.

  • ResultSet executeQuery (String SQL)يسترجع كائن ResultSet. استخدم هذه الطريقة للحصول على مجموعة النتائج، مثل استخدام جملة SELECT.

إغلاق كائن Statement

مثل إغلاق كائن Connection لتحرير موارد قاعدة البيانات، لغرض مشابه، يجب أيضًا إغلاق كائن Statement.

يمكنك ببساطة استدعاء طريقة close() فقط. إذا تم إغلاق كائن Connection أولاً، فإنه سيغلق كائن Statement أيضًا. ولكن، يجب عليك دائمًا إغلاق كائن Statement بشكل واضح لضمان تنظيف صحيح.

Statement stmt = null;
try {
   stmt = conn.createStatement();
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

للتفاهم الأفضل، نوصي بتعلمدليل مثال Statement.

كائن PreparedStatement

يوسع واجهة PreparedStatement واجهة Statement، مما يوفر لك ميزات إضافية ويوفر بعض المزايا مقارنة بكائنات Statement العامية.

هذه الجملة تسمح لك بتقديم معلمات ديناميكية بسهولة.

إنشاء كائن PreparedStatement

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

جميع المعلمات في JDBC يتم إنشاؤها?الرموز تُمثل المعلمات، ويُسمى هذا الرمز معلمات الترقيم. يجب تقديم قيمة لكل معلمات الترقيم قبل تنفيذ جملة SQL.

هذهsetXXX()ستقوم الطريقة بربط القيمة مع المعلمات، حيثXXXيُمثل نوع البيانات لجافا الذي تريد ربط قيمته مع المعلمات المدخلة. إذا نسيت تقديم القيمة، سيتم إطلاق SQLException.

يُشار إلى كل معلمات الترقيم بواسطة موقعها الظاهري. يُمثل الرقم الأول موقع 1، والثاني موقع 2، وهكذا. يختلف هذا الأسلوب عن طريقة تحديد الفهرس في جافا التي تبدأ من 0.

يمكن استخدام جميع طرق كائنات Statement للاستفادة من قاعدة البيانات (a) execute ()، (b) executeQuery () و (c) executeUpdate () مع كائن PreparedStatement. ولكن تم تعديل هذه الطرق لاستخدام جمل SQL يمكنها استقبال معلمات.

إغلاق كائن PreparedStatement

مثلما يتم إغلاق كائن Statement، بسبب نفس السبب، يجب أيضًا إغلاق كائن PreparedStatement.

يمكنك القيام بذلك ببساطة باستخدام دالة close()، إذا قمت بإغلاق كائن Connection، سيتم أيضًا إغلاق كائن PreparedStatement. ولكن يجب عليك دائمًا إغلاق PreparedStatement بشكل واضح لضمان تنظيف صحيح.

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

للتفهم بشكل أفضل، دعونا نتعلممثال على كود PreparedStatement.

كائن CallableStatement

مثلما يتم إنشاء كائن Connection لإنشاء كائنات Statement و PreparedStatement، يتم إنشاء كائن CallableStatement أيضًا، والذي سيتم استخدامه لتنفيذ دعوات إلى إجراءات قاعدة البيانات.

إنشاء كائن CallableStatement

افترض أنك بحاجة إلى تنفيذ هذه عملية مخزنة Oracle التالية-

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

ملاحظة: لقد كتبنا هذه عملية المخزنة لـ Oracle، ولكننا نستخدم قاعدة بيانات MySQL، لذا دعونا نكتب عملية المخزنة نفسها لـ MySQL، كما يلي، لإنشائها في قاعدة بيانات EMP-

DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$
DELIMITER ;

هناك ثلاثة أنواع من المعلمات: IN، OUT و INOUT. كائن PreparedStatement يستخدم فقط المعلمات IN. يمكن لكائن CallableStatement استخدام جميع هذه الثلاثة.

هذه هي تعريف كل من

النطاقوصف
IN

المعلمات التي لا تعرف قيمتها عند إنشاء جملة SQL. ربط القيم إلى IN something باستخدام طريقة setXXX ().

OUT

القيمة المحددة من خلال المعلمات التي يقدمها جملة SQL. استخدم طريقة getXXX () للبحث عن القيمة من المعلمات.

INOUT

يقدم المعلمات التي تحتوي على قيم إدخال وخرج. يمكن ربط المتغيرات باستخدام طريقة setXXX () وتحديد القيم باستخدام طريقة getXXX ().

يظهر الفقرة التالية كيفية استخدام كائن Connection.prepareCall () لإنشاء كائن CallableStatement بناءً على عملية المخزنة السابقة.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

م変يبر SQL، تمثل عملية مخزنة تحتوي على معلمات استبدال.

يبدو CallableStatement كائن مشابه جدًا لـ PreparedStatement. يجب ربط القيم إلى جميع المعلمات قبل تنفيذ الجملة، وإلا ستحصل على SQLException.

إذا كان هناك متغير إدخال، يجب اتباع نفس القواعد والتقنيات المطبقة على كائن PreparedStatement؛ استخدم طريقة setXXX () المخصصة لربط نوع البيانات Java المحدد.

عند استخدام معاملات OUT وINOUT، يجب استخدام طريقة CallableStatement الإضافية registerOutParameter(). تربط طريقة registerOutParameter() نوع البيانات JDBC بنوع البيانات المتوقع من إجراء المعالجة.

بعد إجراء إجراء المعالجة، يمكنك استخدام طريقة getXXX() المناسبة للحصول على القيم من معاملات OUT. هذه الطريقة ستحول القيم النوعية SQL إلى نوع البيانات Java.

إغلاق كائن CallableStatement

مثل إغلاق كائنات Statement الأخرى، بسبب نفس الأسباب، يجب أن تغلق أيضًا كائن CallableStatement.

بكل بساطة يمكنك إغلاق طريقة close() فقط. إذا قمت أولاً بإغلاق كائن الاتصال، فإن ذلك سيغلق أيضًا كائن CallableStatement. ولكن يجب أن تغلق دائمًا CallableStatement بشكل صريح لضمان تنظيف صحيح.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt =conn.prepareCall(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

للتفهم بشكل أفضل، أنصح بدراسةكود مثال CallableStatement.