كلاس بالجافا لتسهيل عملية الإتصال ب mysql مع مشروع تطبيقي

سهولة و تنظيم الكود تعتبر من الخصائص التي يجب العمل عليها عند إنشاء أي تطبيق أو مشروع برمجي معين , لذلك يجب تجنب تكرار الكود , بإنشاء دوال function قصد الصد لهذا المشكل.
كلاس بالجافا لتسهيل عملية الإتصال ب mysql مع مشروع تطبيقي

تم تعديل هذه المشاركة بواسطة Snack3r في 7 نوفمبر 2013 في 02:01 — السبب: حذف روابط التحميل الخارجية و وضع المحتوى في المرفقات.
السلام عليكم
أهلا بك أخي الكريم في منتديات الفريق العربي للبرمجة :)
بداية, المكان المناسب لموضوعك هو قسم JavaSE و ليس JEE لذا تم النقل إلى القسم المناسب.
لدي ملاحظات بسيطة على الأكواد :
public Connect(String url, String user, String password) {
this.url = url;
this.user = user;
this.password = password;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException cnfe) {
JOptionPane.showMessageDialog(null, "Impossible de charger le pilote",
"Pilote introuvable", JOptionPane.ERROR_MESSAGE, null);
} catch (SQLException sqle) {
JOptionPane.showMessageDialog(null, "Une erreur est survenue lors l'ouverture de connexion",
"Impossible d'ouvrir la connexion", JOptionPane.ERROR_MESSAGE, null);
}
}if (cnx == null) { return;}import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.TitledBorder;
public class FenetrePrincipale extends JFrame {
private JMenuBar menuBar = new JMenuBar();
private JMenu fichier = new JMenu("Fichier"), edition = new JMenu("Edition"), projet = new JMenu("Projet"),
executer = new JMenu("Executer"), outils = new JMenu("Outils"), aide = new JMenu("Aide");
private JMenuItem about = new JMenuItem("A propos de");
private JMenuItem exit = new JMenuItem("Quitter"), deconnect = new JMenuItem("Se déconnecter");
private Container contenu = this.getContentPane();
private JPanel panHaut, panCenter, superPanCenter, panBas;
private JLabel Lprenom, Lnom, Lsexe, LdateNais, LnumMle, LdateEmbauche;
private JTextField Tprenom, Tnom, TnumMle;
private JComboBox comboSexe, comboJourNais, comboMoisNais, comboAnneeNais,
comboJourEmbauche, comboMoisEmbauche, comboAnneeEmbauche;
private String[] titreColonnes = {"Prénom", "Nom", "Sexe", "Date_Nais", "NumMle", "Date_Embauchée"};
private Object[][] donnees = {
{"Mohamed", "AHMED", "Homme", "01-02-1992", "4507", "01-15-2012"},
{"Maarouf", "Najwa", "Femme", "03-09-1983", "119", "7-19-2006"},
{"Moustapha", "WARDA", "Femme", "08-25-1977", "857", "04-12-2001"},
{"Khaled", "HACEN", "Homme", "06-17-1988", "108", "01-03-2008"},
{"Jemal", "ZAHRA", "Femme", "06-11-1990", "730", "02-05-2103"}};
private JTable table;
private JScrollPane js;
private JButton infosBase, enregBase;
public FenetrePrincipale(String titre) {
setTitle(titre);
setSize(500, 550);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
initCompenents();
setVisible(true);
}
static {
lookAndFeel();
}
public static void lookAndFeel() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
}
private void createMenu() {
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg) {
System.exit(0);
}
});
deconnect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg) {
int reponse = JOptionPane.showConfirmDialog(null, "Êtes-vous certain de vouloir vous déconnecter ?",
"Confirmation de Déconnexion", JOptionPane.YES_NO_OPTION);
}
});
fichier.add(exit);
fichier.add(deconnect);
about.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg) {
JDialog info = new JDialog();
info.setModal(true);
info.setTitle("About");
info.setSize(270, 150);
info.setLocationRelativeTo(null);
JLabel texte = new JLabel("<html><body> Cette application est développée en JavaSE par<BR>"
+ "<center><B>Mr. Ahmed Ould Mohamed (Snack3r)</B><BR><HR WIDTH = 70%>"
+ " E-mail : ahmed.ould_mohamed@yahoo.fr</center></body></html>");
info.add(texte);
info.setVisible(true);
info.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
});
aide.add(about);
menuBar.add(fichier);
menuBar.add(edition);
menuBar.add(projet);
menuBar.add(executer);
menuBar.add(outils);
menuBar.add(aide);
setJMenuBar(menuBar);
}
private void initPanHaut() {
panHaut = new JPanel(new BorderLayout(10, 20));
panHaut.setPreferredSize(new Dimension(390, 170));
Lprenom = new JLabel("Prenom");
Lnom = new JLabel("Nom");
Lsexe = new JLabel("Sexe");
LdateNais = new JLabel("Date Nais");
LnumMle = new JLabel("NumMle");
LdateEmbauche = new JLabel("Date Embauchée");
JPanel panelTextPrenom = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5));
Tprenom = new JTextField();
Tprenom.setPreferredSize(new Dimension(250, 20));
panelTextPrenom.add(Tprenom);
JPanel panelTextNom = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5));
Tnom = new JTextField();
Tnom.setPreferredSize(new Dimension(200, 20));
panelTextNom.add(Tnom);
JPanel panelTextNum = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5));
TnumMle = new JTextField();
TnumMle.setPreferredSize(new Dimension(100, 20));
panelTextNum.add(TnumMle);
comboSexe = new JComboBox();
comboSexe.addItem("Masculin");
comboSexe.addItem("Feminin");
JPanel panelComboSexe = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
panelComboSexe.add(comboSexe);
comboJourNais = new JComboBox();
for (int i = 1; i < 32; i++) {
comboJourNais.addItem(i);
}
comboMoisNais = new JComboBox();
comboMoisNais.addItem("Janvier");
comboMoisNais.addItem("Fevrier");
comboMoisNais.addItem("Mars");
comboMoisNais.addItem("Avril");
comboMoisNais.addItem("Mai");
comboMoisNais.addItem("Juin");
comboMoisNais.addItem("Juillet");
comboMoisNais.addItem("Aout");
comboMoisNais.addItem("Septembre");
comboMoisNais.addItem("Octobre");
comboMoisNais.addItem("Novembre");
comboMoisNais.addItem("Decembre");
comboAnneeNais = new JComboBox();
for (int i = 1954; i < 1993; i++) {
comboAnneeNais.addItem(i);
}
JPanel panelComboNais = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
panelComboNais.add(comboJourNais);
panelComboNais.add(comboMoisNais);
panelComboNais.add(comboAnneeNais);
comboJourEmbauche = new JComboBox();
for (int i = 1; i < 32; i++) {
comboJourEmbauche.addItem(i);
}
comboMoisEmbauche = new JComboBox();
comboMoisEmbauche.addItem("Janvier");
comboMoisEmbauche.addItem("Fevrier");
comboMoisEmbauche.addItem("Mars");
comboMoisEmbauche.addItem("Avril");
comboMoisEmbauche.addItem("Mai");
comboMoisEmbauche.addItem("Juin");
comboMoisEmbauche.addItem("Juillet");
comboMoisEmbauche.addItem("Aout");
comboMoisEmbauche.addItem("Septembre");
comboMoisEmbauche.addItem("Octobre");
comboMoisEmbauche.addItem("Novembre");
comboMoisEmbauche.addItem("Decembre");
comboAnneeEmbauche = new JComboBox();
for (int i = 1954; i < 2011; i++) {
comboAnneeEmbauche.addItem(i);
}
JPanel panelComboEmbauche = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
panelComboEmbauche.add(comboJourEmbauche);
panelComboEmbauche.add(comboMoisEmbauche);
panelComboEmbauche.add(comboAnneeEmbauche);
JPanel panelWest = new JPanel(new GridLayout(6, 1));
panelWest.add(Lprenom);
panelWest.add(Lnom);
panelWest.add(Lsexe);
panelWest.add(LdateNais);
panelWest.add(LnumMle);
panelWest.add(LdateEmbauche);
panHaut.add(panelWest, BorderLayout.WEST);
JPanel panelCentre = new JPanel(new GridLayout(6, 1));
panelCentre.add(panelTextPrenom);
panelCentre.add(panelTextNom);
panelCentre.add(panelComboSexe);
panelCentre.add(panelComboNais);
panelCentre.add(panelTextNum);
panelCentre.add(panelComboEmbauche);
panHaut.add(panelCentre, BorderLayout.CENTER);
}
private void initCompenents() {
createMenu();
initPanHaut();
panCenter = new JPanel();
table = new JTable(donnees, titreColonnes);
js = new JScrollPane(table);
js.setPreferredSize(new Dimension(480, 320));
panCenter.add(js);
panCenter.setBorder(new TitledBorder("Infos sur la Base"));
superPanCenter = new JPanel(new BorderLayout());
superPanCenter.add(panHaut, BorderLayout.NORTH);
superPanCenter.add(panCenter, BorderLayout.CENTER);
panBas = new JPanel();
panBas.setPreferredSize(new Dimension(0, 35));
panBas.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY.darker(), 1));
infosBase = new JButton("Afficher le contenu de la base de données");
panBas.add(infosBase);
enregBase = new JButton("Enregistrer un employé");
panBas.add(enregBase);
contenu.setLayout(new BorderLayout());
contenu.add(superPanCenter, BorderLayout.CENTER);
contenu.add(panBas, BorderLayout.SOUTH);
}
public static void main(String args[]) {
new FenetrePrincipale("By Snack3r");
}
}
بالمناسبة, قمتُ بالضغط غلطا على زر -1 بدلا من +1 لذا أعتذر لك.
تحياتي.
تم تعديل هذه المشاركة بواسطة Snack3r في 7 نوفمبر 2013 في 03:09
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
أخي الكريم..
أولا أشكرك على مجهودك للبحث عن الأخطاء الموجودة في التطبيق.
بالنسبة لي قمت بالضغط على زر -1 أو +1 لا يهمني. وبذلك إعتذارك غير ضروري.
ثانيا : أنا قمت بعمل معلومات الإتصال داخل constructeur لأنني لا أريد كل مرة أقوم بالإتصال بقاعدة البيانات أدخل المعلومات من جديد مثلا إذا كان مشروعي فيه 100 كلاس يعني سأدخل معلومات الإتصال 100 مرة.؟؟؟
بالنسبة ل exceptions أنا لا أحب إضهار رسائل الجافا لذلك لم أقم بإضهارها من أجل التطرق إلى كيفية تسيير exceptions في موضوع لاحق.
close تتم بشكل آلي ليس مثل الفيجوال بيسيك التي من الضروري عمل close.
أما في ما يخص الملاحضات الأخرى في رأيي غير مهمة.
أنا فقط قمت بطرح كلاس مبسط لتفادي تكرار كود.
في أمان الله
اقتباسأنا قمت بعمل معلومات الإتصال داخل constructeur لأنني لا أريد كل مرة أقوم بالإتصال بقاعدة البيانات أدخل المعلومات من جديد مثلا إذا كان مشروعي فيه 100 كلاس يعني سأدخل معلومات الإتصال 100 مرة.؟؟؟
الهدف من تمرير معلومات الاتصال إلى الـ constructor هو اتاحة إمكانية الاتصال بأي قاعدة بيانات و ليس فقط تلك الخاصة بك, خصوصاً إذا كنت تود الاتصال 100 مرة بقواعد بيانات مختلفة :)
اقتباسclose تتم بشكل آلي ليس مثل الفيجوال بيسيك التي من الضروري عمل close.
هل تعتقد أن استدعاء close يُكافئ العمل الذي يقوم يه الــ Garbage Collector ؟
الدالة close تقوم مباشرة بتحرير الـ stream و تحرير الموارد (resources) التي كان يستخدمها. أما إذا تركنا الأمر لـ GC فلا نعلم بالضبط متى يقوم بتحرير الذاكرة فقد يظل الكائن في حالة "to destroy" حتى نهاية البرنامج ..
الـ GC يقوم بإدارة و تسيير الموارد بشكل احتياطي و لا يحل محل الدوال التي تقوم بتحرير الذاكرة و إلا لما احتاج مصممو جافا الى اختراعها أساسا ..
تم تعديل هذه المشاركة بواسطة Snack3r في 8 نوفمبر 2013 في 16:18
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
Snack3r كتب:الهدف من تمرير معلومات الاتصال إلى الـ constructor هو اتاحة إمكانية الاتصال بأي قاعدة بيانات و ليس فقط تلك الخاصة بك, خصوصاً إذا كنت تود الاتصال 100 مرة بقواعد بيانات مختلفة :)
أووووكي
ماهي أحسن طريقة :
- هل عندما أضع instance ل object في 100 كلاس أمرر معلومات البيانات في كللللل كلاس
;("public cnx = new connexion("root","login","pass
- أممم أقوم فقط بعمل
;()public cnx = new connexion
?????
مثلا إذا كنت أريد نقل تطبيقي إلى جهاز آخر لا يملك نفس معلومات الإتصال بقاعدة البيانات
سأددددددددددخل إلى 100 كلاسسسس و أحرر كل instance
أو فقط سأدخل ل class connexion وأقوم بتحرير المعلومات الإتصال بقاعدة البيانات مرة واااحدة ????
حتى يكون النقاش مفيداً, هل اتفقنا على وجوب استخدام الدالة close لتحرير الذاكرة ؟ :)
اقتباسمثلا إذا كنت أريد نقل تطبيقي إلى جهاز آخر لا يملك نفس معلومات الإتصال بقاعدة البيانات
تغيير معلومات الاتصال بقواعد البيانات لا علاقة له بتغيير الجهاز فقد تختلف معلومات الاتصال داخل نفس الكود إذا كان البرنامج يعمل على أكثر من قاعدة بيانات.
اقتباسسأددددددددددخل إلى 100 كلاسسسس و أحرر كل instance
لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال :)
حسب برنامجك, لا يمكن لعمليات الاستدعاء ان تتعدى أربعة، وفقا للعمليات الاربعة المتعارف عليها باسم CRUD. إن كنت تتحدث عن برنامج آخر يحتاج إلى 100 اتصال بقاعدة البيانات فلكل مقام مقال ..
اقتباسأو فقط سأدخل ل class connexion وأقوم بتحرير المعلومات الإتصال بقاعدة البيانات مرة واااحدة ?
هذا بافتراض أنك تعمل على قاعدة بيانات واحدة، لكن في المقابل، ستجد أن الفئة connection لا يمكنها العمل مع أكثر من قاعدة بيانات دون تمرير الوسائط لدالة البناء و هذا ما أردتُ لفت انتباهك إليه.
مع تمرير الوسائط يمكننا العمل على قاعدة بيانات واحدة أو أكثر أما بدون تمريرها فيمكننا العمل على قاعدة بيانات واحدة فقط.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
fadabd كتب:أووووكي
ماهي أحسن طريقة :
- هل عندما أضع instance ل object في 100 كلاس أمرر معلومات البيانات في كللللل كلاس
;("public cnx = new connexion("root","login","pass
- أممم أقوم فقط بعمل
;()public cnx = new connexion
?????
مثلا إذا كنت أريد نقل تطبيقي إلى جهاز آخر لا يملك نفس معلومات الإتصال بقاعدة البيانات
سأددددددددددخل إلى 100 كلاسسسس و أحرر كل instance
أو فقط سأدخل ل class connexion وأقوم بتحرير المعلومات الإتصال بقاعدة البيانات مرة واااحدة ????
اخي تستطيع كتابة constructor جديد كما ذكر لك الاخ بدون ان تستغني عن constructor الذي كتبته
Snack3rو بالتالي يكون عند 2 constructors للاوبجيكت Connexion و انت تختار حسب الحالة
اقتباس
حتى يكون النقاش مفيداً, هل اتفقنا على وجوب استخدام الدالة close لتحرير الذاكرة ؟ :)
بما أن instance ل connexion يكون public في كلاس jTable الذي أستخدمه في مشروعي
يعني أن هذا object أشتغل عليه في التطبيق كامل ( ()addDate(), updateDate() , deleteDate ...)
ف close سيكون عند تغيير jTable أو إغلاق مشروعي
إذن هنا يتدخل Grabage Collector لإزالة ال object
فتصبح close غير مهمة.
اقتباس
لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال :)
حسب برنامجك, لا يمكن لعمليات الاستدعاء ان تتعدى أربعة، وفقا للعمليات الاربعة المتعارف عليها باسم CRUD. إن كنت تتحدث عن برنامج آخر يحتاج إلى 100 اتصال بقاعدة البيانات فلكل مقام مقال ..
اقتباس
هذا بافتراض أنك تعمل على قاعدة بيانات واحدة، لكن في المقابل، ستجد أن الفئة connection لا يمكنها العمل مع أكثر من قاعدة بيانات دون تمرير الوسائط لدالة البناء و هذا ما أردتُ لفت انتباهك إليه.
مع تمرير الوسائط يمكننا العمل على قاعدة بيانات واحدة أو أكثر أما بدون تمريرها فيمكننا العمل على قاعدة بيانات واحدة فقط.
هنا يجب عليك إعادة قراءة العنوان الذي اخترته للموضوع.
كلاس بالجافا لتسهيــــــــــــــــل عملية الإتصال بmysql
مع مشروع تطبيقي (هنا الغرض من المشروع التطبيقي فقط توضيح كيفية عمل هذا الكلاس)
لماذا هذا الكلام كله، لكي أوضح لك أن عند إنشاء مشروع كبييير (الجواب على 'لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال' ) سيكون لديك مشكل إذا كنت تريد تغيير معلومات قاعدة البيانات و كذلك يكون هناك تكرار في إدخال هذه المعلومات.
فمشروع تطبيقي واااحد أستخدم فيه فقط قاعدة بيانات واحدة
اقتباس
اخي تستطيع كتابة constructor جديد كما ذكر لك الاخ بدون ان تستغني عن constructor الذي كتبته
Snack3rو بالتالي يكون عند 2 constructors للاوبجيكت Connexion و انت تختار حسب الحالة
نعم أخي معك حق إذا كنت بحاجة للإتصال مع قاعدة بيانات أخرى
يمكنك إضافة Parameter Constructor
غالبا في مشروع تطبيقي واحد نقوم بالإتصال مع قاعدة بيانات واحدة فنادرا ما نستعمل أكثر
اقتباسبما أن instance ل connexion يكون public في كلاس jTable الذي أستخدمه في مشروعي
يعني أن هذا object أشتغل عليه في التطبيق كامل ( ()addDate(), updateDate() , deleteDate ...)
ف close سيكون عند تغيير jTable أو إغلاق مشروعي
إذن هنا يتدخل Grabage Collector لإزالة ال object
فتصبح close غير مهمة.
إذا كانت close غير مهمة فهذا يعني أحد أمرين :
في أمان الله ..
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…