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 :

Quel type utiliser pour une date?


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut Quel type utiliser pour une date?
    Bonjour, j'ai une table dans ma DB qui à une attribut de type date.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS Commandes (
      PK_id_commandes int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
      date_commandes date NOT NULL, 
      cloture_commandes tinyint(1) NOT NULL, 
      montant_commandes double NOT NULL, 
      `annulation _commandes` tinyint(1) NOT NULL, 
      FK_Clients_id_clients   int(10) UNSIGNED NOT NULL, 
      PRIMARY KEY (PK_id_commandes)) 
      ENGINE=InnoDB CHARACTER SET UTF8;

    Mon test unitaire, envoi une date au format String, comme elle serait rentrée par un utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Test
        public void test1_insert_commande() {
            Controler contr = Controler.getInstance();
            contr.addCommande("2018-10-28", false, 117.24, false, 3);
            System.out.println("TEST1 - Commande ajouté dans la DB.");
        }
    Dans ma Classe Commande quel type attribuer à la date? (String ou Date(java.util)

    Quand je met des String, pas de soucis pour récupérer la date et exécuter ma procédure stockée.
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
     
    public class Commande {
     
        /**
         * Attributs
         */
        public int idCommande, idClient;
        public String dateCommande;
        public Boolean commandeCloturee, commandeAnnulee;
        public Double montantCommandes;
        public Client client;
     
        /**
         * Constructeur par défaut
         */
        public Commande() {
        }
     
        /**
         * Constructeur
         * @param id 
         */
        public Commande(int id) {
            this.idClient = id;
        }
     
        /**
         * Constructeur
         * @param dateCommande
         * @param commandeCloturee
         * @param commandeAnnulee
         * @param montantCommandes
         * @param client
         */
        public Commande(String dateCommande, Boolean commandeCloturee, Boolean commandeAnnulee, Double montantCommandes, Client client) {
            this.dateCommande = dateCommande;
            this.commandeCloturee = commandeCloturee;
            this.commandeAnnulee = commandeAnnulee;
            this.montantCommandes = montantCommandes;
            this.client = client;
        }
     
        /**
         * Constructeur
         * @param date
         * @param cloruree
         * @param montant
         * @param annullee
         * @param idClient 
         */
        public Commande(String date, boolean cloruree, double montant, boolean annullee, int idClient) {
            this.dateCommande = date;
            this.commandeCloturee = cloruree;
            this.commandeAnnulee = annullee;
            this.montantCommandes = montant;
            this.idClient = idClient;
        }
     
     
        /**
         * Accesseurs
         * @return 
         */
        public int getIdCommande() {
            return idCommande;
        }
     
        public void setIdCommande(int id) {
            this.idCommande = id;
        }
     
        public String getDateCommande() {
            return dateCommande;
        }
     
        public void setDateCommande(String dateCommande) {
            this.dateCommande = dateCommande;
        }
     
        public Boolean getCommandeCloturee() {
            return commandeCloturee;
        }
     
        public void setCommandeCloturee(Boolean commandeCloturee) {
            this.commandeCloturee = commandeCloturee;
        }
     
        public Boolean getCommandeAnnulee() {
            return commandeAnnulee;
        }
     
        public void setCommandeAnnulee(Boolean commandeAnnulee) {
            this.commandeAnnulee = commandeAnnulee;
        }
     
        public Double getMontantCommandes() {
            return montantCommandes;
        }
     
        public void setMontantCommandes(Double montantCommandes) {
            this.montantCommandes = montantCommandes;
        }
     
        public Client getClient() {
            return client;
        }
     
        public void setClient(Client client) {
            this.client = client;
        }
     
        public int getIdClient() {
            return idClient;
        }
     
        public void setIdClient(int idClient) {
            this.idClient = idClient;
        }
     
     
    }
    Par contre, lorsque je mets l'attribut dateCommande en type Date(java.util), j'ai des erreurs dans ma class DAO.

    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
     
     
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JOptionPane;
     
    /**
     * Opérations CRUD sur les commandes
     *
     * 
     */
    public class CommandeDAO implements IntDAO {
     
        /**
         * Attribut
         */
        public ArrayList<Object> listCommandes;
        protected ConnectDB connect = null;
     
        /**
         * Constructeur
         *
         * @param con
         */
        public CommandeDAO(ConnectDB con) {
            this.connect = con;
        }
     
        /**
         * Create, qui insert une nouvelle commande via une procédure stockée
         *
         * @param entity
         */
        @Override
        public void create(Object entity) {
            Connection con = null;
            try {
                con = ConnectDB.getInstance().getConnection();
                con.setAutoCommit(false);
                String query = "{call commandes_insert(?,?,?,?,?)}";
                Commande cmd = (Commande) entity;
                String date = cmd.getDateCommande();
                Boolean cloture = cmd.getCommandeCloturee();
                Double montant = cmd.getMontantCommandes();
                Boolean annule = cmd.getCommandeAnnulee();
                int idClient = cmd.getIdClient();
                try (PreparedStatement preparedStmt = con.prepareStatement(query)) {
                    preparedStmt.setString(1, date);
                    preparedStmt.setBoolean(2, cloture);
                    preparedStmt.setDouble(3, montant);
                    preparedStmt.setBoolean(4, annule);
                    preparedStmt.setInt(5, idClient);
                    preparedStmt.executeUpdate();
                    con.commit();
                }
            } catch (SQLException ex) {
                if (con != null) {
                    try {
                        con.rollback();
                    } catch (SQLException ex1) {
                        Logger.getLogger(CommandeDAO.class.getName()).log(Level.SEVERE, null, ex1);
                        JOptionPane.showMessageDialog(null, ex1, "Message d'erreur", JOptionPane.ERROR_MESSAGE);
                    }
                }
                Logger.getLogger(CommandeDAO.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null, ex, "Message d'erreur", JOptionPane.ERROR_MESSAGE);
            } finally {
                try {
                    con.setAutoCommit(true);
                    con.close();
                } catch (SQLException ex2) {
                    Logger.getLogger(CommandeDAO.class.getName()).log(Level.SEVERE, null, ex2);
                    JOptionPane.showMessageDialog(null, ex2, "Message d'erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    Ma question est donc: quel type utiliser pour la date dans ma classe Commande et quel manipulation faire dans mon DAO?
    Sachant, que plus tard, je vais utiliser Swing et un calendrier.

    Nom : calendrier.PNG
Affichages : 274
Taille : 11,2 Ko

    qui utilise ce format de date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new SimpleDateFormat("yyyy-mm--yy

  2. #2
    Membre confirmé Avatar de Kazh Du
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 152
    Points : 561
    Points
    561
    Par défaut

    ... ni l'un ni l'autre ?

    Depuis java 8, il est recommandé d'utiliser LocaleDate et LocaleDateTime pour manipuler les dates.

    D'une façon ou d'une autre, ton entité doit contenir des données dans un format correspondant à leur utilité (et une date est une date).
    Ton DAO devra faire la transition vers le format String ou (et c'est préférable) vers java.sql.Date.

    PS : Tu peux utiliser Hibernate pour te simplifier un peu la vie.
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Points : 99
    Points
    99
    Par défaut
    Merci pour l'info.
    Pour Hibernate, c'est la prochaine étape.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 131
    Points : 203
    Points
    203
    Par défaut
    Si tu ne comptes pas faire beaucoup de manipulation sur ta date, je te conseillerai plus d'utiliser une variable long.

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    La discussion est clause mais bon, au cas où, je me permets de donner mon point de vue.

    La classe Commande devrait avoir la représentation de la date sous forme d'objet Date, ce n'est pas le rôle du DAO de transformer une valeur vers une représentation utilisable ou compréhensible à l'utilisateur.
    Imagine que ton application soit multi-langues, c'est à la couche de présentation de convertir la date dans un format donné (dd/MM/yyyy pour la France, MM-dd-yyyy pour les américains etc...), pas la couche d'accès aux données.

    Pour le choix du type de date, je dirais que ça dépendra surtout de ce que les composants (s'il y en a) demanderont.
    Il est vrai que la nouvelle api date est plutôt sympa, mais java.util.Date est encore largement utilisé par les composants... donc à toi de voir
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Quel type utiliser pour des données serialized?
    Par Nalexx dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/12/2012, 01h15
  2. Réponses: 0
    Dernier message: 11/09/2012, 20h53
  3. Quel technologie utiliser pour une application?
    Par nesswaw dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 29/01/2011, 21h34
  4. Quel Layout utiliser pour une fenetre simple?
    Par Dazdh dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/04/2009, 18h11
  5. Quels composants utiliser pour une application client/serveur (mySql) ?
    Par whitespirit dans le forum Bases de données
    Réponses: 20
    Dernier message: 30/01/2008, 05h46

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