توضح هذه المقالة المعرفة والمهارات الأساسية لـ JDBC مع الأمثلة. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
1. ما هو JDBC؟
بعبارات عامة، تستخدم تقنية JDBC برنامج Java لإرسال عبارات SQL إلى قاعدة البيانات. وتقوم قاعدة البيانات بتنفيذ عبارات SQL بعد استلامها، وإرجاع النتائج إلى برنامج Java لإدارتها.
2. ما هي شروط استخدام JDBC؟
أ) عنوان مضيف قاعدة البيانات الهدف
ب) رقم المنفذ الذي يشغله برنامج قاعدة البيانات على المضيف
ج) اسم المستخدم المستخدم لتسجيل الدخول إلى قاعدة البيانات
د) كلمة المرور لاسم المستخدم هذا
ه) الاتصال بقاعدة البيانات
3.مبادئ تقنية JDBC
نحن نعلم أن هناك أنواعًا مختلفة من قواعد البيانات، وأن معايير ومواصفات قواعد البيانات التي تنتجها الشركات المصنعة المختلفة مختلفة في هذا الوقت، إذا استخدمنا كود JAVA لإرسال عبارات SQL، فيجب علينا كتابة مجموعة تلو الأخرى وفقًا لقواعد بيانات مختلفة. مجموعة من أكواد التشغيل، وهي تكلفة تطوير ضخمة لمطوري البرامج، لذا SU عندما قامت الشركة N بتطوير تقنية JDBC، نصت على مجموعة من الواجهات القياسية التي يجب على الشركات المصنعة لقواعد البيانات توفير برنامج تشغيل لتنفيذ هذه المجموعة من الواجهات، وطالما أن مطوري البرامج يستخدمون برنامج تشغيل قاعدة البيانات أثناء التطوير، فيجب عليهم استخدام طريقة متسقة للتطوير، ليست هناك حاجة لكتابة مجموعة من الأكواد للتكيف مع قواعد البيانات المختلفة.
4. واجهة برمجة التطبيقات الأساسية في JDBC
|- برنامج التشغيل: الواجهة التي تنفذها فئة برنامج التشغيل.
|-اتصال الاتصال (عنوان url للسلسلة، معلومات الخصائص) - يُستخدم للاتصال بقاعدة البيانات والحصول على كائن الاتصال
المعلمات التي يجب تعيينها في الخصائص:
URL: سلسلة URL للاتصال بقاعدة البيانات. البروتوكول + البروتوكول الفرعي لقاعدة البيانات + المضيف + المنفذ + قاعدة البيانات
المستخدم: اسم مستخدم قاعدة البيانات
كلمة المرور: كلمة مرور المستخدم
|-الاتصال: واجهة للاتصال بقاعدة البيانات
|- بيان createStatement() - إنشاء كائن بيان لإرسال عبارات SQL
|- PreparedStatement PreparationStatement(String sql) - إنشاء كائن PreparationStatement لإرسال عبارات SQL المترجمة مسبقًا
|-CallableStatement PreparCall(String sql) - إنشاء كائن CallableStatement لاستدعاء الإجراءات المخزنة.
|-البيان: يستخدم لتنفيذ عبارات SQL الثابتة
|-int ExecuteUpdate(String sql) - تنفيذ عملية التحديث (DDL+DML)
|-ResultSet Execuery(String sql) - تنفيذ عملية الاستعلام (DQL)
|- PreparationStatement: يستخدم لتنفيذ عبارات SQL المترجمة مسبقًا
|- int ExecuteUpdate() - إجراء عملية التحديث
|- ResultSet ExecuterQuery() -- تنفيذ عملية الاستعلام
|- CallableStatement: SQL يستخدم لتنفيذ الإجراءات المخزنة
|- ResultSet ExecuterQuery() --استدعاء الإجراء المخزن
|- ResultSet: مجموعة النتائج. يستخدم لتغليف بيانات الاستعلام الخاصة بقاعدة البيانات
|- boolean next() --حرك مؤشر السجل إلى السطر التالي
|- الكائن getObject(int columnIndex)--احصل على قيمة الحقل
بعد فهم واجهات برمجة التطبيقات (APIs)، فلنستخدم JDBC لإرسال عبارات SQL ~
5. استخدم كائن البيان لتشغيل قاعدة البيانات
عمليات DDL وDML
الخطوة 1
قم باستيراد الحزمة، لأنني أستخدم قاعدة بيانات MySQL، لذا لاستخدام تقنية JDBC، يجب عليك استخدام برنامج تشغيل قاعدة البيانات المقدم من الشركة المصنعة لقاعدة بيانات MySQL، لذلك فإن الخطوة الأولى هي استيراد حزمة برنامج تشغيل قاعدة البيانات إلى المشروع.
اسم الحزمة المستخدمة: mysql-connector-java-5.1.7-bin.jar
الخطوة 2
أنشئ فئة عادية وأضف طريقة فيها وانسخ الكود الموجود في الطريقة كما يلي: //URL
عنوان URL الخاص بسلسلة = "jdbc:mysql://localhost:3306/vmaxtam";
//مستخدم
مستخدم السلسلة الخاصة = "الجذر"؛
//كلمة المرور
كلمة مرور السلسلة الخاصة = "الجذر"؛
اختبار الفراغ العامDDL () يرمي الاستثناء {
//1.تسجيل السائق
Class.forName("com.mysql.jdbc.Driver");
//2.احصل على الاتصال
اتصال conn = DriverManager.getConnection(url, المستخدم, كلمة المرور);
//3. إنشاء كائن بيان
البيان stmt = conn.createStatement();
//4. تحضير بيان SQL
String sql = "إنشاء جدول للطالب(sid INT PRIMARY KEY,sname VARCHAR(20),age INT)";
//5. أرسل عبارة SQL من خلال كائن البيان وأرجع نتيجة التنفيذ
int count = stmt.executeUpdate(sql);
//6.طباعة نتائج التنفيذ
System.out.println("سجلات "+count+" المتأثرة");
}
//7.إغلاق الموارد
إذا (بيان! = فارغة)
{
بيان. إغلاق ()؛
}
إذا (كون!=فارغة)
{
conn.Close();
}
إذا كنت تريد تنفيذ عمليات DQL وDDL، فيمكنك كتابة عبارة SQL ثم استدعاء أسلوب executlUpdate الخاص بالعبارة لتنفيذ عبارة SQL لقاعدة البيانات. تقوم هذه الطريقة بإرجاع قيمة عددية تشير إلى عدد الصفوف المتأثرة في قاعدة البيانات.
إذا لم نغير البرنامج أعلاه وأردنا إصدار عبارات SQL لقاعدة البيانات مرة أخرى، فعلينا كتابة برنامج للاتصال مرة أخرى، وبعد العملية، يتعين علينا إغلاق كائن البيان وكائن الاتصال، وهو أمر مرهق للغاية . لذلك، نقوم عمومًا باستخراج عملية الاتصال وعملية تحرير الكائن في فئة الأداة. الكود الموجود في فئة الأداة كما يلي:
انسخ الكود كما يلي: public class sqlUtil {
عنوان URL لسلسلة ثابتة خاصة = "jdbc:mysql://localhost:3306/vmaxtam";
مستخدم سلسلة ثابتة خاصة = "الجذر"؛
كلمة مرور سلسلة ثابتة خاصة = "الجذر"؛
// احصل على الاتصال
اتصال ثابت عام getconnection() {
اتصال كون = فارغ؛
يحاول {
// 1. تسجيل السائق
Class.forName("com.mysql.jdbc.Driver");
// 2. احصل على الاتصال
conn = DriverManager.getConnection(url, user,password);
// 3. احصل على كائن البيان
بيان البيان = conn.createStatement();
} قبض (الاستثناء ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
العودة كون؛
}
// 7. أغلق المورد
إغلاق الفراغ الثابت العام (بيان البيان، اتصال الاتصال) {
{
يحاول {
إذا (بيان! = فارغ)
بيان. إغلاق ()؛
إذا (اتصال! = فارغ) {
اتصال. إغلاق ()؛
}
} قبض على (SQLException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
}
الأشياء التي يجب مراعاتها هي:
1) يحتاج المستخدم إلى تسجيل برنامج التشغيل مرة واحدة فقط. ليست هناك حاجة لتسجيل برنامج التشغيل في كل مرة يتصل فيها بقاعدة البيانات، لذلك نكتب عملية تسجيل برنامج التشغيل في كتلة تعليمات برمجية ثابتة.
2) يتم ترميز عنوان URL واسم المستخدم وكلمة المرور واسم فئة برنامج التشغيل بشكل ثابت في البرنامج حتى نتمكن من تغيير قاعدة البيانات أو المستخدم دون تغيير الرمز، وعادةً ما نكتب هذه المعلومات في ملف تكوين.
يتم كتابة ملف التكوين في دليل src الخاص بالمشروع ويسمى db.properties
انسخ الكود كما يلي: url=jdbc:mysql://localhost:3306/vmaxtam
user=root
كلمة المرور=root
driverClass=com.mysql.jdbc.Drive
ثم اقرأ ملف التكوين في sqlUtil، وأخيرًا قم بتحسينه في الكود التالي، انسخ الكود كما يلي: public class sqlUtil {.
سلسلة ثابتة خاصة url = فارغة؛
مستخدم سلسلة ثابتة خاصة = فارغ؛
كلمة مرور سلسلة ثابتة خاصة = فارغة؛
Private static String driverClass= null;
ثابت {
يحاول {
//1. احصل على كائن الرمز الثانوي
Classclazz = sqlUtil.class;
//2. اتصل بـ getResourceAsStream للحصول على المسار
InputStream inputStream = clazz.getResourceAsStream("/db.properties");
Properties pro = new Properties();
pro.load(inputStream);
//3. قراءة المعلمات
url=pro.getProperty("url");
كلمة المرور=pro.getProperty("كلمة المرور");
user=pro.getProperty("user");
driverClass=pro.getProperty("driverClass");
Class.forName(driverClass);
} قبض (الاستثناء ه) {
printStackTrace();
System.out.println("فشل التسجيل!" + e.getMessage());
رمي RuntimeException (e) الجديد ؛
}
}
// احصل على الاتصال
اتصال ثابت عام getconnection() {
اتصال كون = فارغ؛
يحاول {
// احصل على الاتصال
conn = DriverManager.getConnection(url, user,password);
// الحصول على كائن البيان
بيان البيان = conn.createStatement();
} قبض (الاستثناء ه) {
printStackTrace();
}
العودة كون؛
}
// أغلق المورد
إغلاق الفراغ الثابت العام (بيان البيان، اتصال الاتصال) {
{
يحاول {
إذا (بيان! = فارغ)
بيان. إغلاق ()؛
إذا (اتصال! = فارغ) {
اتصال. إغلاق ()؛
}
} قبض على (SQLException ه) {
// TODO كتلة الالتقاط التي تم إنشاؤها تلقائيًا
printStackTrace();
}
}
}
}
عملية DQL
فكيف يتم استخدام JDBC للاستعلام عن البيانات في قاعدة البيانات؟
انسخ رمز الكود كما يلي: @Test
اختبار الفراغ العام () يلقي استثناء {
// احصل على الاتصال
cnn2=sqlUtil.getconnection();
بيان البيان = cnn2.createStatement();
// تحضير عبارة SQL
String sql = "اختر * من الموضوع";
// اتصل بـ ExecuterQuery لتنفيذ بيان الاستعلام
ResultSet res =statement.executeQuery(sql);
// بعد اكتمال الاستعلام، سيشير الدقة إلى رأس الجدول، إذا كنت ترغب في الحصول على البيانات، فيجب عليك الاستمرار في الإشارة إلى الصف التالي من نتيجة الاستعلام.
بينما (res.next ())
{
// احصل على قيمة الحقل "sjid" في نتيجة الاستعلام، وتأكد من أن النوع واضح
معرف int = res.getInt("sjid");
// احصل على قيمة الحقل "sjname" في نتيجة الاستعلام، ويجب أن يكون النوع واضحًا
اسم السلسلة = res.getString("sjname");
System.out.println("ID:" + id + "NAME:" + name);
}
sqlUtil. Close(statement, cnn2);
}
ما ورد أعلاه هو استخدام كائنات البيان لتشغيل قاعدة البيانات ~
6. استخدم ReadyStatement لتشغيل قاعدة البيانات
كائن PreparationStatement هو في الواقع كائن بيان خاص يمكنه ترجمة عبارات SQL مسبقًا. عند تعيين المعلمات، يمكنك بعد ذلك تنفيذ عبارة SQL ~
رمز نسخ عملية DDL وDML هو كما يلي: package com.vmaxtam.sqltest;
استيراد java.sql.Connection؛
import java.sql.PreparedStatement;
import org.junit.Test;
فئة عامة PreparedStatementTest {
اتصال الاتصال = فارغ؛
@امتحان
الفراغ العام ddldmlTest () يطرح الاستثناء {
// 1. احصل على الاتصال
اتصال = sqlUtil.getconnection();
// 2. تحضير عبارات SQL والبيانات المترجمة مسبقًا والمعلمات؟ العنصر النائب للرقم
String sql = "INSERT INTO SUBJECT VALUES(?,?)";
// 3. احصل على الكائن
PreparedStatement PreparationStatement = Connection.prepareStatement(sql);
/*
* 4. لتعيين معلمات SQL، تحتاج إلى معرفة رقم المعلمة ومعرفة نوعها. تشير الجملة الأولى أدناه إلى أن المعلمة الأولى لعبارة SQL هي من النوع int، ويتم تعيين قيمة المعلمة على 3، وهكذا. على.
*/
PreparedStatement.setInt(1, 3);
PreparationStatement.setString(2, "English");
// 5. قم بتسليمها إلى قاعدة البيانات لتنفيذ SQL
int num = PreparationStatement.executeUpdate();
System.out.println("هناك" + num + "السجلات المتأثرة");
sqlUtil.إغلاق(preparedStatement,connection);
}
}
ما ورد أعلاه هو استخدام كائن PreparationStatement لإرسال عبارات الإدراج بنفس الطريقة، ويمكن إرسال عبارات DDL وDML بهذه الطريقة.
فوائد التجميع المسبق لـ PredStatement:
يسمح لك التجميع المسبق لـ PreparationStatement بالاستعلام عن أهداف مختلفة عن طريق تعيين معلمات مختلفة على جانب قاعدة البيانات، سيتم حفظ بيان تم تجميعه مسبقًا فقط، ولكن إذا كنت تستخدم البيان لإرسال بيان، في كل مرة يتم إرسال بيان، سيتم تخزين واحد في. قاعدة البيانات، والتي قد تشغل مساحة كبيرة من الذاكرة.
رمز نسخ عملية DQL هو كما يلي: @Test
public void dqlTest() يلقي الاستثناء {
// 1. احصل على الاتصال
اتصال = sqlUtil.getconnection();
// 2. تحضير عبارات SQL والبيانات المترجمة مسبقًا والمعلمات؟ العنصر النائب للرقم
String sql = "select * from subject Where sjid=? or sjname=؟";
// 3. احصل على الكائن
PreparedStatement PreparationStatement = Connection.prepareStatement(sql);
/*
* 4. لتعيين معلمات SQL، تحتاج إلى معرفة رقم المعلمة ومعرفة نوعها. تشير الجملة الأولى أدناه إلى أن المعلمة الأولى لعبارة SQL هي من النوع int، ويتم تعيين قيمة المعلمة على 3، وهكذا. على.
*/
PreparationStatement.setInt(1, 2);
PredStatement.setString(2, "Chinese");
// 5. قم بتسليمها إلى قاعدة البيانات لتنفيذ SQL
ResultSet rst = PreparationStatement.executeQuery();
//6.كرر مجموعة النتائج
بينما (rst.next ())
{
معرف int = rst.getInt("sjid");
اسم السلسلة = rst.getString("sjname");
System.out.println("ID:" + id + "NAME:" + name);
}
//7.أغلق الاتصال
sqlUtil.إغلاق(preparedStatement,connection);
}
يمكنك أيضًا استدعاء طريقة ExecuteQuery () وتكرار الإخراج بعد الحصول على مجموعة النتائج ~
بما أن البيان والبيان المجهز متشابهان جدًا، فلنقارن مزاياهما وعيوبهما~
الفرق بين البيان والبيان المعد:
1. قواعد مختلفة
يدعم البيان فقط الترجمة الثابتة، وتكون عبارات SQL مشفرة بشكل ثابت.
PreparedStatement يدعم التجميع المسبق، هل يستخدم؟ تعال واجلس.
2. كفاءة مختلفة
يرسل البيان عبارة SQL في كل مرة، ولا يدعم التخزين المؤقت، كما أن كفاءة التنفيذ منخفضة.
يدعم PreparedStatement التجميع المسبق ويتم تخزينه مؤقتًا في قاعدة البيانات، ويحتاج فقط إلى إرسال المعلمات، وتكون كفاءة التنفيذ سريعة.
3. أمان مختلف
يتم حقن البيان بسهولة.
الحقن: يمكن للعناصر الماكرة كتابة عبارات SQL خاصة لاختراق قاعدة البيانات.
على سبيل المثال: للاستعلام عن معلومات مستخدم معين
الوضع العام: SELECT * FROM user_list حيث اسم المستخدم = xxx وكلمة المرور = xxx (يجب أن يقوم xxx هنا بملء اسم المستخدم وكلمة المرور الخاصة بالمستخدم)
حالة الإدخال: SELECT * FROM user_list حيث اسم المستخدم = "abc" أو 1 = 1 - كلمة المرور = xxx؛
بهذه الطريقة، 1=1 يساوي، وتضاف علامة "--" قبل كلمة المرور، ويصبح المحتوى التالي تعليقًا ولن يتم تنفيذه. بمعنى آخر، يمكن الاستعلام عن كافة معلومات المستخدم بدون كلمات مرور.
PreparedStatement، لأنه يحدد المعلمات في عبارة SQL، يمكن أن يمنع الحقن.
الخلاصة: يوصى باستخدام PreparationStatement لأنه أسرع وأكثر أمانًا .
7. استخدم CallableStatement لتنفيذ الإجراءات المخزنة
يؤدي استخدام CallableStatement إلى تنفيذ الإجراءات المخزنة فقط. لإنشاء الإجراءات المخزنة، لا يزال يتعين علينا إنشاؤها في قاعدة البيانات.
الخطوة 1
الآن قامت قاعدة البيانات بإنشاء إجراء مخزن:
انسخ رمز الكود كما يلي: DELIMITER $
إنشاء إجراء pro_add(IN a INT , IN b VARCHAR(20),OUT c INT)
يبدأ
حدد * من الموضوع حيث sjid=a OR sjname=b;
SET ج=أ+أ+أ+أ;
نهاية $
الخطوة 2
استخدم كود Java لتنفيذ معلمات الإخراج والحصول عليها، انسخ الكود كما يلي: @Test
كالاست باطلة عامة () يلقي استثناء {
// احصل على الاتصال
اتصال = sqlUtil.getconnection();
// تحضير عبارة SQL
String sql = "CALL pro_add(?,?,?)";
// احصل على كائن callableStatement
CallableStatement cbs = Connection.prepareCall(sql);
// قم بتعيين معلمات الإدخال، مثل إعداد البيانات
cbs.setInt(1, 3);
cbs.setString(2, "الرياضيات");
/*فكيفية ضبط معلمات الإخراج؟
* تحتاج إلى تسجيل معلمات الإخراج!
*/
cbs.registerOutParameter(3, java.sql.Types.INTEGER);// تحتاج إلى استخدام الكائنات المضمنة لتعيين أنواع المعلمات
// تنفيذ عبارة SQL
cbs.executeQuery();
// استخدم طريقة getXXX للحصول على معلمات الإخراج للموضع المقابل
عدد صحيح = cbs.getInt(3);
System.out.println("a*4 هو" + num);
// أغلق المورد
sqlUtil. Close(cbs, Connection);
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.