Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe folgendes Problem und stehe gerade auf dem Schlauch:
Zur kurzen Übersicht ich programmiere derzeit ein Anmeldevorgang mit Datenbankbezug. Jetzt möchte ich wenn sich ein User anmeldet, mir alle Daten von dem User aus der DB ziehen und ein neues UserObjekt mit den Daten aus der DB anlegen. Mein Problem ist, wenn ich jetzt von einer anderen Klasse versuche auf die Daten von meinem eingeloggten User zuzugreifen funktioniert dies nicht. Wahrscheinlich ein dummer Fehler..
Programmausschnitte:
Klasse UserLogin
initKundenObject(rs.getInt("KundenNR"), rs.getInt("PLZ"), rs.getString("Straße"), rs.getString("Stadt"), rs.getString("Vorname"), rs.getString("Nachname"), rs.getString("Username")); /*Hier hole ich mir die Daten aus der DB*/
****
private void initKundenObject(int kundenNR, int plz, String straße, String stadt, String vorname, String nachname, String username) {
kunde = new kunde(kundenNR, plz, straße, stadt, vorname, nachname);
kunde.setUsername(username);
}
Der Grund warum dein Code nicht funktioniert ist folgender:
Du erstellst in deiner initKunde() Methode ein neues Kunden-Objekt und übergibst ihm die Daten. Damit hast du ein Objekt wo deine Daten korrekt drin stehen.
Nun erstellst du in der anderen Klasse ein neues Objekt [mit new kunde() ]. Damit sind aber auch die Daten neu d.h. es enthält nicht die Daten aus deinem ersten Kunden-Objekt.
Beispiel:
Java:
Kunde paul = new Kunde();
paul.setName("Paul");
Kunde marie = new Kunde();
marie.setName("Marie");
Selbes Beispiel wie bei dir. Du erstellst 2 Objekte - diese haben aber nicht den selben Inhalt
Gibt jetzt mehrere Möglichkeiten dein Objekt in deine KundenKontoinformation zu übergeben.
Mögliche Wegen wären über Getter / Setter, Methode in der UserLogin Klasse (deine init - Methode) die das User-Objekt zurückgibt, ..
Nein das wird dir eine NullPointerException (NPE) liefern, da du versuchst eine Methode auf eine Null-Referenz aufzurufen
Ich kenne - wie bereits gesagt - deine Projekt - und Klassenstruktur nicht aber eine Möglichkeit wäre es die Methode initUser() (die sicherlich in einer DB-Verwaltungsklasse liegt ?? ) public zu machen und als Return-Typ eine User-Instanz festzulegen. In deiner KundenKontoinformation Klasse kannst du dann eine Instanz deiner DB Klasse erstellen und dein User mittels Kunde kunde = db.initUser(...) initialisieren.
Minimalbeispiel:
Java:
public class Database
{
public Database() {}
public Kunde getKundeByName(String name)
{
// ... Daten des Kunden mit dem übergebenen namen holen
alter = rs.get(..);
strasse = rs.get(..);
return new Kunde(name, alter, strasse);
}
}
public class KundenKontoInformation
{
private Kunde kunde;
private Database db;
public KundenKontoInformation()
{
this.db = new Database();
this.kunde = db.getKundeByName("Paul");
String username = kunde.getUsername();
}
}
PS: Solltest du es nicht hinbekommen dann schreib mal bitte deine Projektstruktur auf damit hier Lich ins dunkle kommt
So wie du es gerade probiert hast ist grundsätzlich schon richtig. Das Problem ist aber dass du den Usernamen abfragen willst bevor du den Kunden setzt!
Warum? Weil deine Methode fillComboBox vom Konstruktor der Klasse KundenKontoInformation aufgerufen wird.
In deiner Klasse UserLogin instanzierst du ein KundenKontoInformation Objekt (somit wird "fillComboBox" aufgerufen bevor du einen Kunden setzt).
Mögliche Lösung: Du setzt den Kunden über den Konstruktor der Klasse KundenKontoInformation, dann darfst du diese Klasse aber erst instanzieren wenn du sie brauchst und einen entsprechenden Kunden übergeben kannst.
bekomme aber folgende Fehlermeldung: Cannot make a static reference to the non-static field kunde.
Muss ich jetzt einfach nur mein
Java:
private kunde kunde; -> private static kunde kunde;
ändern?
Ich habe mir bestimmt schon hundertmal durchgelesen was static macht, aber nie richtig verstanden. Beeinflusst das mein kunden Objekt irgendwie?
Wozu brauchst du diese main Methode? Um ein die Klasse "KundenKontoInformation" zu testen?
Wenn es nur zum testen der Klasse ist dann erstellt lokal in der main-Methode eine Dummy Kunden Objekt mit von dir gewählten Werten.
Nein das Attribut statisch zu machen ist falsch. So würde jede Instanz der Klasse "KundenKontoInformation" auf das selbe Kundenobjekt zugreifen.
Jetzt habe ich noch eine Frage: Ich habe noch weitere Klassen (KundenMenue und KundenUeberweisung), wo ich ein Objekt der Klasse Kundenkontoinformation anlege. Habe diese wie folgt inizialisiert:
Java:
private kunde kunde = new kunde();
private KundenKontoinformation kontoinformation = new KundenKontoinformation(kunde);
Ist das so richtig? Habe mein Programm getestet und es scheint den Usernamen jetzt richtig zu übernehmen. Bin mir nur nicht ganz sicher, weil ich einen neuen Error bekomme, der in meinen Augen aber durch was anderes ausgelöst wird (leider weiß ich nicht wirklich wodurch).
Hier mal mein neuer Error:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''Sparkonto'' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2313)
at ui.Kunde.KundenKontoinformation$1.actionPerformed(KundenKontoinformation.java:124)
at javax.swing.JComboBox.fireActionEvent(Unknown Source)
at javax.swing.JComboBox.contentsChanged(Unknown Source)
at javax.swing.AbstractListModel.fireContentsChanged(Unknown Source)
at javax.swing.DefaultComboBoxModel.setSelectedItem(Unknown Source)
at javax.swing.DefaultComboBoxModel.addElement(Unknown Source)
at javax.swing.JComboBox.addItem(Unknown Source)
at ui.Kunde.KundenKontoinformation.fillComboBox(KundenKontoinformation.java:81)
at ui.Kunde.KundenKontoinformation.<init>(KundenKontoinformation.java:206)
at ui.UserLogin$2.actionPerformed(UserLogin.java:162)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Der Fehler müsste sich auf meine Klasse Kundenkontoinformation beziehen. Laut der Beschreibung muss ja ein Fehler bei der Syntax von Sparkonto sein. Jedoch kann ich da nichts falsches erkennen...
Dein Fehler scheint hier drin zu sein In der actionPerformed):
Code:
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2313)
at ui.Kunde.KundenKontoinformation$1.actionPerformed(KundenKontoinformation.java:124)
und zwar in dem sql-Statement das da aufgebaut wird. Und in dem sql-Statement kommt wohl ein Tabellennamen oder Spaltennamen "Sparkonto" vor.
Vielleicht bin ich nur blind und einer von euch sieht den Fehler auf anhieb. Ich habe auch noch einmal überprüft ob ich Sparkonto richtig geschrieben habe. Das habe ich. In meiner DB ist Sparkonto auch genauso geschrieben und wenn ich den SQL Befehl (select * from Sparkonto) ausführe wird mir auch alles ganz normal ausgegeben.
Wo hast du denn die Info her, dass du den Platzhalter auf diese Weise verwenden darfst? Du benutzt PreparedStatement hier schlicht falsch...
Salopp: Die Parameter sind nur für Spalten-Werte, nicht für Tabellennamen oder sonst was.
Ich glaube Claus braucht noch einen Kaffee Aber hast du dir das mal angeschaut was da genau von deiner Combo-Box zurückkommt ? Sind da aus versehen noch andere Zeichen drin als nur "Sparkonto"?
Codiere das Statement doch mal hart als select * from Sparkonto und guck ob es dann geht
if (ausgewaehlteskonto.equals("Sparkonto"))........
}else{
JOptionPane.showMessageDialog(null, "Bitte ein Konto auswählen");
}
Klar war das etwas provokant aber laut der If Abfrage kann ausgewaehlteskonto wohl auch vollkommen undefinierte Werte annehmen. Was dann zu jedem beliebigen Query führen klann.
Wo hast du denn die Info her, dass du den Platzhalter auf diese Weise verwenden darfst? Du benutzt PreparedStatement hier schlicht falsch...
Salopp: Die Parameter sind nur für Spalten-Werte, nicht für Tabellennamen oder sonst was.
Ist das echt so? Habe das noch nie ausprobiert aber macht doch eigentlich keinen Sinn da preparedStatement doch im Prinzip nur ein paar StringReplaces machen sollte oder nicht?
Nein, Prepared Statement sind viel mehr als das. Es werden Statements (samt eventueller Platzhalter) an das DBMS übergeben, dort vorab optimiert usw. Im Grunde alles, was mit normalen Querys auch geschieht, nur werden sie nicht ausgeführt. Die Statements liegen anschließend vorübersetzt im DBMS vor und müssen dort nur noch mit Werten gefüllt und ausgeführt werden. Übersichtlicherer Code beim Client und das Vermeiden von SQL Injections sind eigentlich nicht mehr als ein angenehmer Nebeneffekt.
Du hast ein Verhalten, dass du nicht erklären kannst und weißt vom Weg von der Datenhaltung her hin zur Darstellung nicht, wo du nach dem Fehler suchen sollst. Was sagt dir das über die Struktur deines Codes?