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

Collection et Stream Java Discussion :

Enregistrer un ArrayList dans une base de données


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 76
    Par défaut Enregistrer un ArrayList dans une base de données
    bonjour :
    j ai une petite question : peut on enregistrer un ArrayList dans bdd ?
    avec le type varbinary peut etre ?
    voila c est tout.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Il y a plein de manière de sauver une collection d'objets en base de données: avec une table séparée et une relation 1-n, ou bien en sérialisant la collection et en sauvant le flux obtenu, ou bien en utilisant un format xml, etc.

    chacune ayant ses avantages et inconvénients, mais pour faire le bon choix il faut plus d'infos sur l'utilisation


  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 76
    Par défaut
    merci pill s
    mon arraylist contient des objet :{ string et 4 int } c'est les nom et coordonnées des figure dans un panel , je doit sauvegarder les dessins pour l évaluer et le restituer , alors quel la meilleur manière de le faire ? moi je pencherai plus tôt pur la sérialisation non ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Est-ce qu'il faut que ce soit réutilisé par d'autres technologies que Java ?
    Pourquoi pas une table avec 1 VARCHAR2(255) et 4 NUMBER(10) ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    la sérialisation a ses (nombreux) défauts: on ne peut utiliser le flux qu'avec du java, et à condition d'avoir la classe originale dans le classpath, et l'on a souvent des problèmes pour interpréter les flux si la classe change de version (ex. je sauvegarde un flux issue de la version 1 de la classe, puis je fais évoluer la classe en ajoutant un attribut, puis j'essaie de désérialiser le flux -> bing, erreur)

    le mieux c'est une table séparée avec une relation 1-n, c'est rapide et ça s'exploite facilement avec n'importe quel langage.

    sinon, la sérialisation mais sous forme de xml (avec jaxb ou non) est bien meilleure que la sérialisation binaire.


  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 76
    Par défaut
    si je le fait avec une table séparée avec une relation 1-n(même c je sais pas trop ce que c'est pour l'instant ..!) es que je peu la récupérer et remplir mon arraylist en accédant a la bdd , et puis redessiner les figures dans mon Jpanel ?car pour l'instant dans mon application avec la sérialisation je peux sauvegarder sur disque avec un fichier .dat et puis ouvrir le fichier et réafficher le tout .
    et encore merci pour vos réponses

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Là tu ne veux pas vraiment enregistrer une ArrayList : tous tes objets auront TOUJOURS les 4 coordonnées + le nom. Donc comme le suggérait Nemek, une table simple avec 4 colonnes NUMBER, 1 colonne VARCHAR, et hop le tour est joué.

    Tu pourras ensuite remettre ça dans une ArrayList ... même si je ne vois pas l'intérêt de se passer des infos dans une liste, plutôt que dans un objet bien propre.

  8. #8
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par ssk2510 Voir le message
    es que je peu la récupérer et remplir mon arraylist en accédant a la bdd
    oui, via une jointure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from table_de_base t1 inner join table_des_coordonnes t2 on t2.id_de_la_table_de_base=t1.id where t1.id = qqchose

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Attention, là les coordonnées sont manifestement triées (on a une liste et pas un set) ... Donc il faudrait un ordre sur une colonne en plus.

  10. #10
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    L'id par exemple ? :p
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 76
    Par défaut
    je vous remercie tous pour vos réponses ,
    mon application c'est dans le cadre d'un petit projet a la fac , et je n’utiliserez que du java , je peux pas utiliser une table pour chaque figure :ça prendrai beaucoup de place dans la bdd . donc je pense que enregistrer le JArrayList en binaire est la meilleur solution ,
    mais j ai aucune idée de comment faire :
    je sais que la class doit implémenté l'interface serializeble mais apres ...
    alors une petit aide serai la bien venu !

  12. #12
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Bon, tu choisis à mon avis la plus mauvaises parmis les solutions proposées...

    des infos ici: http://java.sun.com/developer/techni...serialization/

    un exemple rapide:

    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
     
    class SerializeMe implements Serializable {
        public int x,y;
    }
     
    ...
     
    SerializeMe s = new SerializeMe();
    s.x=5; s.y=10;
     
    ByteArrayOutputStream baos=null;
    ObjectOutputStream oos=null;
    try {
        baos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(baos);
        oos.writeObject(s);
        byte[] data = baos.toByteArray();
     
        // TODO : sauver data dans la db
     
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(oos != null)
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
     
        if(baos != null)
            try {
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

  13. #13
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Au pire j'utiliserai la sérialisation XML
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je vais mettre un pieds dans la soupe. Moi je mettrais du JSON, plus léger à parser, plus concis :p

    Maintenant, clairement, le plus propre reste la table à part, et vous n'avez pas besoin d'un table par figure mais d'une table qui regroupe toutes els figure
    Faites un tour dans le tutos SQL pour savoir ce qu'une base de donnée à a offrir et comment il faut mieux stocker les données.


    Si l'aspect relationnel de vos données n'est pas "évident" voir vos données n'ont rien de relationnel, les bases type nosql sont peut etre une solution plus adaptée à votre problème (on y stocke des objets et c'est tout)

  15. #15
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    json pourquoi pas, même si je ne suis pas un grand fan, l'important est de pouvoir comprendre ou modifier manuellement le flux

  16. #16
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    XML me semble plus réutilisable que JSON.

    Pour ma culture personnelle, c'est dans l'API standard ou il faut une API la tierce (toute délation est la bienvenue) ? Quid du support dans les autres langages ? (.Net, C++, Ruby, Scala)
    Par ailleurs je suis surpris qu'une notation objet ne supporte pas les références (Source). Peux-tu confirmer ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  17. #17
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Une bonne vieille base NOSQL (c'est à dire non relationelle) prévue pour stocker des objets comme OrientDB sera parfaite pour cet usage:

    http://code.google.com/p/orient/

    La doc: http://code.google.com/p/orient/wiki/Main

    Le stockage des objets: http://code.google.com/p/orient/wiki/ObjectDatabase

  18. #18
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 76
    Par défaut
    pour les gens que ça intéressent voici le code pour sauvegarder un arraylist dans une base de données :
    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
    	  if(e.getSource()==save)//** si on clique sur le bouton save
    				  {//***********debut
    					    Connection conn;
     
     
    						try
    						{
    							Class.forName("com.mysql.jdbc.Driver");
    							conn = DriverManager.getConnection("jdbc:mysql://localhost/arrylist","root","");
     
    							//******************************
     
    							ByteArrayOutputStream baos=null;
    							ObjectOutputStream oos=null;
    							byte[] data ;
     
    							try {
    							     baos = new ByteArrayOutputStream();
    							     oos = new ObjectOutputStream(baos);
    							     oos.writeObject(list);//*** list est un Arraylist
    							     data = baos.toByteArray();
     
    							     //sauver data "dans la db
    							     String query = "INSERT INTO save(nom ,val) VALUES ('exo', ? )";
    							     PreparedStatement pstm = conn.prepareStatement(query);
    							     pstm.setBytes(1, data);
    							   pstm.executeUpdate();
     
    							} catch (IOException ex) { ex.printStackTrace();} 
     
    						}
    						    catch (Exception ex) {
    						    	ex.printStackTrace();
    							System.out.println("connexion impossible");
     
    						}
    				  }//******************************fin
    et pour le recuperer et le mettre dans l arraylist :
    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
    Connection conn;
    					Statement stm ;   
    					ResultSet res ; 
     
    					 byte[] d2 = null;
    					 ByteArrayInputStream bais;
    				     ObjectInputStream ois;
    						try
    						{
    							Class.forName("com.mysql.jdbc.Driver");
    							conn = DriverManager.getConnection("jdbc:mysql://localhost/arrylist","root","");
    							stm = conn.createStatement();
    							res  = stm.executeQuery("select val from save where id=13 ");
    							while(res.next()){
    								d2 =res.getBytes(1);
    							}
     
    							bais=  new ByteArrayInputStream(d2) ;
    							ois = new ObjectInputStream(bais);
    							list =(ArrayList<Fig>)ois.readObject();

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

Discussions similaires

  1. Enregistrer des valeurs dans une base de donnée SQL
    Par MoTaWer dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/05/2011, 14h16
  2. Enregistrer un DataInputStream dans une base de données
    Par urbanoll2 dans le forum Général Java
    Réponses: 2
    Dernier message: 03/11/2010, 16h57
  3. Insérer une ArrayList dans une Base de données
    Par takepaf dans le forum JDBC
    Réponses: 3
    Dernier message: 21/03/2008, 08h07
  4. Réponses: 4
    Dernier message: 26/09/2006, 11h42

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