Ich kam vor kurzem nach einer beträchtlichen Zeit mit Python zu Java zurück und versuche, mich wieder damit vertraut zu machen. Mein erstes gewünschtes Projekt bestand darin, eine kleine Anwendung zu erstellen, bei der man sich (zuerst) einloggen kann. Ich benutze mySQL, um die Datenbank von Benutzernamen und Passwörtern zu halten.Wie extrahiere ich eine Variable aus anderen Klassen oder Methoden?
Bisher habe ich Java's Swing-GUI verwendet, um eine Popup-Box zu erstellen, die nach Anmeldeinformationen fragt. Der eingegebene Benutzername und das Passwort werden mit denen in der SQL-Tabelle verglichen.
Das Problem ist, dass ich eine while-Schleife verwende, um die Eingaben gegen die SQL-Tabelle zu testen. Daher wird die eingegebene Information mit jedem Schlüssel und Wert in einer Hashmap verglichen, die aus der SQL-Tabelle erstellt wurde.
Ich bin nicht sicher, wie ich meine Variable g (die Hashmap) aus der while-Schleife und der try-Anweisung von SQL "extrahiere", damit ich sie benutzen kann, nachdem sie mit den Daten von mySQL gefüllt wurde.
Ich benutze Eclipse (Java Neon).
Ich habe keine Ahnung, wie die hashmap "extrahieren", und wenn ich versuche, die while-Schleife oder try Anweisung die hashmap zurückgeben, informiert mich Eclipse, dass void-Methoden keinen Wert (deutlich) zurückgeben können. Allerdings kann ich den Rückgabetyp nicht von void zu HashMap ändern) String, String>, weil "Der Rückgabetyp ist nicht kompatibel mit ActionListener.actionPerformed (ActionEvent e)" und "implementiert java.awt.event.ActionListener.actionPerformed".
Hier ist mein Code:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
public class Hello0 extends JFrame {
private static final long serialVersionUID = 1487932324102279819L;
public static void main(String[] args) {
JFrame frame = new JFrame("Frame Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 200);
JPanel panel = new JPanel();
frame.add(panel);
placeComponents(panel);
frame.setVisible(true);
}
private static void placeComponents(JPanel panel) {
panel.setLayout(null);
JLabel userLabel = new JLabel("Username");
userLabel.setBounds(10, 20, 80, 25);
panel.add(userLabel);
JTextField userText = new JTextField(20);
userText.setBounds(100, 20, 165, 25);
panel.add(userText);
JLabel passwordLabel = new JLabel("Password");
passwordLabel.setBounds(10, 50, 80, 25);
panel.add(passwordLabel);
JPasswordField passwordText = new JPasswordField(20);
passwordText.setBounds(100, 50, 165, 25);
panel.add(passwordText);
JButton loginB = new JButton("Login");
loginB.setBounds(10, 80, 80, 25);
panel.add(loginB);
loginB.addActionListener(new ActionListener() {
public HashMap<String, String> actionPerformed(ActionEvent e) {
String username0 = "root";
String password = "javaSQLmy98";
try {
String url = "jdbc:mysql://localhost:3306/javabase?useSSL=false";
Connection connection = DriverManager.getConnection(url, username0, password);
PreparedStatement stmt0 = connection.prepareStatement("SELECT * from userids");
String pass0 = null;
String user1 = userText.getText().toString();
char[] pass1 = passwordText.getPassword();
pass0 = String.valueOf(pass1);
System.out.println(user1);
System.out.println(pass1);
ResultSet rs = stmt0.executeQuery();
rs = stmt0.executeQuery("SELECT * from userids ");
while (rs.next()) {
String user = rs.getString("username");
String pass = rs.getString("paswrd");
Map<String, String> g = new HashMap<>();
g.put(user, pass);
return g;
// This was the alternative: if(g.keySet().contains("Jacob") && g.values().contains("root")) {
/*This code below was originally outside the while loop but I could not
figure out how to make it work without it being inside, and accessible
to the hashmap g. Now it is being checked each time the while loop
is ran, with a new pair of usernames and passwords on each loop. */
if (user1.equals(user) && pass0.equals(pass)) {
System.out.println("Good!");
}
/*The problem here is that the checker IS inside the loop, so it
tests the input against each of the entries in the SQL table. */
else {
System.err.println("The username or password is incorrect.");
}
}
connection.close();
} catch (Exception e1) {
System.err.println(e1.getMessage());
}
}
});
}
}
Prost!
Warum laden Sie alles in eine HashMap, anstatt nur eine WHERE-Klausel in Ihre SQL-Abfrage aufzunehmen? –
Verstehen Sie, wie Sie eine Abfrage in SQL schreiben, um die einzelne Zeile für die Benutzer-ID abzurufen, anstatt alle Zeilen in der Tabelle zu durchlaufen? –
@RiaanNel Ich bin mir nicht sicher, wie das helfen würde. Funktioniert das WHERE-Schlüsselwort nicht nur als Filter? –