IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Methode d'utilisation d'une BD


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Methode d'utilisation d'une BD
    Bonjour, je débute en java, je dois crée une petite application qui gère des personnes, et je ne sais pas trop comment gérer ma base de donnée (MySql) tout de moins je ne suis pas sur que ma methode soit vraiment dans les règle de l’art, il me semble que le mieu est d’utiliser un pool de connection. mon code marche mais bon. Bien sur vous me direz JavaDoc, mais pas de bol, mon english est tres mauvais . C’est pourquoi j’aurais souhaiter avoir votre avis sur celui-ci. Et savoir si cette methode est juste.

    Merci a vous

    Voici le code en question;

    Une class DataBase qui est un singleton qui initialise un MysqlConnectionPoolDataSource
    Et permet au autres class de récupéré une connection (d’un pool de connection i je me goure pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
     
    public class DataBase {
     
        private static DataBase instance;
        private MysqlConnectionPoolDataSource pooledDataSource;
     
        private DataBase(){
            System.out.println("Construct DataBase");
            this.initConectionPoolDataSource();    
        }
     
        public static DataBase getInstance(){        
            if (null == instance) {
                instance = new DataBase();
            }
            return instance;
        }
     
        public void initConectionPoolDataSource(){
            MysqlConnectionPoolDataSource pc = new MysqlConnectionPoolDataSource(); 
            pc.setServerName  ("localhost");    
            pc.setUser("root");
            pc.setPassword("");
            pc.setDatabaseName("database");        
            this.pooledDataSource = pc;      
        }
     
        public Connection getConnection() throws SQLException {        
           return this.pooledDataSource.getPooledConnection().getConnection();       
        } 
     
    }
    Une class Personne qui n’est en fait qu’un genre de bean (j’ai simplifier volontairement) avec un getter et setter pour chaque propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public class Personne {
     
        private int id;
        private String nom;
        private String prenom;
     
        public void setId(int id){
            this.id = id;
        }
     
        public int getId(){
            return this.id;
        }
     
         public void setNom(String nom){
            this.nom = nom;
        }
     
        public String getNom(){
            return this.nom;
        }
     
        public void setPrenom(String prenom){
            this.prenom = prenom;
        }
     
        public String getPrenom(){
            return this.prenom;
        }
     
     
    }
    Une class PersonneManager qui se charge de faire les requettes SQL ( a l’aide de DataBase) et instancie la class personne en concequence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    public class PersonneManager {
     
     
        public static Personne getPersonne(int id){
            String sql ="SELECT * FROM users WHERE id="+id; 
            Personne unePersonne = new Personne();
            DataBase db = DataBase.getInstance();        
            Connection conn = null;
     
            try{
     
              conn = db.getConnection();   
              Statement stmt = conn.createStatement(); 
              ResultSet rs = stmt.executeQuery(sql);
                while(rs.next()){
                  unePersonne.setId(rs.getInt("id"));
                  unePersonne.setNom(rs.getString("nom"));
                  unePersonne.setPrenom(rs.getString("prenom"));
                }
              conn.close();
     
            }catch(SQLException ex){
              System.out.println(ex);
            }
     
            return unePersonne;
        }
     
     
     
     
    }
    et la class Main que j'utilise pour l'instant juste pour tester en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Main {   
     
     
      public static void main(String[] args) {      
     
        Personne p = PersonneManager.getPersonne(5);
        System.out.println(p.getId() +" "+ p.getNom()+" "+p.getPrenom());       
     
      }
     
    }

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 89
    Points : 70
    Points
    70
    Par défaut
    Pourquoi ne pas utiliser Hibernate, ça t'evitera d'ecrire les classes DataBase et PersonneManager.

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par TheJoe Voir le message
    Pourquoi ne pas utiliser Hibernate, ça t'evitera d'ecrire les classes DataBase et PersonneManager.
    J'ai deja tester hibernate mais peut etre du au fait de je debute, cela me parait tres compliquer d'autre part dans un permier temp dans un but "de formation" je prefererais eviter d'utilier des libs externe

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    je vois que personne ne dit rien sur mon code !!? serait il parfait ?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    L'idée générale est bonne.

    N'oublie pas de mettre les fermetures de flux dans un bloc finally pour qu'en cas d'erreur, tu ne satures pas les connexions à la base.

    Pour ton Singleton, la méthode recommandée est plutôt celle-ci: (si mes souvenirs sont bons)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class DataBase {
     
        private final static DataBase instance = new DataBase();
     
        private DataBase(){
            System.out.println("Construct DataBase");
            this.initConectionPoolDataSource();    
        }
     
        public static DataBase getInstance(){        
            return instance;
        }
     
       etc...
    }

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par fr1man Voir le message
    L'idée générale est bonne.

    N'oublie pas de mettre les fermetures de flux dans un bloc finally pour qu'en cas d'erreur, tu ne satures pas les connexions à la base.
    Cela consite a modifier la methode getPersonne ainsi si je ne me trompe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
        public static Personne getPersonne(int id){
            String sql ="SELECT * FROM users WHERE id="+id; 
            Personne unePersonne = new Personne();
            DataBase db = DataBase.getInstance();        
            Connection conn = null;
     
            try{            
              conn = db.getConnection();   
              Statement stmt = conn.createStatement(); 
              ResultSet rs = stmt.executeQuery(sql);                           
                while(rs.next()){
                  unePersonne.setId(rs.getInt("id"));
                  unePersonne.setNom(rs.getString("nom"));
                  unePersonne.setPrenom(rs.getString("prenom"));                
                }         
            }catch(SQLException ex){
              System.out.println(ex);
            }finally{
               try{
                   conn.close();
               }catch(SQLException ex){
                   System.out.println(ex);
               }
            }
     
            return unePersonne;
        }
    D'autre part je suis un peut supris qu'on ne puissent pas determiner le nombre de connection maximum sur la base de donnée a moins que je n'ai pas trouve.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu peux aussi fermer ton statement et ton resultset.

    Pourquoi veux-tu gérer le nombre de connexions à la BD ?

  8. #8
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Pourquoi veux-tu gérer le nombre de connexions à la BD ?
    bien pour ne pas surcharger la bd, il me semble que dans la conf de MySql on peut regler le nombres de connection mais j'imagine qu'une fois cette limite atteinte l'aplis java vas cree une exception donc cela permetrais de l'eviter non ?

  9. #9
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Alors mes commentaires:

    - Renomme ta classe PersonneManager en PersonneDAO, celle-ci ayant pour vocation principale la persistance plus que la réalisation de services. C'est du pinaillage, hein

    - La classe PersonneManager ne devrait pas définir de méthodes statiques. Au besoin, définit un singleton, au mieux une fabrique.

    - Défini des constantes pour les propriétés persistées de ton objet métier Personne, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Personne {
            private final static String ID = "id";
            private final static String NOM = "nom";
            private final static String PRENOM = "prenom";
     
            private int id;
            private ....
        }
    - Extrait et constantifie tes requêtes sql et paramètre-les comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public class PersonneDAO {
     
        private static final String TABLE_NAME = "users";
     
        private static final String REQUEST_SELECT_BY_ID = "SELECT * FROM {0} WHERE id={1}";
     
        public Personne getPersonne(int id) {
            String sql = MessageFormat.format(REQUEST_SELECT_BY_ID, TABLE_NAME, id);
            Personne unePersonne = new Personne();
            DataBase db = DataBase.getInstance();
            Connection conn = null;
     
            try {
                conn = db.getConnection();
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                while (rs.next()) {
                    unePersonne.setId(rs.getInt(Personne.ID));
                    unePersonne.setNom(rs.getString(Personne.NOM));
                    unePersonne.setPrenom(rs.getString(Personne.PRENOM));
                }
            } catch (SQLException ex) {
                System.out.println(ex);
            } finally {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    System.out.println(ex);
                }
            }
     
            return unePersonne;
        }
     
    }
    - Si tu as plusieurs DAO, tu peux factoriser au sein d'une classe abstraite les comportements communs.

    Voilà c'est juste quelques suggestions, rien de fondammental.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Je ne connais pas le nombre d'utilisateurs de ton application, mais je ne crois pas qu'il soit utile dans un premier temps de toucher à ce paramètre.

    Ce qu'il faut vérifier à tout prix, c'est la fermeture des flux pour éviter de bloquer des connexions.

    Si tu veux améliorer les performances, tu peux mettre en place un pool de connexions, qui sera en charge de distribuer les connexions à ton application.
    Ce sera plutôt sur le nombre de connexions du pool, que tu pourras jouer.

  11. #11
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    un pool de connection ..?

    mais c'est pas ce que fait MysqlConnectionPoolDataSource ?

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Oops...désolé, j'aurais du relire ton code.
    Effectivement c'est ça.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Avril 2007
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Ce sujet m'intéresse ! J'ai quelques petittes questions.
    Citation Envoyé par Tommy31 Voir le message
    Alors mes commentaires:

    - Renomme ta classe PersonneManager en PersonneDAO, celle-ci ayant pour vocation principale la persistance plus que la réalisation de services. C'est du pinaillage, hein

    - La classe PersonneManager ne devrait pas définir de méthodes statiques. Au besoin, définit un singleton, au mieux une fabrique.

    - Défini des constantes pour les propriétés persistées de ton objet métier Personne, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Personne {
            private final static String ID = "id";
            private final static String NOM = "nom";
            private final static String PRENOM = "prenom";
     
            private int id;
            private ....
        }
    - Extrait et constantifie tes requêtes sql et paramètre-les comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class PersonneDAO {
     
        private static final String TABLE_NAME = "users";
     
        private static final String REQUEST_SELECT_BY_ID = "SELECT * FROM {0} WHERE id={1}";
     
        public Personne getPersonne(int id) {
            String sql = MessageFormat.format(REQUEST_SELECT_BY_ID, TABLE_NAME, id);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Ca je trouve ça génial je ne conaissais pas !
    <div class="bbcode_container">
    	<div class="bbcode_quote">
    		<div class="quote_container">
    			<div class="bbcode_quote_container"></div>
     
    				        Personne unePersonne = new Personne();
            DataBase db = DataBase.getInstance();
            Connection conn = null;
     
            try {
                conn = db.getConnection();
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                while (rs.next()) {
                    unePersonne.setId(rs.getInt(Personne.ID));
                    unePersonne.setNom(rs.getString(Personne.NOM));
                    unePersonne.setPrenom(rs.getString(Personne.PRENOM));
     
    		</div>
    	</div>
    </div>Là je ne comprends pas !
    Comment peut-on faire passer en paramètre rs.getString(Personne.monAttribut) ? Personne.nom par exemple, est-ce l'attribut que l'on va chercher de la classe personne ou c'est autre chose ?
                }
            } catch (SQLException ex) {
                System.out.println(ex);
            } finally {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    System.out.println(ex);
                }
            }
     
            return unePersonne;
        }
     
    }
    - Si tu as plusieurs DAO, tu peux factoriser au sein d'une classe abstraite les comportements communs.

    Voilà c'est juste quelques suggestions, rien de fondammental. [/QUOTE]

    Merci pour ce code j'ai appris pleins de techniques !

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/02/2013, 08h40
  2. Réponses: 1
    Dernier message: 01/02/2007, 11h57
  3. [POO] Utilisation d'une methode
    Par chtom dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 13h47
  4. [JSP][EJB]usebean --> utilisation d'une business method
    Par Eric Berger dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/05/2006, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo