我如何"提取"来自其他类或方法的变量?

时间:2016-12-23 05:22:21

标签: java mysql methods hashmap inner-classes

我在使用Python的大量时间后最近回到了Java,并且我试图再次对它感到满意。我的第一个想要的项目是创建一个小应用程序,你可以(首先)登录。我使用mySQL来保存用户名和密码的数据库。

到目前为止,我已经使用Java的swing GUI来制作一个弹出框,询问登录信息。输入的用户名和密码将根据SQL表中的用户名和密码进行测试。

问题是我使用while循环来测试SQL表的输入。因此,根据从SQL表创建的Hashmap中的每个键和值来检查输入的信息。

我不知道如何提取"来自while循环的变量g(Hashmap)和SQL的try语句,以便在填充mySQL中的数据后可以使用它。

我正在使用Eclipse(Java Neon)。

我不知道如何提取""提取" hashmap,当我尝试让while循环或try语句返回hashmap时,Eclipse告诉我void方法不能返回一个值(显然)。但是,我无法将返回类型从void更改为HashMap)String,String>因为"返回类型与ActionListener.actionPerformed(ActionEvent e)"不兼容。和"实现java.awt.event.ActionListener.actionPerformed"。

这是我的代码:

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());
                }

            }
        });

    }

}

干杯!

3 个答案:

答案 0 :(得分:1)

要在g之外访问while,您需要在while之外声明它,因为Java范围内的每个{}变量都在其中。因此,

Map<String, String> g = new HashMap<>();
while (condition) {
    // do something
    g.put(key, value);
}
// do something with g

但在这种情况下,您可以直接在SQL中进行检查,这应该更加有效。

旁注:

不要存储密码。 Don't store passwords. Hash+Salt passwords (or better, use a library).

答案 1 :(得分:0)

试试这个:

Map<String, String> g = new HashMap<String, String>();
while(rs.next()) {
    String user = rs.getString("username");
    String pass = rs.getString("paswrd");
    g.put(user, pass);

    .....
}

注意:在HasmMap中将用户名作为键是一个不错的编程,因为可能有多个用户同名。

答案 2 :(得分:0)

如果向查询添加WHERE子句,它将仅返回与条件匹配的数据。换句话说,下面的查询(显然具有正确的值)将返回指定的用户条目(如果存在),否则将返回空结果集。

SELECT * from userids
WHERE userName = 'user1'
AND passwrd = 'pass1'

然后您可以取消整个while循环和HashMap,代码可以简化如下:

if (rs.next()) {
    System.out.println("Good!");
} else {
    System.err.println("The username or password is incorrect.");
}

此外,如前所述,如果这不仅仅是编程练习,则应对密码进行哈希处理,而不是以纯文本格式存储。