bonjour :
j ai une petite question : peut on enregistrer un ArrayList dans bdd ?
avec le type varbinary peut etre ?
voila c est tout.
Version imprimable
bonjour :
j ai une petite question : peut on enregistrer un ArrayList dans bdd ?
avec le type varbinary peut etre ?
voila c est tout.
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
;)
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 ?
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) ?
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.
;)
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
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.
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.
L'id par exemple ? :p
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 !
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:
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(); } }
Au pire j'utiliserai la sérialisation XML
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 :roll:
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)
json pourquoi pas, même si je ne suis pas un grand fan, l'important est de pouvoir comprendre ou modifier manuellement le flux :)
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 ?
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
pour les gens que ça intéressent voici le code pour sauvegarder un arraylist dans une base de données :
et pour le recuperer et le mettre dans l arraylist :Code:
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
Code:
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();