# Vectoren in mySQL-Datenbank speichern und auslesen



## xchookie (5. Jul 2004)

Hallo!

Ich schreibe gerade an einem Programm, welches u.A. Personendaten verwalten können soll. Die Speicherung der Daten soll auf verschiedene Arten möglich sein. Bisher realisiert habe ich normale Serialisierung in eine Datei und Speichern im XML-Format. Nun würde ich gerne noch das Speichern und Auslesen mit einer Datenbank realisieren. Habe mich auch schon nach entsprechendem Code hier im Forum und anderweitig umgesehen, bekomme es jedoch einfach nicht hin.
Ich habe eine Klasse Person, die name, vorname, geburtsdatum, plz, ort usw. in einem Vector speichert. Diesen Vector würde ich nun gerne in die Datenbank schreiben und wieder auslesen. Allgemeiner Datenbankzugriff klappt schon, also daran liegt's nicht. Wär schön, wenn mir da jemand helfen könnte.

Gruß,
xchookie


----------



## DP (6. Jul 2004)

wenn der db-connect schon klappt, ist das die halbe miete.

dann zerlegst du dein bean mit den personendaten in einen sql-insert und schickst den mit Statement.execute(sql-tring); an die db.

cu


----------



## ZeusOfCrete (6. Jul 2004)

Hallo xchookie,

um einen Vector auszulesen und auf eine DB zu speichern, könntest Du
z.B. aus den Values SQL-Statments formen und diese an eine Funktion zum
speichern übergeben:
----------------------------------------------
 Dies ist nur ein Code-Auszug .. !!

 targetStatments      = static Vector
 tmpState                = static String
 sourceColumn        = Anzahl der Felder, die einen Satz bilden
----------------------------------------------

```
private static void createTargetStatments() throws Exception
{
    
  Enumeration enum = yourVector.elements(); // Hier stehen Deine Daten drin

  // SQL-Statments formen
		  
  while(enum.hasMoreElements())
  {
     for(int columncount = 1; columncount <= sourceColumn; columncount++)
     {
         switch(columncount)
         {
             case 1: tmpState +="insert into bib.tblname ( NUM, NA, INR, TYP, DATUM, BEARB, FLAG, GEB ) "+
                                "values ("+enum.nextElement().toString()+", ";break;
             
             case 2: tmpState += enum.nextElement().toString()+", ";break;
             case 3: tmpState +="'"+enum.nextElement().toString()+"', ";break;
             case 4: tmpState +="'"+enum.nextElement().toString()+"', ";break;
             case 5: tmpState +="'"+enum.nextElement().toString()+"', ";break;
             case 6: tmpState +="'"+enum.nextElement().toString()+"', ";break;
             case 7: tmpState +="'"+enum.nextElement().toString()+"', ";break;
             case 8: tmpState +="'"+enum.nextElement().toString()+"') ";break;
         }

     }

    targetStatments.addElement(tmpState);tmpState="";
  }

  //Vector-Values auf DB speichern:

  private static void updateTarget() throws Exception
  {
          Statement stmt        = Connection.createStatement();
          Enumeration sqlupd  = targetStatments.elements();

          while(sqlupd.hasMoreElements())
          {

               stmt.executeUpdate(sqlupd.nextElement().toString());
          }

  }
```

Noch besser ist es, wenn Du bei großen Datenmengen mit PreparedStatements
arbeitest. Das wäre auch viel performanter. Des weiteren könntest Du die
Vector-Collection durch eine ArrayList ersetzen. Vectoren sind "Thread-Save".
Falls das nicht benötigt wird, gibts dadurch zusätzliche performance.

Gruß

Zeus


----------



## rastaman (7. Jul 2004)

Hm also ich habe das auch mal gemacht... aber nur ganz einfach...  Habe mir überlegt, dass ich jeweils nur neue Personen oder die veränderung der Person in die DB speichern muss... 


Um einen veränderten Kunden oder einen neuen Kunden aus einem Vector in eine DB zu speichern hab ich das so gemacht:

```
//Bei mir steht jetzt hier Kunde...
//Durch irgend eine eingabe Maske oder sowas hast du ja einen Kunden generiert... ich mach das jetzt mal nicht... ;)
Kunde kunde = Kunde(Muster, Max, Steinstrasse...)
       String query = "INSERT INTO `kunde` ( `Name` , `Vorname` , `Strasse` , `PLZ` , `Ort` , `Geburtsdatum` , `Email` , `Telefonnummer` ) VALUES ('', '"+kunde.getName()+"', '"+kunde.getVorname()+"', '"+kunde.getStrasse()+"', '"+kunde.getPlz()+"', '"+kunde.getOrt()+"', '"+new SimpleDateFormat("yyyy-MM-dd").format(kunde.getGeburtsdatum())+"', '"+kunde.getEmail()+"', '0', '"+kunde.getTelefonNummer()+"');";

//Verbindung herstellen
    try
    {
      stmt = conn.createStatement();
      String sqlUpdate = query;
      update = stmt.executeUpdate( sqlUpdate );
      stmt.close();
     }
    catch ( SQLException e )
    {
      System.out.println( "Fehler bei Tabellenabfrage" + e );
    }

//DB verbindung beenden.
```

wenn du nur die veränderung einer Person speichern willst, den du schon in einem Vector hast, dann machst du das halt so:

```
Kunde kunde = (Kunde)kunendvector.get(kundenindex);
//du liest vom Kundenvector den gewünschten Kunden per index aus
      String query = "UPDATE `kunde` SET `Name` = '"+kunde.getName()+"',`Vorname` = '"+kunde.getVorname()+"',`PLZ` = '"+kunde.getPlz() +"',`Ort` = '"+kunde.getOrt()+"',`Geburtsdatum` = '"+new SimpleDateFormat("yyyy-MM-dd").format(kunde.getGeburtsdatum())+"',`Email` = '"+kunde.getEmail()+"',`Telefonnummer` = '"+kunde.getTelefonNummer()+"' WHERE `Kundennummer` = '"+kunde.getKundennummer()+"'; ";
// in der db suchst du nach der Kundennummer, die eindeutig sein sollte und ersetzt einfach alle werte (erspart die überprüfung darauf welcher wert wohl geändert hat... 
// Da fällt mir gerade auf, dass du keine Personennummer erwähnt hast... na ja würd ich machen... mit autoincrement in der DB...
```
wenn du natürlich die daten immer im Vector aktualisierts und erst am schluss in die DB schreiben willst, dann musst du halt das ganze in eine schleife packen... 

```
//DB Verbindung herstellen

  for( int i = 0,  i<kundenvector.size(); i++ ){ 
      Kunde kunde = (Kunde)kunendvector.get(i);
        //der jeweilige kundenindex ist nun das i, dass ja schön nach oben gezält wird
        //wie gewohnt das queri generieren und anschliessend ausführen...
       }
//DB Verbindung schliessen...
```

Wenn du die Daten dann in der DB hast dann kannst du sie so von der DB in einen Vector packen:

```
//Verbindung herstellen etc. und dann folgendes machen:
     Vector personenVector = new Vector();
//jetzt hast du eine neuen Vektor ohne Daten
     try {
      stmt = conn.createStatement();
      String sqlQuery = "SELECT Name, Vorname, Strasse, Ort, Geburtsdatum, PLZ, Telefonnummer, Email FROM person ORDER BY Name";
       rSet = stmt.executeQuery( sqlQuery );
//bis hier war alles standart
       while ( rSet.next() )
            personenVector.add( new Person(rSet.getString("Name"), rSet.getString("Vorname"), rSet.getString("Strasse"), rSet.getString("Ort"), rSet.getDate("Geburtsdatum"), rSet.getInt("PLZ"), rSet.getInt("Telefonnummer"),  rSet.getString("Email") ));
//nun füllst du den Vector immer mit den neuen Kunden. (für jede zeile in der DB ein Objekt im Vector)
        }
     catch ( SQLException e ){
        System.out.println( "Fehler bei Tabellenabfrage" + e );
        }
//Sql verbindung nun noch beenden.
```

SO hoffe habe dich nicht falsch verstanden...  und viel spass beim coden... bei fragen einfach nachhacken...


----------



## xchookie (8. Jul 2004)

Vielen Dank erstmal für die ganzen Tipps, besonders an rastaman.
Hab gerade ein kleines Beispielprogramm geschrieben, mit dem ich das alles erstmal teste, bevor ich das richtig einbaue. Funktioniert auch alles soweit ganz gut, nur mit dem Speichern des Geburtsdatums in der Datenbank hab ich Probleme.
Hab's auch so versucht, wie von rastaman beschrieben.  getGeburtsdatum gibt ein Date-Objekt zurück. Liegt's vielleicht daran? Soll ich da lieber n GregorianCalendar oder sonstwas nehmen?

Und ich kann nur auf meine lokale Datenbank zugreifen, nicht auf einen externen Server. Aber das ist ne andere Sache, das bekomme ich schon irgendwie hin. Hoffe ich...


----------



## rastaman (8. Jul 2004)

hm bei mir hat das mit dem date eigentlich geklapptt... zum auslesen zumindest....  aber um die daten zu speichern hab ich dann das ganze in ein simple date format umgewandelt... sollte dann TT-MM-JJJJ sein.. dan klapt das auch zum speichern in der db...

gruss (bin jetzt für 2 Wochen in den Ferien...  )


----------



## xchookie (8. Jul 2004)

Hmm, ok. Dann muß das auch bei mir laufen. Werd da noch ein bisschen dran basteln, irgendwie muss sich das ja machen lassen. Schöne Ferien!


----------



## xchookie (8. Jul 2004)

Hmm, ok. Dann muß das auch bei mir laufen. Werd da noch ein bisschen dran basteln, irgendwie muss sich das ja machen lassen. Schöne Ferien!  

Sorry, für das zweite Posting. Hatte beim ersten Mal ne Fehlermeldung und war dann zu schnell...


----------



## rastaman (8. Jul 2004)

danke und viel erfolg!


----------

