الغرض من هذا البرنامج التعليمي هو استخدام طبقة منفصلة مكتوبة في Java للوصول إلى الجداول في قاعدة بيانات. عادة ما تسمى هذه الطبقة طبقة الوصول إلى البيانات (DAL)
إن الفائدة الأكبر لاستخدام DAL هي أنه يبسط تشغيل الوصول إلى قاعدة البيانات عن طريق استخدام بعض الطرق مباشرة مثل insert () والبحث () ، بدلاً من القيام دائمًا بالروابط أولاً ثم تنفيذ بعض الاستعلامات.
تتعامل هذه الطبقة مع جميع المكالمات والاستعلامات المتعلقة بها في قاعدة البيانات.
إنشاء قاعدة بيانات
نريد إنشاء جدول بسيط للمستخدم ، يمكننا استخدام هذه الحقول لإنشاء
معرف int
اسم varchar (200)
كلمة المرور varchar (200)
العمر int
كائن نقل البيانات
يجب أن تحتوي هذه الطبقة على فئة بسيطة تسمى كائن نقل البيانات (DTO). هذه الفئة هي مجرد خريطة بسيطة تتوافق مع الجدول في قاعدة البيانات ، وكل عمود في الجدول يتوافق مع متغير عضو في الفئة.
هدفنا هو استخدام كائنات Java البسيطة ، بدلاً من معالجة عبارات SQL والأوامر الأخرى المتعلقة بقاعدة البيانات لإضافة قاعدة البيانات وحذفها وتعديلها والتحقق منها.
إذا كنا نريد تعيين الجدول في رمز Java ، فنحن بحاجة فقط إلى إنشاء فئة (فول) تحتوي على نفس الحقول.
لتحسين التغليف ، بالإضافة إلى المُنشئين ، يجب أن نعلن أن جميع متغيرات الحقل خاصة ، وإنشاء ملحقات (getters و petters) ، أحدها هو المنشئ الافتراضي.
مستخدم الفئة العامة {private integer id ؛ اسم السلسلة الخاصة ؛ تمريرة سلسلة خاصة عصر عدد صحيح خاص ؛}لتعيين الحقول بشكل صحيح ، يجب أن ننظر في القيمة الفارغة في قاعدة البيانات. بالنسبة للقيم الافتراضية الأصلية لـ Java ، مثل نوع int ، فإن القيمة الافتراضية الخاصة بها هي 0 ، لذلك يجب أن نقدم نوع بيانات جديد يمكنه استيعاب القيم الفارغة. يمكننا استبدال int باستخدام فئة خاصة - التغليف ، مثل عدد صحيح.
أخيرًا ، يجب أن يبدو فصلنا هكذا:
مستخدم الفئة العامة {private integer id ؛ اسم السلسلة الخاصة ؛ تمريرة سلسلة خاصة عصر عدد صحيح خاص ؛ المستخدم العام () {} المستخدم العام (اسم السلسلة ، تمريرة السلسلة ، عصر INTEGER) {this.name = name ؛ this.pass = pass ؛ this.age = العمر ؛ } مستخدم عام (معرف عدد صحيح ، اسم السلسلة ، تمريرة السلسلة ، العمر الصحيح) {this.id = id ؛ this.name = name ؛ this.pass = pass ؛ this.age = العمر ؛ } integer getAge () {return Age ؛ } public void setage (integer age) {this.age = age ؛ } integer getId () {return id ؛ } public void setId (integer id) {this.id = id ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getPass () {return pass ؛ } public void setPass (String pass) {this.pass = pass ؛ }}تتمثل الممارسة الجيدة في توفير مُنشئ فارغ افتراضي ، ومُنشئ كامل ، ومُنشئ كامل بدون معلمات ID.
الاتصال بقاعدة البيانات
يمكننا استخدام فئة وسيطة لتسهيل الاتصال بقاعدة البيانات. في هذه الفئة ، سنقدم معلمات اتصال قاعدة البيانات مثل قاعدة البيانات JDBC وعنوان URL واسم المستخدم وكلمة المرور وتحديد هذه المتغيرات على أنها نهائية (سيكون من الأفضل الحصول على هذه البيانات من الخصائص أو ملفات تكوين XML)
يوفر طريقة لإرجاع كائن اتصال أو إرجاع فارغة عند فشل الاتصال أو رمي استثناء وقت التشغيل.
Static Static Final String url = "jdbc: mysql: // localhost: 3306/testdb" ؛ user string string static static user = "testuser" ؛ public static final string pass = "testpass" ؛/*** الحصول على كائن اتصال* connection connection*/public static connection getConnection () {try {drivermanager.regeRiver إرجاع drivermanager.getConnection (url ، المستخدم ، تمرير) ؛ } catch (sqlexception ex) {رمي new RunTimeException ("خطأ في الاتصال بقاعدة البيانات" ، ex) ؛ }}يمكننا أيضًا تضمين طريقة رئيسية في الفصل لاختبار الاتصال. يشبه الفصل الكامل هذا:
استيراد com.mysql.jdbc.driver ؛ استيراد java.sql.connection ؛ استيراد java.sql.drivermanager ؛ استيراد java.sql.sqlexception ؛/** * الاتصال بقاعدة البيانات * author hany.sad */public connectory {public static url = "JDBC: mysql: // localhost: 3306/testDB" ؛ user static static string user = "testuser" ؛ pass pass static final string static = "testpass" ؛ / ** * احصل على اتصال مع قاعدة البيانات * regurn connection */ connection static public getConnection () {try {drivermanager.registerDriver (new Driver ()) ؛ إرجاع drivermanager.getConnection (url ، المستخدم ، تمرير) ؛ } catch (sqlexception ex) {رمي new RunTimeException ("خطأ في الاتصال بقاعدة البيانات" ، ex) ؛ }} / ** * اختبار الاتصال * / public static void main (string [] args) {connection = connectionFactory.getConnection () ؛ }}كائن الوصول إلى البيانات
يمكن لطبقة DAO إجراء عمليات CRUD. يمكن أن يضيف وحذف وتعديل الطاولات والتحقق منها.
يجب أن تبدو واجهة طبقة DAO الخاصة بنا مثل هذا:
الواجهة العامة userDao {user getUser () ؛ تعيين <Sether> getAllusers () ؛ المستخدم getUserByuserNameAndPassword () ؛ Boolean Insertuser () ؛ Boolean UpdateUser () ؛ الحذف المنطقي () ؛}ابحث عن المستخدمين
يمكن للمستخدمين الاستعلام من خلال أي حقول فريدة مثل المعرف أو الاسم أو البريد الإلكتروني. في هذا المثال ، نستخدم المعرف للعثور على المستخدم. الخطوة الأولى هي إنشاء اتصال من خلال فئة الموصل ، ثم تنفيذ عبارة SELECT للحصول على المستخدم بمعرفه 7. يمكننا استخدام هذا العبارة للاستعلام عن المستخدم:
حدد * من المستخدم حيث معرف = 7
هنا ندلي بيانًا ديناميكيًا للحصول على المعرف من المعلمات.
من خلال تنفيذ هذا الاستعلام ، يتم الحصول على مجموعة النتائج ، حيث يتم حفظ المستخدم أو الفارغ. يمكننا استخدام طريقة ResultSet Next () لاكتشاف ما إذا كانت هناك قيمة. إذا تم إرجاع TRUE ، فسوف نستمر في استخدام Getters للبيانات للحصول على بيانات المستخدم من ResultSet. عندما نغلف جميع البيانات في المستخدم ، نعيدها. إذا لم يكن هناك مستخدم يعاني من هذا المعرف أو يحدث أي استثناء آخر (مثل عبارة SQL غير صالحة) ، فسيتم إرجاع هذه الطريقة NULL.
المستخدم العام getUser (int id) {connection connection = connectionFactory.getConnection () ؛ حاول {statle stmt = connection.createstatement () ؛ resultset rs = stmt.executequery ("حدد * من المستخدم حيث id =" + id) ؛ if (rs.next ()) {user user = new user () ؛ user.setId (rs.getInt ("id")) ؛ user.setName (rs.getString ("name")) ؛ user.setPass (rs.getString ("pass")) ؛ user.setage (rs.getInt ("Age")) ؛ إرجاع المستخدم ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع فارغ ؛}سيكون أكثر ملاءمة لاستخدام طريقة منفصلة لاستخراج البيانات من مجموعة النتائج ، لأنه في العديد من الطرق سوف نسميها.
هذه الطريقة الجديدة ستلقي sqlexception ومن أجل القيود ، يجب أن تكون خاصة:
مستخلص المستخدم الخاص extractuserfromresultset (resultset rs) يلقي sqlexception {user user = new user () ؛ user.setId (rs.getInt ("id")) ؛ user.setName (rs.getString ("name")) ؛ user.setPass (rs.getString ("pass")) ؛ user.setage (rs.getInt ("Age")) ؛ إرجاع المستخدم ؛}يجب تعديل طريقتنا أعلاه إلى طريقة جديدة:
المستخدم العام getUser (int id) {connection connection = connectionFactory.getConnection () ؛ حاول {statle stmt = connection.createstatement () ؛ resultset rs = stmt.executequery ("حدد * من المستخدم حيث id =" + id) ؛ if (rs.next ()) {return extractuserFromResultSet (rs) ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع فارغ ؛}طريقة تسجيل الدخول
عملية تسجيل الدخول متشابهة. نريد توفير معرفات بديلة للمستخدم وكلمة المرور ، والتي لن تؤثر على قائمة المعلمات وبيانات الاستعلام. إذا كان اسم المستخدم وكلمة المرور صحيحين ، فإن هذه الطريقة تُرجع مستخدمًا صالحًا ، وإلا NULL. نظرًا لوجود العديد من المعلمات ، سيكون استخدام المعدلات الأكثر فائدة.
المستخدم العام getUserByuserNameAndPassword (مستخدم سلسلة ، تمرير السلسلة) {موصل الموصل = New Connector () ؛ اتصال الاتصال = connector.getConnection () ؛ جرب {ReparedStatement ps = connection.preparestatement ("SELECT * from user where user =؟ and pass =؟") ؛ Ps.SetString (1 ، المستخدم) ؛ Ps.SetString (2 ، تمريرة) ؛ resultset rs = ps.executequery () ؛ if (rs.next ()) {return extractuserFromResultSet (rs) ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع فارغ ؛}كيفية الاستعلام عن جميع المستخدمين
ستعيد هذه الطريقة جميع المستخدمين ، لذلك يجب أن نعيدهم في حاوية تشبه الصفيف. ولكن لأننا لا نعرف عدد السجلات الموجودة. سيكون من الأفضل استخدام مجموعة مثل المجموعة أو القائمة:
مجموعة GetAllusers () {موصل الموصل = New Connector () ؛ اتصال الاتصال = connector.getConnection () ؛ حاول {statle stmt = connection.createstatement () ؛ resultset rs = stmt.executequery ("حدد * من المستخدم") ؛ تعيين المستخدمين = new hashset () ؛ بينما (rs.next ()) {user user = extractuserFromResultSet (rs) ؛ user.add (user) ؛ } إرجاع المستخدمين ؛ } catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع فارغ ؛}إدراج طريقة
ستأخذ طريقة إدراج المستخدم كمعلمة واستخدام كائن المعدة لتنفيذ عبارة تحديث SQL. تقوم طريقة ExecuteUpdate بإرجاع عدد الصفوف المتأثرة. إذا أضفنا سطرًا واحدًا ، فهذا يعني أن الطريقة يجب أن تعود 1 ، إذا كان الأمر كذلك ، فإننا نعود صحيحًا ، وإلا
insertuser boolean العامة (مستخدم المستخدم) {connector connector = new connector () ؛ اتصال الاتصال = connector.getConnection () ؛ حاول {ReparedStatement ps = connection.preparestatement ("insert في قيم المستخدم (null ،؟ ،؟)") ؛ ps.SetString (1 ، user.getName ()) ؛ ps.SetString (2 ، user.getPass ()) ؛ ps.SetInt (3 ، user.getage ()) ؛ int i = ps.executeupdate () ؛ if (i == 1) {return true ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع خطأ ؛}طريقة التحديث
تشبه طريقة التحديث طريقة إدراج. التغيير الوحيد هو بيان SQL
Boolean Public UpdateUser (مستخدم المستخدم) {Connector Connector = New Connector () ؛ اتصال الاتصال = connector.getConnection () ؛ حاول {ReparedStatement ps = connection.preparestatement ("تحديث اسم مجموعة المستخدم =؟ ps.SetString (1 ، user.getName ()) ؛ ps.SetString (2 ، user.getPass ()) ؛ ps.SetInt (3 ، user.getage ()) ؛ ps.SetInt (4 ، user.getId ()) ؛ int i = ps.executeupdate () ؛ if (i == 1) {return true ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع خطأ ؛}طريقة حذف
طريقة حذفها هي استخدام استعلام بسيط مثل
حذف من المستخدم حيث معرف = 7
سيؤدي إرسال هذا السجل إلى إرسال هذا السجل. إذا تم حذفها بنجاح ، فسيتم إرجاع 1
الحذف المنطقي العام (int id) {connector connector = new Connector () ؛ اتصال الاتصال = connector.getConnection () ؛ حاول {statle stmt = connection.createstatement () ؛ int i = stmt.executeupdate ("حذف من المستخدم حيث id =" + id) ؛ if (i == 1) {return true ؛ }} catch (sqlexception ex) {ex.printStackTrace () ؛ } إرجاع خطأ ؛}شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!