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 :

Connexion Mysql Java


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 38
    Points : 21
    Points
    21
    Par défaut Connexion Mysql Java
    Bonjour,

    Je souhaiterai creer une application java connecter a une base de donne MySQL

    J'ai donc creer une base de donne (mabase) avec la table suivante
    poduit
    codeProduit (varchar)
    designation (varchar)

    J'ai creer les classes suivantes

    Main (execution du programme)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test;
     
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    public class Main {
     
        public static void main(String[] args) throws SQLException {
            ConnexionBD connexion = new ConnexionBD("localhost", 3306, "mabase", "root", "");
            Produit produit = connexion.selectionnerProduit("AL");
            System.out.println(produit.getDesignation());
     
        }
    }
    Classe Produit pour gerer mes objets produit

    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
    package test;
     
    public class Produit {
     
        private String codeProduit;
        private String designation;
     
        public Produit(String codeProduit, String designation) {
            this.codeProduit = codeProduit;
            this.designation = designation;
        }
     
        public String getCodeProduit() {
            return codeProduit;
        }
     
        public void setCodeProduit(String codeProduit) {
            this.codeProduit = codeProduit;
        }
     
        public String getDesignation() {
            return designation;
        }
     
        public void setDesignation(String designation) {
            this.designation = designation;
        }
    }
    Classe ConnexionDB pour la connexion a la DB

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    package test;
     
    import java.sql.*;
     
     
    public class ConnexionBD {
     
        Connection con = null;
        Statement sta;
        ResultSet re;
        ResultSetMetaData metaBase;
     
        public ConnexionBD(String server, int port, String database, String username, String password) {
            try {
                String url = "jdbc:mysql://" + server + ":" + port + "/" + database;
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection(url, username, password);
                System.out.println("Overture de la connection");
                sta = con.createStatement();
            } catch (ClassNotFoundException ex) {
                System.err.println("Ne peut pas trouver les classes du conducteur de la base de données.");
                System.err.println(ex);
            } catch (SQLException ex) {
                System.err.println("pas de connection au base de de donnee.");
                System.err.println(ex);
            }
        }
     
        public ResultSet rechercher(String query) {
            try {
                re = sta.executeQuery(query);
                System.out.println("Element trouvé ");
            } catch (SQLException ex) {
                System.err.println(ex);
            }
            return re;
        }
     
        public Produit selectionnerProduit(String codeProduit) throws SQLException {
            String query = "SELECT * FROM produit WHERE codeProduit ='" + codeProduit +"'";
            ResultSet res = this.rechercher(query);
            Produit produit = new Produit(null, null);
            while (res.next()) {
                produit.setCodeProduit(res.getString("codeProduit"));
                produit.setDesignation(res.getString("designation"));
            }
            return produit;
        }
     
        public void ajouter(String query) {
            try {
                sta.executeUpdate(query);
                System.out.println("Element ajouté a la base");
            } catch (SQLException ex) {
                System.err.println(ex);
            }
        }
     
        public void modifier(String query) {
            try {
                sta.executeUpdate(query);
                System.out.println("Element Modifié");
            } catch (SQLException ex) {
                System.err.println(ex);
            }
        }
     
        public void supprimer(String query) {
            try {
                sta.executeUpdate(query);
                System.out.println("Element suprimé");
            } catch (SQLException ex) {
                System.err.println(ex);
            }
        }
     
        public void fermer() {
            try {
                re.close();
            } catch (SQLException e) {
                System.out.println("Problème de fermeture de la Base de données");
            }
            System.out.println("Base de données Férmée");
        }
    }
    L'ensemble fonctionne mais je ne pense pas partir de la bonne facon pour gerer les relations entre ma DB et mes objets Produit, je souhaiterai donc creer une classe ProduitManager me permettant gerer ces interactions. Savez comment je pourrais faire ?

    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    2 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 689
    Points : 4 690
    Points
    4 690
    Par défaut
    La classe ConnexionBd comporte une méthode "selectionnerProduit" qui est liée à la table "produit"
    Donc c'est pas bon dès lors que ta base va comporter d'autres tables (clients ...)

    Il est plus courant de mettre les méthodes de création/recherche/modification/suppression (CRUD)
    dans la classe correspondant à la table (ici c'est la classe Produit).
    Cela permet de prendre en compte les spécificités de chaque table
    (par exemple, pour une table, certains champs seront obligatoires et devront être vérifiés)

    Donc, bien que tes méthodes soient astucieuses (emploi de requêtes génériques),
    elles ne permettent pas de vérifier les données comme tu pourrais le faire en
    délégant cette tâche à la classe Produit.

    Par ailleurs les méthodes "ajouter" et "modifier" de ta classe ConnexionBd font exactement
    la même chose (à part le message ...)

    Je pense que ton interrogation concerne le mapping objet/relationnel.
    voir aussi à ce sujet http://java.developpez.com/faq/jdbc/...litesAutresAPI
    Perso, pour l'enregistrement dans les bases de données je m'en tiens à JDBC que je trouve plus léger
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre à l'essai
    Inscrit en
    octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Bonjour et merci de votre reponse.

    J'ai donc modifie mon code de la facon suivant:

    Class Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package test;
     
    import java.sql.ResultSet;
    import java.sql.SQLException;
     
    public class Main {
     
        public static void main(String[] args) throws SQLException {
            ConnexionBD connexion = new ConnexionBD("localhost", 3306, "mabase", "root", "");
            Produit produit = new Produit().selectionnerProduit(connexion, "AL");
            System.out.println(produit.getDesignation());
     
        }
    }
    Class Produit

    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
    40
    41
    42
    43
    44
    45
    46
     
    package test;
     
    import java.sql.*;
     
     
    public class Produit {
     
        private String codeProduit;
        private String designation;
     
        public Produit(){
     
        }
     
        public Produit(String codeProduit, String designation) {
            this.codeProduit = codeProduit;
            this.designation = designation;
        }
     
        public String getCodeProduit() {
            return codeProduit;
        }
     
        public void setCodeProduit(String codeProduit) {
            this.codeProduit = codeProduit;
        }
     
        public String getDesignation() {
            return designation;
        }
     
        public void setDesignation(String designation) {
            this.designation = designation;
        }
     
        public Produit selectionnerProduit(ConnexionBD connexion, String codeProduit) throws SQLException {
            String query = "SELECT * FROM produit WHERE codeProduit ='" + codeProduit + "'";
            ResultSet res = connexion.rechercher(query);
            while (res.next()) {
                this.setCodeProduit(res.getString("codeProduit"));
                this.setDesignation(res.getString("designation"));
            }
            return this;
        }
    }
    Class ConnexionDB
    Suppression de la methode selectionnerProduit

    Est ce que je suis sur la bonne voie ?

    J'ai regarde le lien que vous avez propose, mais etant debutant je dois vous avouez que je n'ai pas compris.

    Auriez vous un exemple simple d'utilisation de JDBC?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    2 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 689
    Points : 4 690
    Points
    4 690
    Par défaut
    Oui tu es sur la bonne voie.

    Bon, on peut laisser de côté le lien pour l'instant.

    Maintenant il faut ajouter à la classe Produit les méthodes de création/modification/suppression
    exemple pour création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void create(ConnexionBD connexion) {
            String query = "INSERT INTO produit (codeProduit, designation)   VALUES('" + codeProduit + "', '" + designation + "'";
            Statement sta = con.createStatement();
            try {
                sta.executeUpdate(query);
            } catch (SQLException ex) {
                System.err.println(ex);
            }
    }
    C'est l'exemple de code que nous faisons tous au début.
    en plus de cette méthode create, ajoute les méthodes de modification et de suppression
    puis teste tranquillement le bon fonctionnement du tout.

    Pourtant ce code ne fonctionnera plus si la désignation comporte une apostrophe.
    L'étape suivante sera d'utiliser un PreparedStatement au lieu d'un Statement.
    voir : http://java.developpez.com/faq/jdbc/...paredstatement
    Cette classe simplifie la rédaction de l'instruction SQL et la rend plus fiable.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre à l'essai
    Inscrit en
    octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    J'ai fait pas mal de modification afin d'utiliser les preparedStatement

    Class ConnexionBD
    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
    public class ConnexionBD {
     
        public ConnexionBD() {
        }
     
        public Connection dbConnect(String server, int port, String database, String username, String password) {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                String url = "jdbc:mysql://" + server + ":" + port + "/" + database;
                Connection conn = DriverManager.getConnection(url, username, password);
                System.out.println("connected");
                return conn;
     
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        } 
    }
    Class Produit
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    import java.sql.*;
    import java.util.ArrayList;
     
     
    public class Produit {
     
        private String codeProduit;
        private String designation;
     
        public Produit() {
        }
     
        public Produit(String codeProduit, String designation) {
            this.codeProduit = codeProduit;
            this.designation = designation;
        }
     
        public String getCodeProduit() {
            return codeProduit;
        }
     
        public void setCodeProduit(String codeProduit) {
            this.codeProduit = codeProduit;
        }
     
        public String getDesignation() {
            return designation;
        }
     
        public void setDesignation(String designation) {
            this.designation = designation;
        }
     
        public Produit selectionnerProduit(Connection con, String codeProduit) throws SQLException {
            String query = "SELECT * FROM produit WHERE codeProduit = ?";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            preparedStatement.setString(1, codeProduit);
            ResultSet res = preparedStatement.executeQuery();
            while (res.next()) {
                this.setCodeProduit(res.getString("codeProduit"));
                this.setDesignation(res.getString("designation"));
            }
            return this;
        }
     
        public ArrayList selectionnerListProduit(Connection con) throws SQLException {
            ArrayList<Produit> al = new ArrayList<>();
            String query = "SELECT * FROM produit ORDER BY codeProduit";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            ResultSet res = preparedStatement.executeQuery();
            while (res.next()) {
                al.add(new Produit(res.getString("codeProduit"), res.getString("designation")));
            }
            return al;
        }
     
     
        public void ajouterProduit(Connection con) throws SQLException {
            String query = "INSERT INTO produit(codeProduit, designation) VALUES (?, ?)";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            preparedStatement.setString(1,this.codeProduit);
            preparedStatement.setString(2,this.designation);
            preparedStatement.executeUpdate();
        }
     
        public void modifierProduit(Connection con) throws SQLException {
            String query = "UPDATE produit SET designation= ? WHERE codeProduit = ?";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            preparedStatement.setString(1,this.designation);
            preparedStatement.setString(2,this.codeProduit);
            preparedStatement.executeUpdate();
        }
    }
    Class Main
    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
     
     
    import java.sql.Connection;
    import java.sql.SQLException;
     
     
    public class Main {
     
        public static void main(String[] args) throws SQLException {
     
            ConnexionBD connexion = new ConnexionBD();
            Connection con = connexion.dbConnect("localhost", 3306, "ma_base", "root", "");
            Produit produit = new Produit().selectionnerProduit(con, "AL");
            Produit produit1 = new Produit("cousdsss", "sadasdasd");
            produit1.ajouterProduit(con);
            produit1.setDesignation("sadassdsdsdddddd");
            produit1.modifierProduit(con);
            produit.setDesignation("ccccccccccccccccccccc");
     
        }
    }

    Le tout fonctionne. Est que je suis sur la bonne voie ?
    Je voudrais egalement savoir s'il vaut mieux utiliser les methodes setObject ou setString dans les preparedStatement ?
    Je souhaiterai savoir si il est possible de remplacer les "?" par des elements nomme (un peu comme en PHP) dans les preparedStatement ?

  6. #6
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    2 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 689
    Points : 4 690
    Points
    4 690
    Par défaut
    C'est parfait

    utiliser les methodes setObject ou setString dans les preparedStatement
    setObject = c'est générique mais ça risque de rater si tu passes un String alors que tu es sur un champ date
    Il vaut mieux utiliser la bonne méthode prévue pour le type de donnée

    possible de remplacer les "?" par des elements nomme
    eh non
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  7. #7
    Membre à l'essai
    Inscrit en
    octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    OK merci beaucoup, j'aurai encore une derniere question.
    Je voudrais utiliser ces methodes dans un interface graphique, actuellement pour chaque JFrame je suis oblige d'utiliser ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ConnexionBD connexion = new ConnexionBD();
    Connection con = connexion.dbConnect("localhost", 3306, "ma_base", "root", "");
    Ce qui a pour effet (je suppose) de creer une nouvelle connection a la DB pour chaque Jframe ouverte (ce qui doit pas etre la meilleur facon de faire). Est il possible que la variable con soit utilisable dans l'ensemble de mes class ?

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    octobre 2005
    Messages
    2 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 689
    Points : 4 690
    Points
    4 690
    Par défaut
    Oui c'est possible. Mais ce n'est utile que dans le cas où les performances sont critiques.
    (là où l'ouverture / fermeture de connexion trop fréquente va ralentir le traitement)

    Si tu veux faire cela, il faut rendre la variable accessible de n'importe où dans l'application
    en utilisant un champ statique de ta classe ConnexionBD par exemple :
    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
    public class ConnexionBD {
     
        public ConnexionBD(String server, int port, String database, String username, String password) {
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                String url = "jdbc:mysql://" + server + ":" + port + "/" + database;
                Connection conn = DriverManager.getConnection(url, username, password);
                System.out.println("connected");
     
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
     
        public static Connection getConnection{
                return conn;
        } 
     
        public static void closeConnection{
                conn.close();
        } 
     
    private static Connection conn;
    }
    dans le cas du code ci-dessus, tu instancies une fois un objet ConnexionBD
    et la connexion est conservée pour toute ton application.

    Cela peut poser des problèmes de timeout
    Je préfère ne pas employer ce genre de combine.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Membre à l'essai
    Inscrit en
    octobre 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : octobre 2008
    Messages : 38
    Points : 21
    Points
    21
    Par défaut
    Ok merci beaucoup pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion Mysql / java
    Par Mohican69 dans le forum Services Web
    Réponses: 0
    Dernier message: 22/02/2010, 20h51
  2. probleme de Connexion mysql et java?
    Par angeless dans le forum JDBC
    Réponses: 4
    Dernier message: 30/04/2009, 04h57
  3. connexion entre java et mysql par jdbc odbc
    Par langreth dans le forum JDBC
    Réponses: 11
    Dernier message: 23/04/2008, 00h17
  4. Réponses: 2
    Dernier message: 18/07/2007, 20h26
  5. connexion Mysql et java
    Par Randa01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/03/2007, 13h28

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