• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Java -

derises

Mitglied
Hallo,

Ich will Daten die mit einem Java Programm ausgelesen werden in eine Datenbank speichern.
Das speichern von test Werten funktioniert mit dem ersten Script.
Nun geht es darum, die Daten die ich in dem zweiten Codeblock erhalte bzw. auf aktuell als Output ausgebe mithilfe des ersten Codes in die DB zu schreiben.

Die Daten erhalte ich von einer API per PUSH.

Das ist das Programm bzw. die Klasse für die Datenbank
Diese funktioniert wenn ich Sie aufrufe.
Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import customers.test.JDBCExample;


public class JDBCExample {
    public void main(String[] args) throws ClassNotFoundException,
    SQLException {



    String username = "xxxx";
    String password = "xxxxx";
    String tablename = "incoming_java_api_datas";
    String fieldname = "*";

    String query = "INSERT INTO " + tablename + " (id,name) VALUES (NULL,'ddad');";
    /* this chunk of code can appear more or less verbatim */
    /* in your database apps (including JSPs) */

    String url = "jdbc:mysql://xxxxx:3306/xxxxxx";

    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection(url, username, password);
    Statement stmt = con.createStatement();
    int rs = stmt.executeUpdate(query);
    System.out.println("The contents of field " + fieldname + ":");
  

    // note that getString anomalously starts counting at 1, not 0
    System.out.println("INSERT");

    stmt.close();
    con.close();
    }
}

Nun will ich diese klasse in einer anderen Datei aufrufen.

Hier die Datei:
Code:
while (iter.hasNext())
        {
            boolean isRecap = false;
            boolean isUpdate = false;
            UpdateMessage update = iter.next();
          
            System.out.println(update.toMachineReadableOutput());

    try {
                JDBCExample echoServer = new JDBCExample();
               echoServer.main(null);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
}

Fehler:
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
        The method main(String[]) in the type JDBCExample is not applicable for               the arguments (String)


Vielen dank falls sich damit jemand auskennt und mir behilflich sein kann.

Danke
 
Werbung:
Die Methode main will ein String Array, du lieferst aber einen String... Warum eigentlich main(String[] args) static ists ja eh nicht, also keine Main Klasse in dem Sinne
 
Hey,
danke, das ist doch schonmal etwas.

Sprich ("foo","bar") wäre dann das String Array, korrekt?

Bin in Java wirklich noch ganz weit am Anfang ...

Du meinst also damit:
public void main(String[] args) throws ClassNotFoundException = Hier kann das main weg da es keine ist?

Wie erhalte ich eigentlich die zuvor übergebenen Daten wieder von String[] args ?


Danke und Grüße
 
Werbung:
Eine main Klasse in Java ist normalesweise die Klasse die beim Programmaufruf aufgerufen wird... also quasi

Code:
public static void main(String[] args) {
// blalblaalal
}

args sind hierbei die Parameter die beim Aufruf übergeben werden, also z.b.
java C:\temp\meineJavaKlasse param

Ich denke nicht, dass du dies erreiche willst, da deine Main Klasse nicht static ist, also muss zuerst ein Objekt davon erstellt werden, was du ja auch korrekt tust. Statt der Methode aber null zu übergeben, müsstest du ein String array übergeben. Wenn du keine übergebenen wert benötigst, sondern nur die Methode aufrufen willst, musst du einfach bei der Methode das String[] args entfernen und nur noch die leere Klammer stehen lassen.

Zudem würde ich die Methode aus Gründen der Verständlichkeit nicht main nennen.
 
Vielen Dank, klappt nun soweit.

Eine Frage habe ich da allerdings noch, wie kann ich einen Wert übergeben?

Aktuell lasse ich die Daten nur ausgeben, diese sollen aber in die DB geschrieben werden.
Aktuell wird ja nur "ddad" in die DB gechrieben.

Code:
System.out.println(update.toMachineReadableOutput());


Sprich wie übergebe ich nun update.toMachineReadableOutput() sodass ich diese im obigen SQL Statement verwenden kann?

Aufruf:
Code:
  try {
                    JDBCExample echoServer = new JDBCExample();
                   echoServer.main();
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                   }

Vielen Vielen Dank :)
 
EDIT:

Nun habe ich in der DB den ganzen String in etwa so
blu;blab;blub;blab;

Diese müssten nun bevor dieser in die DB geht gesplitet werden.
Wie mache ich das in Java und wie speichere ich dieses Array dann in mehrere Felder?

In etwa so wie in PHP erst explode(";", $datas); und dann halt eine foreach Schleife.

Wie mache ich das in Java?

Danke

Habs schon, danke...

Code:
public void main(String datas)

Code:
String datas = update.toMachineReadableOutput();
              try {
                    JDBCExample echoServer = new JDBCExample();
                   echoServer.main(datas);
                }

Code:
String query = "INSERT INTO " + tablename + " (id,name) VALUES (NULL,'"+datas+"');";
 
Werbung:
Code:
String[] dataArray = data.split(";");

ist vermutlich das was du suchst. Dann könntest du mit

Code:
for (String myString : dataArray) {
// hier auf myString zugreifen
}
die Daten abfüllen
 
Hallo,

leider schaffe ich es nicht den String wie gewünscht zu trennen.
Ziel wäre es wie gesagt jeden Wert nach einem Semikolon in eine eigene Spalte zu schreiben.


Hier mein Ansatz:
Hier soll nur der "shortname" in eine eigene Spalte geschrieben werden, der restliche String soll dann data heißen und in eine andere Spalte geschrieben werden.

Code:
String datas = update.toMachineReadableOutput();
            String[] dataArray = datas.split(";");
            String shortname = "";
            for (String mystring : dataArray) {
                shortname += dataArray[1];
          
              try {
                    JDBCExample echoServer = new JDBCExample();
                   echoServer.main(datas,shortname);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                   }


Code:
public void main(String datas, String shortname) throws ClassNotFoundException,
    SQLException {


Code:
    String query = "INSERT INTO " + tablename + " (id,name,time) VALUES (NULL,'"+shortname+"','"+time+"');";

Danke im voraus.
 
Es ist jetzt schwer dir mit den Codefetzen zu helfen...

Ansonsten... du übergibst 2x die selben Werte.. shortname ist ja noch in datas drin... und, wenn du shortnames ausserhalb der Schleife deklarierst und dann bei jedem Durchlauf etwas anfügst, wird es immer länger.

Wenn du deinen konkreten Anwendungsfall kurz erklären würdest, könnte man dir besser helfen. Denn momentan sieht es so aus, als würdest du an einem Problem arbeiten, welche mit Java viel eleganter gelöst werden könnte.
 
Werbung:
Hallo,

gut, ich versuche es deutlich zu erklären.

Es geht noch immer darum die Daten die ich von einer API erhalte in eine Datenbank zu speichern.
Da es jedoch beim auslesen Perfomanceprobleme seitens PHP & MySQL gibt da ich nach dem Prinzip WHERE %suchbegriff% arbeite muss ich den String der durch die Semikolons getrennt wird zuerst splitten und dann auf Spalten aufteilen.

Beispiel meiner DB Tabellen:
Tabelle = api_datas_EURUSD
Tabelle = api_datas_USDEUR

Davon existiert für jede Währung eine Tabelle.
Die Spalten sehen wie folgt aus:
id - shortname - timestep - other_string

Die ID ist AI.

Es ist so dass die API Realtime Kurse liefert daher enstehen da gleich Datensätze mit 10 Stellen täglich.
Nun will ich eben jedem Kurs der über die API überliefert wird in die passende Tabelle schreiben mit dem Indikator "shortname" in einer eigenen Spalte.
So gestaltet sich die Abfrage dann leichter und die Daten sind geordnet da jeder Kurs seine eigene Tabelle hat.

Ich merke grade,

Code:
String tablename = "api_datas";

müsste so lauten:

Code:
String tablename = "api_datas_"+shortname;

richtig?

So würden dann die Kurse in die eigene Tabelle gespeichert werden oder?
shortname ist in diesem Beispiel EURUSD.

Grüße und vielen Dank
 
Ich würde mit einem Objekt arbeiiten. Beispielsweise ein Objekt Kursdata.

Code:
public class Kursdata() {
private wert1; //getter + setter erstellen für jeden wert hier
private wert2;
private wert3;

Dann immer per new ein Objekt erzeugen und in eine List mit Kursdata Objekten füllen

also
Code:
List<Kursdata> kursdataList = new ArrayList<Kursdata>();
kursdata.add(/* erstelles Objekt */);

Dann kannst du beim Query erzeugen nur noch;

Code:
for(Kursdata kursdata : kursdataList) {
String query = INSERT INTO (asdf, asdf, asdf) VALUES (kursdata.getWert1+ ", "+kursdata.getWert2+", "+kursdata.getWert3+");";

Sonst als Tipps:
http://viralpatel.net/blogs/batch-insert-in-java-jdbc/

http://de.wikipedia.org/wiki/Java_Persistence_API

Code ist Pseudocode... also ungetestet und wird so bestimmt nicht kompilieren
 
Es geht noch immer darum die Daten die ich von einer API erhalte in eine Datenbank zu speichern.
Da es jedoch beim auslesen Perfomanceprobleme seitens PHP & MySQL gibt da ich nach dem Prinzip WHERE %suchbegriff% arbeite muss ich den String der durch die Semikolons getrennt wird zuerst splitten und dann auf Spalten aufteilen.???
 
Werbung:
Zurück
Oben