1. أولا اشرح ما هو JDBC
قبل أن أرى هذا الاسم للوهلة الأولى ، شعرت أنه من الضروري معرفة اسمه الإنجليزي الكامل. اتصال قاعدة بيانات Java ، والذي يتم ترجمته حرفيًا إلى قاعدة بيانات Java قابلة للاتصال. بصراحة ، أود أن أقدم مجموعة من الروابط الوسيطة لتوصيل رمز Java وقاعدة البيانات حتى يتمكن من التحكم في قاعدة البيانات مباشرة عن طريق تشغيل رمز Java.
2. جوهر JDBC
إنه حل Java للوصول إلى قواعد البيانات. وتأمل في الوصول إلى قواعد بيانات مختلفة بنفس الطريقة لتحقيق واجهة تشغيل Java التي لا تتعلق بقاعدة البيانات المحددة.
JDBC هي أساسا مجموعة من الواجهات الموحدة. يقوم مصنعو قواعد البيانات المختلفة بتنفيذ هذه الواجهة وفقًا لخصائص قاعدة البيانات الخاصة بهم ، ولا نحتاج إلى الاهتمام بالطرق المحددة للتنفيذ.
الواجهات الرئيسية التي تنفذها الشركات المصنعة لقواعد البيانات في JDBC هي كما يلي:
Drivermanager: إدارة السائق
اتصال،
databasemetadata: الاتصال بالواجهة
إفادة،
أعدت
CallablestateMent: واجهة كائن البيان
النتيجة ،
ResultSetMetAdata: واجهة ResultSet
3. كيف يعمل JDBC
يستدعي المبرمج الجزء الذي تم تنفيذه بواسطة الشركة المصنعة الأساسية لقاعدة البيانات.
أي: 1) قم بتنفيذ الخطوة الأولى للاتصال من خلال واجهة الاتصال
2) نقل عبارات SQL من خلال نتائج البيان
3) يمكن تلخيص العملية الرئيسية لحفظ نتائج إرجاع قاعدة البيانات إلى واجهة مجموعة نتائج النتائج على النحو التالي:
1) قم بتحميل برنامج التشغيل وإنشاء الاتصال
2) إنشاء كائن بيان
3) تنفيذ بيانات SQL
4) أرسل مجموعة النتائج
5) أغلق الاتصال
أدناه سوف آخذ قاعدة بيانات Oracle التي تعلمتها وأتعاون مع Eclips كمثال لشرح كيفية تنفيذ JDBC
1) تحميل السائق
الطريقة المستخدمة هي: class.forname ("Driver") ؛
ما أعرفه حول كيفية الحصول على هذا السائق هو: قم بتوسيع حزمة JDBC JAR ، إذا كنت أستخدم OJDBC6.JAR ، Find Oracle.jdbc.driver ، Find Oracledriver ، ثم QualityCopy Quality ، ولصقه في اقتباسات ، مثل: class.forname ("Oracle.jdbc.driver.oracledriver") ؛
2) إنشاء اتصال
الطريقة المستخدمة هي: conn = drivermanager.getConnection ("jdbc: oracle: thin: eard address: 1521: orcl" ، "database account" ، "database password") ؛
على سبيل المثال: conn = drivermanager.getConnection ("JDBC: Oracle: Thin:@172.16.3.8: 1521: orcl" ، "JSD1601" ، "JSD1601") ؛
3) إنشاء كائن بيان
الطريقة المستخدمة هي: بيان stmt = conn.createstatement () ؛
تجدر الإشارة إلى أن الاتصال الذي تم إنشاؤه في الخطوة الثانية يستخدم لاستدعاء الطريقة
استدعاء طريقة executeupdate وقم بتمرير عبارة SQL إليها لتنفيذ عبارة SQL المكتوبة. تجدر الإشارة هنا إلى أن أنواع SQL التي يمكن أن تنفذها طريقة التنفيذ هي إدراج ، تحديث ، حذف
على سبيل المثال: بيان stmt = conn.createstatement () ؛
String sql = "insert in emp_jiawenzhe (empno ، ename ، sal ، deptno) القيم (1000 ، 'Jia wenzhe' ، 1500،10)" ؛
int i = stmt.executeupdate (sql) ؛
قيمة الإرجاع التي أنا هنا هي عدد الصفوف المتأثرة. يمكننا الحكم على ما إذا كانت العملية ناجحة بناءً على عدد الصفوف المتأثرة.
4) تشير مجموعة النتائج التي تم إرجاعها بشكل أساسي إلى عملية الاختيار (لم يرد ذكرها هنا)
5) أخيرا أغلق الاتصال
على سبيل المثال: conn.close () ؛
قائمة رمز كامل ، بما في ذلك التعليقات:
حزمة jdbc_day01 ؛ استيراد java.sql.* ؛/*** توضح خطوات تشغيل JDBC* 1. args) يلقي sqlexception {// المتطلبات: إنشاء موظف ، رقم الموظف ، اسم الموظف ، الراتب ، رقم القسم // 1 ، اتصال conn = null ؛ حاول {class.forname ("oracle.jdbc.driver.oracledriver") ؛ System.out.println ("تحميل برنامج التشغيل بنجاح") ؛ // 2. conn = drivermanager.getConnection ("jdbc: Oracle: Thin:@172.16.3.8: 1521: orcl" ، "JSD1601" ، "JSD1601") ؛ System.out.println (conn.getClass (). getName ()) ؛ // 3. // كائن بيان الإحصاء. إرسال وتنفيذ عبارة SQL/ * * int quardupdate (String SQL) ؛ * إرسال إدراج ، تحديث ، حذف البيانات* تمثل قيمة الإرجاع int عدد الصفوف التي تؤثر على جدول قاعدة البيانات*/ العبارة stmt = conn.createstatement () ؛ String sql = "insert في emp_jiawenzhe (Empno ، ename ، sal ، deptno)" + "القيم (1000 ، 'Wang Xiaoer' ، 1500،10)" ؛ int i = stmt.executeupdate (sql) ؛ if (i> 0) {system.out.println ("حفظ بنجاح!") ؛ }} catch (classnotfoundException e) {e.printStackTrace () ؛ // 1. سجل السجل // 2. قم بإبلاغ المتصل برمي RunTimeException جديد ("خطأ تحميل برنامج التشغيل" ، هـ) ؛ } أخيرًا {// أغلق الاتصال if (conn! = null) {try {conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ }}}}}}} ملاحظة: حزمة JAR التي يمكن استخدامها في قاعدة بيانات Oracle: OJDBC14.JAR/OJDBC6.JAR (يستخدم Oracle12C هذا)
حزمة JAR التي يمكن استخدامها بواسطة قاعدة بيانات MySQL: MySQL-Connector-Java-5.0.4-bin.jar
تحميل فئة السائق:
class.forname ("com.mysql.jdbc.driver") ؛ 1. إدخال طريقة التغليف
أكثر ما لم يلمسني هو أنه عندما أكتب سلسلة معينة من الرموز ، إذا كان هناك إعادة استخدام رمز ، فسوف أختار بالتأكيد طريقة لتغليف الكود إلى حد ما ، من تغطية طريقة إلى تغليف فئة. إن الاستخدام المذكور مسبقًا لـ JDBC لعمليات قاعدة البيانات (الإضافة والحذف والتعديل ، لأن الاستعلام ينطوي على تشغيل مجموعة النتائج ، ويتم الإعلان عنه بشكل منفصل) إلى أربع عمليات:
1) تحميل السائق
2) إنشاء اتصال
3) إنشاء كائن بيان وإرسال SQL
4) أغلق الاتصال
بمعنى آخر ، عندما نقوم بإجراء أي عملية قاعدة بيانات ، يتعين علينا تنفيذ الخطوات المذكورة أعلاه ، مما يؤدي إلى تكرار الكود. لذلك اقترحنا تغليف هذه الخطوات المشتركة في فئة بحيث يمكن أن تصبح فئة أداة لاستخدامي.
2. ثلاثة إصدارات من التغليف
الإصدار 1
عندما كنت أتعلم ، قمت بتغليف هذه الفصول تدريجياً بطريقة تدريجية وحسنتها تدريجياً ، لأنه إذا تم اقتراح الإصدار النهائي من التغليف مباشرة ، فمن الصعب على المبتدئين قبوله. سأشرح الأول ، أي أبسط طريقة للتغليف:
ستكتشف في وقت سابق أنه بغض النظر عن الطريقة التي تريد تشغيل قاعدة البيانات ، وتحميل برنامج التشغيل أمر ضروري ، ويتضمن برنامج تشغيل التحميل بشكل أساسي إعلانات ، اسم برنامج التشغيل ، عنوان IP ، رقم المنفذ ، اسم حساب قاعدة البيانات ، كلمة المرور ، وما إلى ذلك ، وجوهر هذه السلاسل ، لذلك أقوم بتحديد هذه السلاسل بشكل منفصل ، كما هو موضح أدناه:
سلسلة Static Static DriverClass = "oracle.jdbc.driver.oracledriver" ؛ url url static static static الخاص = "jdbc: Oracle: Thin: Losthost: 1521: orcl" ؛ user static static user = "system" ؛ كلمة مرور السلسلة الثابتة الخاصة = "123" ؛
وبهذه الطريقة ، عند إنشاء الاتصال ، يمكنني الحصول مباشرة على اسم المتغير لاستبدال السلسلة الطويلة. عند تحميل برنامج التشغيل ، يتم الإعلان عن Class.forname في كتلة ثابتة لأنه أثناء تحميل البيانات ، يتم تحميل برنامج التشغيل.
كما هو موضح أدناه:
ثابت {try {class.forname (driverClass) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("خطأ تحميل برنامج التشغيل" ، E) ؛ }}لإنشاء اتصال ، نسمي طريقة getConnection لـ Drivermanager ووضع اسم المستخدم وكلمة المرور المقابلة فيه. وضعنا هذه الطريقة مباشرة في الطريقة التي حددتها ، ثم استدعاء طريقتي مباشرة لإنشاء الاتصال. تجدر الإشارة إلى أن قيمة إرجاع الطريقة هي كائن الاتصال ، وهو أمر سهل الفهم ، لأننا نريد الحصول على كائن نوع الاتصال هذا ، كما هو موضح أدناه:
الاتصال الثابت العام getConnection () يلقي sqlexception {connection conn = drivermanager.getConnection (url ، المستخدم ، كلمة المرور) ؛ إرجاع كون ؛ }ثم قم بإنشاء كائن بيان وإرسال SQL. بالطبع ، SQL هو المكان الخاص الوحيد هنا ، لأن ما تحتاجه SQL مختلف تمامًا ، لذلك لا تحتاج هذه الخطوة إلى تغليفها.
أخيرًا ، أغلق الاتصال ، الذي يسمى طريقة Close () ، كما هو موضح أدناه
إغلاق الفراغ الثابت العام (اتصال conn) {if (conn! = null) {try {conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("Elint Connection Error" ، E) ؛ }}}}الإصدار الأول العام من الحزمة هو كما يلي:
حزمة jbbc_day01 ؛ استيراد java.sql.connection ؛ استيراد java.sql.drivermanager ؛ استيراد java.sql.sqlexception ؛/** * المستخدمة لإدارة الاتصالات * jiawenzhe */public class dbutil {private static strep driverclass = url url static static static الخاص = "jdbc: Oracle: Thin: Losthost: 1521: orcl" ؛ user static static user = "system" ؛ كلمة مرور السلسلة الثابتة الخاصة = "123" ؛ // 1. تحميل برنامج التشغيل Static {try {class.forname (driverClass) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("خطأ تحميل برنامج التشغيل" ، E) ؛ }}} // 2. قم بإنشاء اتصال/** كيفية تحديد طريقة يمكنها إنشاء اتصال* نوع قيمة الإرجاع: ما إذا كانت هناك نتيجة للعملية ، إذا كانت هناك ، فإن نوع النتيجة هو نوع قيمة الإرجاع* قائمة المعلمة:* ما إذا كانت هناك بيانات غير مؤكدة في وظيفة الطريقة تشارك في العملية ، إذا كان هناك معلمة ، فهو معلمة ، إرجاع كون ؛ } // 3. أغلق Connection public static void close (connection conn) {if (conn! = null) {try {conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("Elint Connection Error" ، E) ؛ }}}}}ما عليك سوى التغليف بهذه الطريقة ، ثم اتصل بفئة التغليف مباشرة عند إجراء عمليات SQL. كل ما تحتاج إلى كتابته هو إنشاء كائن البيان الخاص بك وإرسال بيان SQL الخاص بك
الإصدار 2
في الواقع ، يشبه الإصدار 2 إلى حد كبير الإصدار 1 ، من أجل تعويض أحد أوجه القصور في الإصدار 1 ، أي عند تغيير قاعدة البيانات ، تختلف كلمات مرور الحساب لقواعد البيانات المختلفة ، لذلك تحتاج إلى تعديل كلمة مرور الحساب وعنوان IP. لقد سبق أن قمت بتغليفها في فئة الأدوات في شكل سلسلة ، مما يعني أنه يجب علينا تعديل فئة الأدوات في كل مرة نغير قاعدة البيانات ، والتي تكون غير لائقة للغاية. لذلك اقترحنا طريقة تحسين لوضع بيانات الاتصال هذه في ملف التكوين ، وتقرأ فئة الأدوات ملف التكوين هذا. يمكننا تعديل ملف التكوين مباشرة عند تعديله.
قبل تقديم هذا الإصدار ، قمت بتقديم فئة جديدة وخصائص ، وهو ملف يمكنه قراءة محتوى ملف التكوين وقراءةه في شكل دفق ثم إرجاعه إلى فئة الأدوات.
أولاً ، سأقدم مثالًا على ملف التكوين. في الواقع ، لا يلزم شرحه. من الواضح في لمحة ، كما هو موضح أدناه:
jdbc.driverclass = oracle.jdbc.driver.oracledriverjdbc.url = jdbc: oracle: thin: localhost: orcljdbc.user = systemjdbc.password = 123
الجبهة هي المفتاح ، فيما يلي القيمة ، ويتم تعريف القيمة الرئيسية السابقة من قبل أنفسنا ، تمامًا مثل تحديد الاسم المتغير ، والقيمة اللاحقة هي الموقف الفعلي لقاعدة البيانات الخاصة بنا. ما نحتاج إلى إيلاء اهتمام خاص هنا هو أن اسم لاحقة ملف التكوين هذا يجب أن ينتهي بـ .properties ، لأنه بهذه الطريقة ، يمكن قراءة فئة الخصائص.
أمثلة على هذا القسم هي كما يلي:
static {try {// تحميل خصائص بيانات ملف الخصائص pop = new properties () ؛ pop.load (dbutil2.class.getClassLoader (). getResourCeasStream ("db.properties")) ؛ url = pop.getProperty ("jdbc.url") ؛ DriverClass = pop.getProperty ("jdbc.driverclass") ؛ user = pop.getProperty ("jdbc.user") ؛ password = pop.getProperty ("jdbc.password") ؛ class.forname (driverClass) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("خطأ تحميل برنامج التشغيل" ، E) ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ }}تتمثل طريقة LOAD () في قراءتها أو يمكن اعتبارها لتحميل ملف التكوين. فقط تذكر هذه الجملة كلها دون الخوض في معناها. يحصل GetProperty () على القيمة المقابلة من خلال المفتاح ، والذي يشبه إلى حد كبير شكل الحصول على قيمة لمجموعة زوج القيمة الرئيسية.
الرمز الكلي على النحو التالي:
package jbbc_day01 ؛ import java.io.fileInputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputStream ؛ استيراد java.sql.connection ؛ استيراد java.sql.drivermanager المعلومات ، المحفوظة في ملف الخصائص * Author Jiawenzhe * */public class dbutil2 {private Static String DriverClass ؛ عنوان url Static Static الخاص ؛ مستخدم سلسلة ثابتة خاصة ؛ كلمة مرور السلسلة الثابتة الخاصة ؛ // 1. تحميل برنامج تشغيل {try {// تحميل خصائص بيانات ملف الخصائص pop = new properties () ؛ pop.load (dbutil2.class.getClassLoader (). getResourCeasStream ("db.properties")) ؛ url = pop.getProperty ("jdbc.url") ؛ DriverClass = pop.getProperty ("jdbc.driverclass") ؛ user = pop.getProperty ("jdbc.user") ؛ password = pop.getProperty ("jdbc.password") ؛ class.forname (driverClass) ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("خطأ تحميل برنامج التشغيل" ، E) ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ }} // 2. قم بإنشاء اتصال/** كيفية تحديد طريقة يمكنها إنشاء اتصال* نوع قيمة الإرجاع: ما إذا كانت هناك نتيجة للعملية ، إذا كانت هناك ، فإن نوع النتيجة هو نوع قيمة الإرجاع* قائمة المعلمة:* ما إذا كانت هناك بيانات غير مؤكدة في وظيفة الطريقة تشارك في العملية ، إذا كان هناك معلمة ، فهو معلمة ، إرجاع كون ؛ } // 3. أغلق Connection public static void close (connection conn) {if (conn! = null) {try {conn.close () ؛ } catch (sqlexception e) {E.PrintStackTrace () ؛ رمي new RunTimeException ("Elint Connection Error" ، E) ؛ }}}}}