الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اداة لانشاء اصناف (classes) للربط مع قاعدة البيانات

بدأه العيافـي في 22 أبريل 2010 · 15 رد · 2,898 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ...

من الاوقات المزعجة لي عندما اقوم بانشاء برنامج هو ربطه بقاعدة البيانات ..

بحثت في الانترنت عن ادوات لتحل لي هذه المشكله، ووجدت عدد قليل منها ولكنها تولد لي ملفات لا حاجه لي بها ، كما انها تستخدم المصفوفات (Array) بدلا من القوائم (List) ، ولا تقوم بتطبيق العمومية (Generics).

لذلك قمت بانشاء هذه الاداة لتوفر لي الوقت و تريحني من كتابة الكود .. واتمنى ان يتم تطويرها في هذا المنتدى لتأدي العمل المرضي

post-82434-12719270973739_thumb.gif

طريقة العمل

سأفرض ان لدي جدول في قاعدة بيانات باسم student و يحتوي هذا الجدول على (id, name, password, email, note)

ستقوم الاداة بتوليد الاصناف التالية

1- صنف يمثل الجدول باسم Student

public class Student {
	private int id;
	private String name;
	private String password;
	private String email;
	private String note;

	// getters 
	....
	// setters 
	....
}

2 - صنف للاتصال بقاعدة البيانات وتنفيذ الاوامر الرئيسية في SQL و هو مقسم الى 3 اقسام

الاول ويحتوي على طريقة تعود بكائن من الصنف Connection

public class DAO {
	protected DAO() {
	}
	protected Connection getDirectConnection() throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/rich?user=root&password=");
	}
}

والثاني يحتوي على طرق لتنفيذ اوامر SQL كما انه يرث الصنف السابق (DAO)

public class StudentDAO extends DAO {

	//getBean
	public Student getStudent(int pk) throws SQLException, ClassNotFoundException{
		Student bean=null;
		PreparedStatement preparedStatement=getDirectConnection().prepareStatement("SELECT * FROM Student WHERE id = ?");
		preparedStatement.setInt(1, pk);
		ResultSet resultSet = preparedStatement.executeQuery();
		if(resultSet.next()){
			bean=new Student();
						bean.setId(resultSet.getInt(1));
			bean.setName(resultSet.getString(2));
			bean.setPassword(resultSet.getString(3));
			bean.setEmail(resultSet.getString(4));
			bean.setNote(resultSet.getString(5));

		}
		resultSet.close();
		preparedStatement.close();
		return bean;
	}

	//getAllBeans
	public List<Student> getAllStudent() throws SQLException, ClassNotFoundException{
		List<Student> list=new ArrayList<Student>();
		PreparedStatement preparedStatement=getDirectConnection().prepareStatement("SELECT * FROM Student");
		ResultSet resultSet = preparedStatement.executeQuery();
		while(resultSet.next()){
			Student bean=new Student();
						bean.setId(resultSet.getInt(1));
			bean.setName(resultSet.getString(2));
			bean.setPassword(resultSet.getString(3));
			bean.setEmail(resultSet.getString(4));
			bean.setNote(resultSet.getString(5));

			list.add(bean);
		}
		resultSet.close();
		preparedStatement.close();
		return list;
	}

	//insert
	public int insert(Student bean) throws SQLException, ClassNotFoundException{
		PreparedStatement preparedStatement=getDirectConnection().prepareStatement("INSERT INTO Student (name, password, email, note) VALUES ( ?, ?, ?, ?)");
				preparedStatement.setString(1, bean.getName());
		preparedStatement.setString(2, bean.getPassword());
		preparedStatement.setString(3, bean.getEmail());
		preparedStatement.setString(4, bean.getNote());

		int result=preparedStatement.executeUpdate();
		preparedStatement.close();
		return result;
	}

	//update
	public int update(Student bean) throws SQLException, ClassNotFoundException{
		PreparedStatement preparedStatement=getDirectConnection().prepareStatement("UPDATE Student SET name = ? , password = ? , email = ? , note = ?  WHERE id = ?");
				preparedStatement.setString(1, bean.getName());
		preparedStatement.setString(2, bean.getPassword());
		preparedStatement.setString(3, bean.getEmail());
		preparedStatement.setString(4, bean.getNote());
		preparedStatement.setInt(5, bean.getId());

		int result=preparedStatement.executeUpdate();
		preparedStatement.close();
		return result;
	}

	//delete
	public int delete(int pk) throws SQLException, ClassNotFoundException{
		PreparedStatement preparedStatement=getDirectConnection().prepareStatement("DELETE FROM Student WHERE id = ?");
		preparedStatement.setInt(1, pk);
		int result=preparedStatement.executeUpdate();
		preparedStatement.close();
		return result;
	}	
}

الثالث و هو صنف لا يحتوي على اي طريقه ، ويرث الصنف السابق(StudentDAO). و يفضل استخدامة في المشروع بدلا من الصنف السابق (StudentDAO). كي لا تضيع التعديلات المضافة الجديدية في الصنف (StudentDAO) عند اعادة توليد الاصناف. فتكون الاضافاة الجديدية في هذا الصنف

public class StudentExtDAO extends StudentDAO {

}

قمت مؤخرا باضافة توليد لملفات EJB و غيرها ولكنها لم تكن هدف رئيسي من الاداه.

حاليا الاداه تدعم قاعدة البيانات MySQL ولم اجربها مع غيرها.

ارجوا من الجميع تجربتها و اضافة اقتراحاتكم لتطويرها ...

المرفق الاداه بصيغة JAR كما انه يحتوي على المصدر.

DAO_G.rar

5
#2

اولا : عمل جميل و ممتاز

نبدأ بالتحسينات ( دق الحديد و هو حامي)

1-driver class : يجب ان تكون comboBox و يحتوي على اشهر المشغلات و يمكن التعديل عليها

2- و كذلك نوع السرفر

و بالنسبة للعملية

يجب تحويل البرنامج لاسلوب الWizard

يمر بخطوات

و ليش كل البرنامج خطوة واحدة

جميل جميل اخ عيافي

#3

عمل رائع, بارك الله فيك,,

أظن من وجود أدوات تعمل بعمل مشابه,, على ما أتذكر, إسمها Spring Roo

في حاجه برضه إسمها http://www.andromda.org/ لكني لا أعرف متي التشابه أو الإختلاف مع أفكارك في هذه الأداه.

حقيقة عمل رائع, إستمر يا أخي.

بالمناسبة, يعني إيه المصطلح delegate المكتوب في أخر الفورم ؟

تم تعديل هذه المشاركة بواسطة {هويدي} في 22 أبريل 2010 في 16:47

#4

عزيزى Mohammed Mshari Ersan

اقتباس

نبدأ بالتحسينات ( دق الحديد و هو حامي)

1-driver class : يجب ان تكون comboBox و يحتوي على اشهر المشغلات و يمكن التعديل عليها

2- و كذلك نوع السرفر

و بالنسبة للعملية

يجب تحويل البرنامج لاسلوب الWizard

بالنسبة للتحسينات التي ذكرتها هي موجوده في خطة تحسين الاداه.

بانسبة لل wizard لم تكن في بالي من قبل ولكن ان شاء الله تعالى سأضيفاه في الاصدار القادم . خاصة اني وجدت مكتبة توفر لي ذلك wizard.jar

عزيزي هويدي

اقتباس
بالمناسبة, يعني إيه المصطلح delegate المكتوب في أخر الفورم ؟

هذه الحزمة للترتيب الاصناف الناتجة من الاداه فقط. مفيدة عندما تولد EJB فهي تقوم بنحميل صنف EJB مره واحده .

اما اذا كانت تقوم ببرمجة برنامج لسطح المكتب فلست بحاجة هذه الحزمة.

#5

قمت بإضافة الموضوع إلى المواضيع المميزة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

شكرا عزيزي علاء

المرفق هو الاصدار 0.1.1 تم اضافة Wizard + تحسين بعض الاوامر

post-82434-12722300771079_thumb.gif

الاصدار القادم سيتم دعم بقية قواعد البيانات ان شاء الله تعالى..

DAO_G.rar

1
#7

شكراً على الملاحظة أخ هويدي !

تبدو هذه الـ roo شيء رائع بالفعل !

أتنمى من جميع المهتمين الاطلاع عليها:

الموقع الرسمي: http://www.springsource.org/roo

في ويكيبيديا: http://en.wikipedia.org/wiki/Spring_Roo

_________________________________

لم أنجح بتجربة الحزمة :(

عندي قاعدة بيانات MySQL صغيرة تدعى samples تحوي جدول وحيد:

CREATE TABLE `samples`.`student` (
  `studentid` INT  NOT NULL AUTO_INCREMENT,
  `startyear` INT  NOT NULL,
  `studentname` VARCHAR(30)  CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`studentid`)
)
ENGINE = InnoDB;

لكني أحصل على هذا الاستثناء:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'samples.Student' doesn't exist
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3172)
	at com.mysql.jdbc.Statement.executeQuery(Statement.java:1197)
	at com.mysql.jdbc.DatabaseMetaData$7.forEach(DatabaseMetaData.java:3791)
	at com.mysql.jdbc.DatabaseMetaData$IterateBlock.doForAll(DatabaseMetaData.java:76)
	at com.mysql.jdbc.DatabaseMetaData.getPrimaryKeys(DatabaseMetaData.java:3775)
	at com.arabteam.db.DBConnection.loadDataBase(DBConnection.java:96)
	at com.arabteam.utils.Utils.mapToGenerate(Utils.java:46)
	at com.arabteam.gui.panel.wizard.DAOProducer.finish(DAOProducer.java:40)
	at org.netbeans.spi.wizard.WizardPage$WPP.finish(WizardPage.java:953)
	at org.netbeans.spi.wizard.SimpleWizardInfo.finish(SimpleWizardInfo.java:145)
	at org.netbeans.spi.wizard.SimpleWizard.finish(SimpleWizard.java:177)
	at org.netbeans.spi.wizard.Wizard.finish(Wizard.java:222)
	at org.netbeans.api.wizard.displayer.NavButtonManager.processFinishProceed(NavButtonManager.java:486)
	at org.netbeans.api.wizard.displayer.NavButtonManager.processFinish(NavButtonManager.java:470)
	at org.netbeans.api.wizard.displayer.NavButtonManager.actionPerformed(NavButtonManager.java:278)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
....

اختبار الاتصال بقاعدة البيانات يتم بنجاح

وبعد هذا الاستثناء أحصل على رسالة done ويتم إنشاء ملف DAO يحوي:

package arabteam.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// author

 /*
  *@author: [alaiafi] /index.php?showforum=43
  *@version 0.1.1
 */



public class DAO {

	protected DAO() {
	}

	protected Connection getDirectConnection() throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/samples?user=root&password=");
	}
}
#8

post-111465-12722908481046_thumb.gif

حاول ان تختصر الاخطاء

يمكنك عمل Dialog يحتوي على TextField

تظهر فيه الاخطاء كخيار More Detail

;)

والله خبير عيافي

ما شاء الله

#9

عسى ما شر اخوي Mohammed Mshari Ersan اذا فيه شي مزعلك خبرني عنه عشان اسوية كل يوم ..... :mad: ضايف صورة استثناء كبر الشاشة و كمان الخلفية استثناء هذي باين عليها حرب .

على العموم مشكور على فكرة Dialog ، دائما افكارك رائعة. ;)

عزيزي Speed_Of_Light

حاولت توليد الاستثناء الى ظهر معك و لم استطع

هل تستخدم نظام تشغيل غير وندوز؟. اذا كان هذا صحيحا فارجوا منك اعادة المحاول بعد تعديل اسم الجدول الى Student

انا في انتظارك شكرا،،

تم تعديل هذه المشاركة بواسطة العيافـي في 26 أبريل 2010 في 21:51

#10
العيافـي كتب:

عزيزي Speed_Of_Light

حاولت توليد الاستثناء الى ظهر معك و لم استطع

هل تستخدم نظام تشغيل غير وندوز؟. اذا كان هذا صحيحا فارجوا منك اعادة المحاول بعد تعديل اسم الجدول الى Student

انا في انتظارك شكرا،،

نعم أستخدم Ubuntu Linux

أعدت المحاولة بعد تعديل اسم الجدول ونجح الأمر !! :lol:

ما السبب يا ترى؟!

#11

شكرا لك اخي Speed

عندما اقوم بقرائة الجداول من قاعدة البيانات اقوم بالتأكد من حالة الحرف الاول من اسم الجدول، فاذا كان الحرف صغير اقوم بتحويل حالته الى كبير، ليناسب تسمية الاصناف في جافا.

معتمد على ان نظام الويندوز يساوي بين الحرفين، ولم اكن اعلم بان الامر مختلف في لينكس. اما ما حصل معك عزيزي speed فان الجدول في قاعدة البيانات لديك هو student اما ما تم الاستعلام عنه من قاعدة البيانات في الشفره فهو Student

ساقوم بالتعديل على الشفره ليناسب مستخدمي انظمة التشغيل الاخرى .

كما اني اشك بان اسماء الاصناف التي تم انشائها لديك غير صحيحة ، هل هذا صحيح؟

شكرا لك اخي العزيزي فقد اخذت من وقتك .!

لا اعتقد باني استطيع التعديل عليه خلال هذه الايام بسبب انشغالي هذه الفترة .

#12

هذه النسخة رقم 0.1.3 تحتوي على تعديل للمشكله التي ضهرت للاخ speed على نظام التشغيل اوبنتو

في الاصدار القادم ان شاء الله سيكون هناك توليد لل GUI

ONE-DAOGenerator-0.1.3.zip

1
#13

اخى عثمان

معذره انا اعرف ان الموضوع قديم جدا

لكن انا اريد احياءه

بسوالى ما هى ملفات الtmp الموجوده داخل الكود

حيث تقريبا هى تعبر عن template لكنى لم اتفهم كيف تعمل

ممكن تشرح ماذا تعنى هذه ؟؟؟؟؟؟ وكيفيه عملها

وشكرا

Software Developer
Mahmoudkelany.com


 

#14

اعتذر عزيزي محمود عن التاخير فانا مشغول خلال هذه الايام.

عزيزي محمود الملفات التي تذكرها هي عباره عن قوالب.

اقوم بتحويلها الى String ثم اقوم باستبدال s% بالقيمه المناسبه باستخدام String.format

لو وجدت وقت لتعديل على الاداه لاستخدمت الحزمة StringTemplate

على فكره هذا ما قمت به انت في برنامجك ولكن الفرق انك استخدمتها مباشره في كود الجافا.

#15
العيافـي كتب:

اعتذر عزيزي محمود عن التاخير فانا مشغول خلال هذه الايام.

عزيزي محمود الملفات التي تذكرها هي عباره عن قوالب.

اقوم بتحويلها الى String ثم اقوم باستبدال s% بالقيمه المناسبه باستخدام String.format

لو وجدت وقت لتعديل على الاداه لاستخدمت الحزمة StringTemplate

على فكره هذا ما قمت به انت في برنامجك ولكن الفرق انك استخدمتها مباشره في كود الجافا.

لا داعى للاعتزار

اقدر انشغالك اخى عثمان

فهمت قصدك الان

انا كنت بحسب ان هناك شىء جديد فى البرمجه انت قومت به

لكن بصراحه فهو جديد ايضا

فكره ممتازه :)

وصلت فكرتك , تسلم عليها

Software Developer
Mahmoudkelany.com


 

#16

عمل رائع اخي عثمان بارك الله فيك +1


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

مواضيع مشابهة