Clevemayer Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 (bearbeitet) Hallo Leute, entschuldigt ich bin ein armer Anfänger in Java, ehrlich gesagt habe ich kaum mit Java bisher gearbeitet, aber mein Cousin studiert und muss eine WaWi in Java programmieren, das ganze ist sehr einfach gestrickt. Ich hab mit dem Gedanken gespielt MySQL einzubinden, so kann er sich seine ganzen Objekte Sparen, weilw ir das ganze in Tabellen abbilden (Kunde, Artikelstammdaten, Rechnungs-Nr, Rechnungspositionen). Ich hänge jetzt fest bei den prepared Statements. Ich kann Datensätze aus der Datenbank auslesen, aber wie kann ich einen Datensatz per Insertbefehl in die Datenbank einfügen? Hier ein Beispiel, bei dem ich einen neuen Kunden einpflege. Primary ist die KundenNr in der Tabelle Kunde aus der Datenbank WaWi, connectet wird über JDBC. Es ist bestimmt ein dämlicher FEhelr den ich übersehe, aber ich komm einfach nicht weiter und finde den Fehler nicht. Hier habe ich den Code auskommentiert der mir Datensätze aus der Datenbank zurückgeben kann Anbei der Src-Code: public static void main(String [] args) throws Exception{ //// Kunde_anlegen anlegen = new Kunde_anlegen(); //// anlegen.anlegen(); ////// // } String vorname; String nachname; String Geschlecht; int Geburtsdatum; int Hausnummer; int PLZ; String strasse; // int Kundennr; String ort; Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/wawi", "?", "?"); PreparedStatement Neukunde = con.prepareStatement("insert into kunde(vorname, nachname, geschlecht, geburtsdatum, hausnummer, plz, strasse, ort) Values (?, ?, ?, ?, ?, ?, ?, ?"); vorname = Stdin.readlnString("Bitte geben Sie den Vornamen ein"); nachname = Stdin.readlnString("Bitte geben Sie den Nachnamen ein"); Geburtsdatum = Stdin.readInt("Bitte Geben Sie das Geburtsdatum ein nach dem Sie suchen wollen." + "Das Format ist YYYYMMDD: "); Geschlecht = Stdin.readlnString("Bitte geben Sie das Geschlecht ein" +"Das Format ist m oder w"); strasse = Stdin.readlnString("Bitte geben Sie die Strasse ein"); Hausnummer = Stdin.readInt("Bitte geben Sie die Hausnummer eub"); PLZ = Stdin.readInt("Bitte geben Sie die PLZ ein"); ort = Stdin.readlnString("Bitte geben Sie den Ort ein"); //PreparedStatement ausgabe = con.prepareStatement(" select * from Kunde where voname = " + vorname+" and nachname =" + nachname+"and Geschlecht ="+Geschlecht+ "and Geburtsdatum = "+Geburtsdatum); // ("insert into Kunde (vorname, nachname, geschlecht, geburtsdatum, Hausnummer, PLZ, strasse, ort) Values(" + vorname +", " + nachname+", "+Geschlecht+", "+ Geburtsdatum+", "+ Hausnummer +", "+ PLZ+ ", "+ strasse + ", " + ort +")"); Neukunde.setString( 1, vorname ); Neukunde.setString(2, nachname); Neukunde.setString(3, Geschlecht); Neukunde.setInt(4, Geburtsdatum); Neukunde.setInt(5, Hausnummer); Neukunde.setInt(6, PLZ); Neukunde.setString(7, strasse); Neukunde.setString(8, ort); Neukunde.executeQuery(); //ResultSet result = ausgabe.executeQuery(); //while (result.next()) { // System.out.println(result.getString(1) + " " + result.getString(2) + " " + result.getString(3)+ " " + result.getString(4)+ " " + result.getString(5)+ " " + result.getString(6)+ " " + result.getString(7)+ " " + result.getString(8)+ " " + result.getString(9)); } //} } Danke und MfG Bearbeitet 25. Januar 2010 von Clevemayer Zitieren
dr.dimitri Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 Hi, laut Javakonvention beginnen Variablennamen immer mit einem Kleinbuchstaben. Das solltest Du auch beherzigen. Zu deinem eigentlichen Problem: Den Insert hast Du ja schon und setzt auch die Bindvariablen richtig. Dann musst Du nur noch statt executeQuery (das wäre ein SELECT) ein execute abschicken. Warum baust Du dein SELECT zu kryptisch zusammen? select * from kunde where vorname=? and geschlecht=? and... Danach per setXxx die Binds setzen wie Du es schon beim Insert gemacht hast. Dim PS: Fehlerbehandlung und das Schließen von Ressourcen gehört in jedes Programm. Zitieren
Clevemayer Geschrieben 25. Januar 2010 Autor Geschrieben 25. Januar 2010 @dr. Dmitir Hi Danke erstmal für die Tips, aber ich bekomme immer noch diese Error-Meldung Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1051) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3563) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3495) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2693) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2102) at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1364) at Projektarbeit.Kunde_anlegen.main(Kunde_anlegen.java:88) Java Result: 1 vlt. sollte ich sagen Das ich hier die Kundennr nirgends deklariere, aber ich kann sie ja auch nicht deklarieren, da die Spalte Kundennummer die ID ist und mit auto_increment automatisch vergeben werden sollte, liegt da der Fehler? Das Prog ist ja noch in der Mache, also kommen Fehlerbehandlungen etc noch rein:) MfG Zitieren
dr.dimitri Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 aber ich kann sie ja auch nicht deklarieren, da die Spalte Kundennummer die ID ist und mit auto_increment automatisch vergeben werden sollte, liegt da der Fehler? Ich kenn mysql nicht besonders, aber die Fehlermeldung sagt eher, dass der Befehl an sich schon nicht geparst werden konnte. Heißen die Spaltennamen wirklich so? Beim SELECT hast z.B. eine Verschreiber bei vorname drinnen. Fehlerbehandlung sollte man nicht als nachrangige Aufgabe sehen, sondern als Einheit die gleichzeitig zur Programmentwicklung durchgeführt wird. Alles andere führt meistens nur zu wirr durch die Gegend geworfenen Exceptions, die mehr oder weniger sinnvoll ausgewertet werden. Dim Zitieren
lupo49 Geschrieben 26. Januar 2010 Geschrieben 26. Januar 2010 Lass dir das von Java zusammengebaute Statement einmal ausgeben und führe dieses dann via mysql-Konsole aus. Zitieren
dr.dimitri Geschrieben 26. Januar 2010 Geschrieben 26. Januar 2010 Lass dir das von Java zusammengebaute Statement einmal ausgeben und führe dieses dann via mysql-Konsole aus. Da wird nix zusammengebaut. Das INSERT steht fix und fertig wie es an die DB übergeben wird schon im Quellcode. Dim Zitieren
Dragon8 Geschrieben 26. Januar 2010 Geschrieben 26. Januar 2010 Wenn dein Quelltext noch immer so aussieht wie im 1. Post beschrieben, dann fehlt da auf jeden Fall schonmal eine schließende Klammer in deinem Insert Befehl bei den Values. Und bevor du die restlichen Befehle wieder reinsetzt, solltest du die auch nochmal kontrollieren. Wie dr.dimitri schon geschrieben hat, ist da auch noch mindestens ein fehler im Select Befehl. Zitieren
Clevemayer Geschrieben 26. Januar 2010 Autor Geschrieben 26. Januar 2010 Danke für die Hilfe Jungs, sauber. Ja ich wusste es kann nur ein Rechtschreibfehler sein, war die letzte Klammer, der Selectbefehl funktioniert an sich, das ist kein Problem, es ging nur um den Insert, bei dem Select weiss ich auch was falsch ist, da hab ich an der Syntax rum gespielt, weil ich den gerade erstellten Kunden ausgeben möchte, da die Kunden-Nr für den Anwender unsichtbar, automatisch generiert wird, er aber am ende den gesamten Datensatz sehen soll, der gerade erstellt worde, gibts dafür einen befehl? über diesen Select ist das ganze ja umständig und sicherlich nicht gerade performant. MfG Cleve Zitieren
Dragon8 Geschrieben 26. Januar 2010 Geschrieben 26. Januar 2010 In MySQL gibt es dafür datenbankseitig eine Möglichkeit, über "SELECT LAST_INSERT_ID();" lässt sich die letzte ID abfragen die automatisch erzeugt wurde. Nähere Information: MySQL :: MySQL 5.0 Reference Manual :: 20.1.7.1 Connector/ODBC General Functionality Zitieren
lupo49 Geschrieben 26. Januar 2010 Geschrieben 26. Januar 2010 Da wird nix zusammengebaut. Das INSERT steht fix und fertig wie es an die DB übergeben wird schon im Quellcode. Das kann ich auch sehen. Manchmal ist es aber so, dass an irgendwelchen Stellen bspw. Hochkommata zu viel sind. Zitieren
Clevemayer Geschrieben 1. Februar 2010 Autor Geschrieben 1. Februar 2010 Hallo Leute, danke für die Tipps, hat soweit alles funktionniert. Jetzt hat sich aber für mich einmal die Frage gestellt, wie kann ich entitys in java mit mysql umsetzen? Gibt es da eine möglichkeit?, ich habe mal im Netz gesucht und zu MySQL habe ich nur komplizierte Wege über das verändern der db-config-Datei gefunden. MfG P.S.: Das ist einfach eine Frage die mich interessiert, das Projekt mit der wawi ist soweit erledigt. Zitieren
Jobe2009 Geschrieben 1. Februar 2010 Geschrieben 1. Februar 2010 Nun da gibt es ein wunderbares Framework namens hibernate: http://hibernate.org Es kann Klassen (bzw deren Objekte) in relationale Datenbanken mappen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.