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 :

[conector/J] Java PrepStatement et MySQL


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut [conector/J] Java PrepStatement et MySQL
    bonjour a tous !

    (et pardon d'avance pour la longueur mais je ne sais pas faire court ici)

    voila que je dechante un peu du choix de Mysql pour l'implementation de ma couche DAO. Ca reste un tres bon SGBD mais la le syntaxe un peu speciale me du SQL me joue quelque tour.

    Je m'explique :

    je realise donc une couche DAO comprenant pour chaque table (un package de classe par table) 4 classes : un javabean, une daofactory, et une interfaceDAO (xxxxDAO) qui est implementee par ma classe MySQLxxxxDAO qui comprend mes requetes sous forme de PreparedStatement. Les requete etant enregistrer sous forme de constantes statique en debut de fichier.

    Le pb est au niveau des cotes que necessite MySQL lors de l'update d'un enregistrement, ainsi par exemple, :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private static final String STORE
    	= "update sunthirdparty"
    	+ " set idcountry = ?, statut = ?, nameparty = ?, addressparty = ?,"
    	+ " zipcodeparty = ?, postalboxparty = ?, cityparty = ?, telparty = ?, faxparty = ?,"
    	+ " website = ?, descriptparty = ?, logoparty = ?, credateparty = ? "
    	+ " where idparty = ? ";
    dans cet exemple si je veux inserer un String ou un entier, je met des cote dans la partie qui controle la construction de ma requete qui pour etre tout a fais precis ressemble pour chaque point d'interogation a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    			if (info.getIdcountry() != null){
    				ps.setObject(1,"'"+info.getIdcountry()+"'");
    			}else{
    				ps.setNull(1,Types.NULL);
    			}
    mais si mon objet passe en parametre comporte la valeur NULL, MySQL ne m'ecrit pas la valeur NULL mais une chaine de caractere 'NULL'.

    Pire encore lorsque j'update un champs de la base qui dois etre imperativement not null, et que la propriete correspondante de mon objet est null, il m'inscrit dans la base une chaine vide ('') ce qui pour lui n'est pas NULL et donc ne me genere aucune erreurs.

    Comment faire pour gerer ceci ?

    WDionysos
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  2. #2
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut precision
    par ailleurs, ce pb en genere un autre

    au niveau de mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ps.setObject(1,"'"+info.getParametre()+"'");
    au depart avant de gerer les cote j'avais un Integer, maintenant il me considere cela comme un String ce qui m'oblige a tout recaster lors de la recuperation des donnees ailleurs.

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  3. #3
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if (info.getIdcountry() != null){
                ps.setObject(1,"'"+info.getIdcountry()+"'");
             }else{
                ps.setNull(1,Types.NULL);
             }
    pourquoi tu ne fais pas ca ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if (info.getIdcountry() != null){
                ps.setString(1,info.getIdcountry());
             }else{
                ps.setNull(1,Types.NULL);
             }
    tu utilises connector/J ? quelle version ?

  4. #4
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    pour connector

    mysql-connector-java-3.1.6.zip

    pour setString c'est ce que je met pour mes parametre de type String

    mais pour les Integer (qui sont en fait les clef primaire et etrangere pour faire simple) si on met un setString on a un message d'erreur qui dit que

    la methode setString du type PreparedStatement n'accepte pas les parametre (int, Integer)
    pour eviter cela j'ai mis un setObject mais maintenant que je dois rajouter les chaine de guillemet, il accepte du coup le setString le pb c''est qu'a cet endroit la base attend un int.

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  5. #5
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    si info.getIdcountry() est un Integer, pourquoi ne fais tu pas ca ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if (info.getIdcountry() != null){
                ps.setInt(1,info.getIdcountry().intValue());
             }else{
                ps.setNull(1,Types.NULL);
             }
    as-tu vraiment besoin de travailler avec des Integer et non avec des int ?

  6. #6
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    concernant ton probleme de null, pourrais-tu tester avec le driver 3.0.6 ?

    http://downloads.mysql.com/archives/mysql-connector-java-3.0/mysql-connector-java-3.0.6-stable.zip

  7. #7
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut re
    oui c'est ce que j'etais en train de faire (ta proposition) c'est a dire mettre des intValue() et de les passe en String comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ps.setString(1,""'""+info.getIdparty().intValue()+"'");
    c'est tout a fait gerable. pour les Integer c'est imposer par l'employeur de faire du 100% objet et ca se justifie au moment de l'extraction de la base ou il faut caster en Integer car on ne peut caster un objet resultset en int.

    Je rappelle que le gros pb que j'ai c'est surtout avec les Null comment faire pour que ma base accepte NULL comme valeur NULL et non une chaine 'NULL' ou une chaine '' qui n'est pas considerer comme NULL.

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  8. #8
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    remplace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setNull(1,Types.NULL);
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setNull(1,Types.VARCHAR);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setNull(1,Types.INTEGER);

    plus généralement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setNull(1,ton_type_ici);

  9. #9
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    pourquoi tiens tu absolument à passer tes id via setString et non via setInt ?

    tes ids en base sont des integer ? ou des varchars ? ou autre ?

  10. #10
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut precision
    oui c'est la piste que j'etais en train de suivre

    pour l'instant ayant un soucis de config avec mon tomcat et mon port 8080 je ne compile pas en vrai donc je n'utilise pas encore de connector, je me contente de la correction syntaxique d'eclipse et de copier coller mes requete manuellement dans phpMyAdmin pour voir s'il les accepte.

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  11. #11
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    je te cite :
    on ne peut caster un objet resultset en int.
    il ne faut pas faire myResultSet.getObject(...) mais myResultSet.getInt(...)

    je ne vois pas pourquoi tu travailles avec des Object lors de la recuperation de données (getObject(...)) et avec des String lors de l'envoi de données(setString(...))
    :

  12. #12
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    dans la base c'est des int

    mais dans mes objets en entre de la fonction STORE (update) et en sortie (se sont des Integers , il me faut donc caster ou decaster tout en Integer en int et vice versa, deconstruire ou reconstruire un objet et renvoyer une collection.

    le cas de l'Integer est que je dois rester coherent avec la definition de mon objet dans le javabean et dans l'eJB

    dans la base, les id sont int
    les chaines sont varchar ou text pour les plus longue

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  13. #13
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    quelle influence peut avoir la version du connector java sur la syntaxe des prepared statement ????
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  14. #14
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    quelle influence peut avoir la version du connector java sur la syntaxe des prepared statement ????
    http://lists.mysql.com/java/5908

  15. #15
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    n'oublie pas :
    ps.setNull(1,ton_type_ici); et non ps.setNull(1,java.sql.Types.NULL);

  16. #16
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    merci bcp billou, voila une super info qui m'est tres utile.

    ecoutes je crois qu'il faut que je ressasse tout ca et reprennent toutes mes requetes. si tu restes a l'ecoute de ce post, je le laisse en suspends et te tiendrais au courant de ce que j'ai, produit comme solution,

    merci pour tout

    ps une des raison, sans doute, c'est que je me suis base sur une architecture de classe que j'avais deja realise...pour PostgresSql, et c'est vrai que dans ce cas la syntaxe etait plus simple, pas de guillemet. je vais reprendre tout ca et regler ce pb de config server eclipse qui m'enneve !!!


    merci bcp

    j'espere que tu sera bientot promu, membre a part entiere tu le merite
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  17. #17
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    merci bcp billou
    => you're welcome


    pb de config server eclipse qui m'enneve
    => un autre post alors ?


    j'espere que tu sera bientot promu, membre a part entiere tu le merite
    => et je demanderai en meme temps la medaille du mérite 8)


    PS: normalement, je suis alerté par mail s'il y a de nouveaux messages sur ce post.

    ++

  18. #18
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut Eh bien voila Billou !!
    ca avance donc cette question

    car tu avait raison le passage par connector J change radicalement le pb

    j'ai donc pu retablir une config d'eclipse avec log4j et connector/J 3.1.6 qui fonctionne et du coups plus de soucis de cote et de null a disparu car non seulement Mysql accepte tres bien le


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ps.setNULL(x, Types.NULL)
    mais en plus, le classe que j'avais produit pour ajouter de part et d'autre des quote ' a mes string et mes Integer n'est plus necessaire car je pense que le driver jdbc de connector /J 3.1.6 gere toute cette partie du PreparedStatement tres bien. ce qui n'etais pas du tout le cas de la 3.0.6)

    alors voila merci Billou, tu m'a mis sur la bonne piste

    et un post de plus de resolu sur super().developpez.net

    a bientot !

    WDionysos
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  19. #19
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    peace and love

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

Discussions similaires

  1. Connexion java à une BDD MySQL distante via SSH
    Par onigami dans le forum JDBC
    Réponses: 3
    Dernier message: 16/04/2008, 13h47
  2. java accede a mysql à distance
    Par minooo dans le forum JDBC
    Réponses: 2
    Dernier message: 01/12/2007, 10h51
  3. Installer Java , Tomcat et MySQL sous DEBIAN SARGE
    Par drizztoli dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 20/07/2006, 16h01
  4. [JDBC + XML + Java] XML to MySQL
    Par mathieu77186 dans le forum JDBC
    Réponses: 4
    Dernier message: 28/03/2006, 13h50
  5. [JDBC]Java access et mysql
    Par Lady_jade dans le forum JDBC
    Réponses: 9
    Dernier message: 09/09/2005, 11h11

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