مثلما يقوم كائن اتصال بإنشاء عبارة وكائنات إعداد ، فإنه ينشئ أيضًا كائنات clopablestatement التي سيتم استخدامها لتنفيذ الإجراء المخزن قاعدة البيانات.
قم بإنشاء كائن callablestatement:
افترض ، يجب تنفيذ الإجراءات المخزنة Oracle التالية:
إنشاء أو استبدال الإجراء getempname (EMP_ID في الرقم ، EMP_FIRST OUT VARCHAR) حدد أولاً في EMP_FIRST من الموظفين حيث id = emp_id ؛ end ؛
ملاحظة: لقد كتب ما سبق إجراءات مخزنة Oracle ، لكننا نستخدم قاعدة بيانات MySQL ، ونكتب نفس الإجراءات المخزنة لـ MySQL على النحو التالي ، وإنشائها في قاعدة بيانات EMP:
SELIMITER $$ إسقاط الإجراء إذا كان موجودًا "emp`.`getempname` $ $$ إنشاء إجراء" emp`.`getempname` (في emp_id int ، out emp_first varchar (255)) تبدأ الاختيار أولاً في emp_first من الموظفين حيث id = emp_id ؛ end $$ delimiter ؛
هناك ثلاثة أنواع من المعلمات: في ، خارج و inout. كائن reparedStatement يستخدم فقط في المعلمة. يمكن لكائن callablestatement استخدام الثلاثة.
فيما يلي كل تعريف:
يوضح مقتطف الكود التالي كيفية إنشاء مثيل لكائن clopablestatement استنادًا إلى الإجراء المخزن أعلاه باستخدام connection.preparecall () طريقة:
callablestatement cstmt = null ؛ حاول {String sql = "{call getempname (؟ ،؟)}" ؛ CSTMT = conn.preparecall (SQL) ؛ . . .} catch (sqlexception e) {. . .} أخيراً { . . .}يمثل SQL لمتغير السلسلة إجراءً مخزنًا ، باستخدام أصحاب المعلمة النائبة.
استخدام كائن clopablestatement يستخدم كائن reparedstatement. يجب أن تكون القيمة مرتبطة بجميع المعلمات قبل تنفيذ البيان ، وإلا سيتم استلام sqlexception.
إذا كانت هناك معلمة ، فما عليك سوى اتباع نفس القواعد والحيل التي تنطبق على كائن المعدة ؛ استخدم طريقة setxxx () المقابلة لنوع بيانات Java ليكون ملزماً.
عند استخدام المعلمات OUT و INOUT ، يجب استخدام RecordOutParameter () باستخدام طريقة callablestatement الإضافية. registerOutParameter () الطريقة JDBC نوع البيانات المرتبطة بالإجراء المخزن الذي تم إرجاعه بواسطة نوع البيانات.
بمجرد استدعاء الإجراء المخزن ، يتم استرداد القيمة باستخدام معلمات الإخراج لطريقة getxxx (). هذه الطريقة يلقي قيم نوع SQL لاسترداد أنواع بيانات Java.
أغلق كائن Callablestatement:
تمامًا مثل إغلاق كائنات العبارات الأخرى ، يجب أيضًا إغلاق كائن clopablestatement لنفس السبب.
ستؤدي مكالمة بسيطة إلى طريقة Close () للمهمة. إذا تم إغلاق كائن الاتصال أولاً ، فسيتم إغلاق كائن clopablestatement أيضًا. ومع ذلك ، يجب دائمًا إغلاق كائن clopablestatement بشكل صريح لضمان التخليص الصحيح.
callablestatement cstmt = null ؛ حاول {String sql = "{call getempname (؟ ،؟)}" ؛ CSTMT = conn.preparecall (SQL) ؛ . . .} catch (sqlexception e) {. . .} أخيرًا {cstmt.close () ؛} ملاحظة: مثيل كائن Collablestatement
فيما يلي مثال على إجراء MySQL المخزّن باستخدام callablestatement جنبًا إلى جنب مع getempname () التالي:
يرجى التأكد من إنشاء الإجراء المخزن في قاعدة بيانات EMP. يمكن القيام به باستخدام متصفح الاستعلام MySQL.
SELIMITER $$ إسقاط الإجراء إذا كان موجودًا "emp`.`getempname` $ $$ إنشاء إجراء" emp`.`getempname` (في emp_id int ، out emp_first varchar (255)) تبدأ الاختيار أولاً في emp_first من الموظفين حيث id = emp_id ؛ end $$ delimiter ؛
تم كتابة رمز البرنامج النصي هذا بناءً على تثبيت البيئة وقاعدة البيانات في الفصل السابق.
انسخ المثال التالي jdbcexample.java ، ترجمة وتشغيله كما هو موضح أدناه:
// الخطوة 1. استيراد PackagesImport java.sql.*؛ الفئة العامة jdbcexample {// jdbc اسم برنامج التشغيل و url قاعدة البيانات static static jdbc_driver = "com.mysql.jdbc.driver" ؛ Static Final String db_url = "jdbc: mysql: // localhost/emp" ؛ // بيانات اعتماد قاعدة البيانات user static final user = "username" ؛ Static Final String Pass = "Password" ؛ public static void main (string [] args) {connection conn = null ؛ callablesTatement stmt = null ؛ حاول {// الخطوة 2: تسجيل jdbc class.forname ("com.mysql.jdbc.driver") ؛ // الخطوة 3: فتح نظام اتصال. out.println ("الاتصال بقاعدة البيانات ...") ؛ conn = drivermanager.getConnection (db_url ، user ، pass) ؛ // الخطوة 4: تنفيذ نظام Query.out.println ("إنشاء بيان ...") ؛ String sql = "{call getempname (؟ ،؟)}" ؛ stmt = conn.preparecall (sql) ؛ // ربط في المعلمة أولاً ، ثم ربط المعلمة int empid = 102 ؛ stmt.setint (1 ، Empid) ؛ // هذا من شأنه تعيين المعرف على أنه 102 // لأن المعلمة الثانية خارج ، لذا سجلها stmt.registerOutParameter (2 ، java.sql.types.varchar) ؛ // استخدم طريقة تنفيذ لتشغيل الإجراء المخزن. System.out.println ("تنفيذ الإجراء المخزن ...") ؛ stmt.execute () ؛ // استرداد اسم الموظف باستخدام getxxx method string empname = stmt.getString (2) ؛ System.out.println ("اسم EMP with ID:" + Empid + "IS" + Empname) ؛ stmt.close () ؛ conn.close () ؛ } catch (sqlexception se) {// تعامل مع الأخطاء لـ jdbc se.printstacktrace () ؛ } catch (استثناء e) {// التعامل مع أخطاء class.forname e.printstacktrace () ؛ } أخيرًا {// أخيرًا كتلة المستخدمة لإغلاق الموارد ، جرب {if (stmt! = null) stmt.close () ؛ } catch (sqlexception se2) {} // لا شيء يمكننا القيام به {if (conn! = null) conn.close () ؛ } catch (sqlexception se) {se.printstacktrace () ؛ } // end أخيرًا حاول} // end try system.out.println ("وداعا!") ؛ } // end main} // end jdbcexampleالآن تجميع المثال أعلاه على النحو التالي:
C:> Javac jdbcexample.java
عند تشغيل jdbcexample ، فإنه ينتج النتائج التالية:
C:> Java jdbcexample
الاتصال بقاعدة البيانات ... إنشاء بيان ... تنفيذ الإجراء المخزن ... اسم EMP بالمعرف: 102 هو Zaidgoodbye!
بناء جملة SQL Escape SQL من JDBC:
يتيح Segring Syntax مرونة استخدام ميزات معينة لقاعدة البيانات باستخدام أساليب وخصائص JDBC القياسية.
تنسيق جملة SQL Escape General كما يلي:
{الكلمة الرئيسية 'المعلمات'}فيما يلي التالي الذي سيتم العثور عليه مفيدًا للغاية أثناء القيام بذلك في برمجة JDBC:
D ، T ، TS الكلمات الرئيسية:
أنها تساعد في تحديد نص ختم التاريخ والوقت والوقت. كما تعلمون ، لا يوجد نظامان لإدارة قاعدة البيانات يعتمدان على الوقت والتاريخ بنفس الطريقة. يخبر بناء جملة الهروب هذا السائق بتنسيق أو تاريخ أو الوقت لتقديم قاعدة البيانات المستهدفة. مثال التنفيذ:
{d 'Yyyy-Mm-Dd'}حيث yyyy = سنة ، مم = شهر ، dd = اليوم. باستخدام هذا الجملة {D '2009-09-03'} هو 9 مارس 2009.
فيما يلي مثال بسيط على كيفية إدراج جدول تاريخ:
// قم بإنشاء كائن بيانات = conn.createstatement () ؛ // إدراج بيانات ==> معرف ، الاسم الأول ، الاسم الأخير ، dobstring sql = "insert في قيم الطلاب" + "(100 ، 'Zara' ، 'ali' ، {d '2001-12-16'})" ؛ stmt.executeupdate (sql) ؛وبالمثل ، يمكن استخدام أحد الجملة التالية ، سواء كان T أو TS:
{t 'hh: mm: ss'}حيث hh = ساعات ، مم = دقائق ، ss = ثواني. باستخدام هذا بناء الجملة {t '13: 30: 29 '} هو 1:30 مساءً 29 مساءً.
{ts 'yyyy-mm-dd hh: mm: ss'}هذه هي بناء الجملة "D" و "T" أعلاه لتمثيل بناء جملة الطابع الزمني.
الكلمات الرئيسية الهروب:
تحدد هذه الكلمة الرئيسية الحرف الذي هرب المستخدم في الفقرة. مفيد عند استخدام SQL Wildcard ٪ حيث تتم مطابقة الصفر أو أكثر من الأحرف. على سبيل المثال:
String SQL = "SELECT SYMBORT من MATHSYMBOLS حيث مثل الرمز"/٪ "{Escape"} "؛ stmt.execute (sql) ؛إذا كنت تستخدم حرف Backslash () كحرف Escape ، فيجب عليك أيضًا استخدام حرفيين للاضترابين في Java String Miterial ، لأن backslash هو أيضًا حرف Java Escape.
الكلمات الرئيسية FN:
تعني هذه الكلمة الرئيسية استخدام وظائف العددية في DBMS. على سبيل المثال ، يمكنك استخدام وظيفة طول SQL لحساب طول سلسلة GE:
{طول fn ('Hello World')}سيعود هذا 11 ، طول السلسلة "Hello World". .
الاتصال بالكلمات الرئيسية:
يتم استخدام هذه الكلمة الرئيسية لاستدعاء الإجراءات المخزنة. على سبيل المثال ، بالنسبة لإجراء تخزين ، تحتاج إلى معلمة في المعلمة ، استخدم بناء الجملة التالي:
{call my_procedure (؟)} ؛لإجراء تخزين ، مطلوب في المعلمة ويتم إرجاع المعلمة الخارجية ، باستخدام بناء الجملة التالي:
{؟ = اتصل my_procedure (؟)} ؛ الكلمات الرئيسية OJ:
يتم استخدام هذه الكلمة الرئيسية لتمثيل انضمام خارجية. بناء الجملة كما يلي:
{OJ OUTER-JOIN}جدول انضمام خارجي = {اليسار | الحق | Full} Join {table | معايير البحث الخارجي}. على سبيل المثال:
String sql = "حدد الموظفين من {oj thistable extable extable in thattable on id = '100'}" ؛ stmt.execute (sql) ؛