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

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

بدأه fadabd في 6 نوفمبر 2013 · 9 رد · 3,603 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

 
 
java-mysql-connection.png

سهولة و تنظيم الكود تعتبر من الخصائص التي يجب العمل عليها عند إنشاء أي تطبيق أو مشروع برمجي معين , لذلك يجب تجنب تكرار الكود , بإنشاء دوال function قصد الصد لهذا المشكل.
لهذا الغرض قمنا بإنشاء كلاس بالجافا للإتصال بقاعدة البيانات mysql التي تحتوي على مجموعة من الدوال method هذه الأخيرة تقوم بعمل تحديث للمعلومات المتواجدة في قاعدة البيانات (إنشاء, تحرير, مسح ...). كود الكلاس تجدونه في المرفقات.
 
إذن بعد إضافة هذه الكلاس إلى المشروع البرمجي يصبح التعامل معmysql  غاية في السهولة. مثلا إذا أردت أن أتصل بقاعدة البيانات و أقوم بإدخال معطيات data  إليها فقط سأنشئ نسخة من الكلاس في متغير و بعدها سأستعمل دالة الإضافة أو الإنشاء و بذلك أكون قد أضفت المعلومات إلى قاعدة البيانات بسطرين من الكود.
الآن سنأتي إلى تطبيق الكلاس في مشروع "إدارة الطلبة" student Management, إليكم المراحل:
- إنشاء قاعدة بيانات بإسم studentManagementDB.
- إنشاء مشروع بالجافا بإسم studentManagement.
- تصميم الفورم أو واجهة المشروع.
- وضعنا كلاس التي تحدثنا عنها باسم Connexion  و قمنا باستراد ملفي Jar الأول للإتصال بقاعدة البيانات و الثاني للتعامل مع الجدول الذي سنعرض فيه البيانات, ثم بعدها سنحرر كل من إسم قاعدة البيانات و إسم مستخدم قاعدة البيانات و كلمة المرور المتواجدة في الكلاس Connexion.
- برمجة الأزرار المتواجدة في المشروع باستعمال دوال كلاس Connexion.
 
إليكم صورة هذا المشروع :
 
studentManagement.png
 
 
لتحميل المشروع

تم تعديل هذه المشاركة بواسطة Snack3r في 7 نوفمبر 2013 في 02:01 — السبب: حذف روابط التحميل الخارجية و وضع المحتوى في المرفقات.

3 −1
#2

السلام عليكم

أهلا بك أخي الكريم في منتديات الفريق العربي للبرمجة :)

 

بداية, المكان المناسب لموضوعك هو قسم JavaSE و ليس JEE لذا تم النقل إلى القسم المناسب.

 

لدي ملاحظات بسيطة على الأكواد :

  • بالنسبة للفئة Connexion أعتقد أنه كان من الأفضل أن يتم تمرير معلومات الاتصال إلى الـ constructor بدلا من تخزينها في متغيرات بشكل استاتيكي.
  • أيضا, فصل الـ Exceptions عن بعضها البعض مُفيد جدا في التعرف على نوع الخطأ عند حدوثه. من الأحسن أن تكون الفئة Connexion  هكذا :
    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);
            }
    }
  • لكي تقوم الدوال addData, deleteData و updateData بعملية الإضافة, الحذف أو التغيير يجب أولا أن تتم عملية الإتصال بنجاح و بالتالي يجب التحقق من قيمة الكائن cnx, إذا كان يحتوي على العنوان null فهذا يدل على أن عملية الإتصال فشلت و بالتالي يتم الخروج من الدالة بعد طباعة رسالة تُوضح سبب الخطأ إن أردت :
    if (cnx == null) {	return;}
  • عند الانتهاء من عملية الإضافة, الحذف أو التغيير يجب عليك إغلاق الاتصال بقاعدة البيانات باستخدام الدالة close.
  • حاول أن تستفيد من القيمة المُعادة من طرف الدالة executeUpdate من خلال إظهار رسالة معينة توضح هل تمت العملية بنجاح أم لا.
  • من الأفضل إنشاء Model جديد لـ JTable عن طريق عمل extends للفئة AbstractTableModel حتى تتمكن من تخصيص الدوال كما تشاء.
  • ما دام الدرس تعليمي فمن الأفضل إنشاء الواجهة يدويا بدلا من رسمها في NetBeans.
    هذا مثال بسيط لواجهة مشابهة, كتبتُه قبل مدة :

    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>&nbsp;‎&nbsp;‎Cette application est développée en JavaSE par<BR>"
                            + "<center><B>Mr. Ahmed Ould Mohamed (Snack3r)</B><BR><HR WIDTH = 70%>"
                            + "&nbsp;‎&nbsp;‎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

#3

أخي الكريم..

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

بالنسبة لي قمت بالضغط على زر -1 أو +1 لا يهمني. وبذلك إعتذارك غير ضروري.

ثانيا : أنا قمت بعمل معلومات الإتصال داخل constructeur لأنني لا أريد كل مرة أقوم بالإتصال بقاعدة البيانات أدخل المعلومات من جديد مثلا إذا كان مشروعي فيه 100 كلاس يعني سأدخل معلومات الإتصال 100 مرة.؟؟؟

بالنسبة ل exceptions  أنا لا أحب إضهار رسائل الجافا لذلك لم أقم بإضهارها من أجل التطرق إلى كيفية تسيير exceptions في موضوع لاحق.

close تتم بشكل آلي ليس مثل الفيجوال بيسيك التي من الضروري عمل close.

أما في ما يخص الملاحضات الأخرى في رأيي غير مهمة.

أنا فقط قمت بطرح كلاس مبسط لتفادي تكرار كود.

في أمان الله

#4
اقتباس
أنا قمت بعمل معلومات الإتصال داخل constructeur لأنني لا أريد كل مرة أقوم بالإتصال بقاعدة البيانات أدخل المعلومات من جديد مثلا إذا كان مشروعي فيه 100 كلاس يعني سأدخل معلومات الإتصال 100 مرة.؟؟؟

 

 

الهدف من تمرير معلومات الاتصال إلى الـ constructor هو اتاحة إمكانية الاتصال بأي قاعدة بيانات و ليس فقط تلك الخاصة بك, خصوصاً إذا كنت تود الاتصال 100 مرة بقواعد بيانات مختلفة :)

 

اقتباس
close تتم بشكل آلي ليس مثل الفيجوال بيسيك التي من الضروري عمل close.

هل تعتقد أن استدعاء close يُكافئ العمل الذي يقوم يه الــ Garbage Collector ؟

الدالة close تقوم مباشرة بتحرير الـ stream و تحرير الموارد (resources) التي كان يستخدمها. أما إذا تركنا الأمر لـ GC فلا نعلم بالضبط متى يقوم بتحرير الذاكرة فقد يظل الكائن في حالة "to destroy" حتى نهاية البرنامج ..

الـ GC يقوم بإدارة و تسيير الموارد بشكل احتياطي و لا يحل محل الدوال التي تقوم بتحرير الذاكرة و إلا لما احتاج مصممو جافا الى اختراعها أساسا ..

تم تعديل هذه المشاركة بواسطة Snack3r في 8 نوفمبر 2013 في 16:18

#5
Snack3r كتب:

الهدف من تمرير معلومات الاتصال إلى الـ constructor هو اتاحة إمكانية الاتصال بأي قاعدة بيانات و ليس فقط تلك الخاصة بك, خصوصاً إذا كنت تود الاتصال 100 مرة بقواعد بيانات مختلفة :)

 

أووووكي 

ماهي أحسن طريقة :

- هل عندما أضع instance ل object في 100 كلاس أمرر معلومات البيانات في كللللل كلاس

  ;("public cnx = new connexion("root","login","pass

 

- أممم أقوم فقط بعمل 

;()public cnx = new connexion

?????

 

مثلا إذا كنت أريد نقل تطبيقي إلى جهاز آخر لا يملك نفس معلومات الإتصال بقاعدة البيانات 

سأددددددددددخل إلى 100 كلاسسسس و أحرر كل instance 

أو فقط سأدخل ل class connexion وأقوم بتحرير المعلومات الإتصال بقاعدة البيانات مرة واااحدة ????

#6

حتى يكون النقاش مفيداً, هل اتفقنا على وجوب استخدام الدالة close لتحرير الذاكرة ؟ :)

 

اقتباس
مثلا إذا كنت أريد نقل تطبيقي إلى جهاز آخر لا يملك نفس معلومات الإتصال بقاعدة البيانات

 

تغيير معلومات الاتصال بقواعد البيانات لا علاقة له بتغيير الجهاز فقد تختلف معلومات الاتصال داخل نفس الكود إذا كان البرنامج يعمل على أكثر من قاعدة بيانات.

 

اقتباس
سأددددددددددخل إلى 100 كلاسسسس و أحرر كل instance

 

لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال :)

حسب برنامجك, لا يمكن لعمليات الاستدعاء ان تتعدى أربعة، وفقا للعمليات الاربعة المتعارف عليها باسم CRUD. إن كنت تتحدث عن برنامج آخر يحتاج إلى 100 اتصال بقاعدة البيانات فلكل مقام مقال ..

 

اقتباس
أو فقط سأدخل ل class connexion وأقوم بتحرير المعلومات الإتصال بقاعدة البيانات مرة واااحدة ?

 

هذا بافتراض أنك تعمل على قاعدة بيانات واحدة، لكن في المقابل، ستجد أن الفئة connection لا يمكنها العمل مع أكثر من قاعدة بيانات دون تمرير الوسائط لدالة البناء و هذا ما أردتُ لفت انتباهك إليه.

مع تمرير الوسائط يمكننا العمل على قاعدة بيانات واحدة أو أكثر أما بدون تمريرها فيمكننا العمل على قاعدة بيانات واحدة فقط.

#7
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 و انت تختار حسب الحالة 

1
#8
اقتباس

 

حتى يكون النقاش مفيداً, هل اتفقنا على وجوب استخدام الدالة close لتحرير الذاكرة ؟  :)

 

بما أن instance ل connexion يكون public في كلاس jTable الذي أستخدمه في مشروعي

يعني أن هذا object أشتغل عليه في التطبيق كامل ( ()addDate(), updateDate() , deleteDate ...)

ف close سيكون عند تغيير jTable أو إغلاق مشروعي

إذن هنا يتدخل Grabage Collector لإزالة ال object 

فتصبح close غير مهمة.

 

اقتباس

 

لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال  :)

حسب برنامجك, لا يمكن لعمليات الاستدعاء ان تتعدى أربعة، وفقا للعمليات الاربعة المتعارف عليها باسم CRUD. إن كنت تتحدث عن برنامج آخر يحتاج إلى 100 اتصال بقاعدة البيانات فلكل مقام مقال ..

 

اقتباس

 

هذا بافتراض أنك تعمل على قاعدة بيانات واحدة، لكن في المقابل، ستجد أن الفئة connection لا يمكنها العمل مع أكثر من قاعدة بيانات دون تمرير الوسائط لدالة البناء و هذا ما أردتُ لفت انتباهك إليه.

مع تمرير الوسائط يمكننا العمل على قاعدة بيانات واحدة أو أكثر أما بدون تمريرها فيمكننا العمل على قاعدة بيانات واحدة فقط.

 

هنا يجب عليك إعادة قراءة العنوان الذي اخترته للموضوع.

كلاس بالجافا لتسهيــــــــــــــــل عملية الإتصال بmysql

مع مشروع تطبيقي (هنا الغرض من المشروع التطبيقي فقط توضيح كيفية عمل هذا الكلاس)

 

لماذا هذا الكلام كله، لكي أوضح لك أن عند إنشاء مشروع كبييير (الجواب على 'لا أدري لماذا تُصر على وجود 100 استدعاء لدالة البناء الخاصة بفئة الاتصال' ) سيكون لديك مشكل إذا كنت تريد تغيير معلومات قاعدة البيانات و كذلك يكون هناك تكرار في إدخال هذه المعلومات.

فمشروع تطبيقي واااحد أستخدم فيه فقط قاعدة بيانات واحدة

#9
اقتباس

 

 

اخي تستطيع كتابة constructor جديد كما ذكر لك الاخ  بدون ان تستغني عن constructor الذي كتبته

Snack3r

و بالتالي يكون عند 2 constructors للاوبجيكت Connexion و انت تختار حسب الحالة 

 

نعم أخي معك حق إذا كنت بحاجة للإتصال مع قاعدة بيانات أخرى

يمكنك إضافة Parameter Constructor 

غالبا في مشروع تطبيقي واحد نقوم بالإتصال مع قاعدة بيانات واحدة فنادرا ما نستعمل أكثر

#10
اقتباس

بما أن instance ل connexion يكون public في كلاس jTable الذي أستخدمه في مشروعي

يعني أن هذا object أشتغل عليه في التطبيق كامل ( ()addDate(), updateDate() , deleteDate ...)

ف close سيكون عند تغيير jTable أو إغلاق مشروعي

إذن هنا يتدخل Grabage Collector لإزالة ال object 

فتصبح close غير مهمة.

 

إذا كانت close غير مهمة فهذا يعني أحد أمرين :

  1. إما أن الـ project design التي اعتمدتها في مشروعك غير سليمة.
  2. أو أن مصممي جافا كان بإمكانهم الاستغناء عن close في ظل وجود الـ GC !!

 

في أمان الله ..

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…