Java数据库编程 - 为什么这些值不相等?

时间:2013-11-12 15:45:27

标签: java mysql database equality

我正在研究一个需要非常基本的登录功能的学校项目(没什么太奇特的,看看密码将如何保留为纯文本)。我有一个测试数据库,并已经过彻底测试,所有正在引用和从数据库中提取的值也可以正确显示。您将在代码中看到,要比较的每个变量的类型都是String类型。我的问题是,为什么变量userOut和un不相等? (我甚至尝试在每个上单独使用.toString()方法,并且一起尝试让它们“相等”。)

    public static void main(String[] args) throws SQLException {

    try {

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/users", "root", "Hsiri0758");
        System.out.println("Database connected...");

        Statement stat = conn.createStatement();
        Statement pwstat = conn.createStatement();

        Scanner scan = new Scanner(System.in);
        System.out.println("Username: ");
        String un = scan.nextLine();
        System.out.println("Password: ");
        String pw = scan.nextLine();

        ResultSet unRset = stat.executeQuery("SELECT username FROM accounts WHERE username = \"" + un + "\";");
        unRset.next();
        String userOut = unRset.getString(1);

        ResultSet pwRset = pwstat.executeQuery("SELECT password FROM accounts WHERE password = \"" + pw + "\";");
        pwRset.next();
        String pwordOut = pwRset.getString(1);

        if (userOut == un) {
            System.out.println("Welcome " + un + "!");
        }
        else {
            System.out.println("Invalid username.");
        }

        conn.close();
        }
        catch (SQLException ex) {
        ex.printStackTrace();
        }

    }

7 个答案:

答案 0 :(得分:2)

替换此行if (userOut == un) {  到if (userOut.equals( un)) {

有关==.equals()

的详情,请参阅this

答案 1 :(得分:2)

除了像1之类的原语之外,你必须将值与java中的equals()方法进行比较。

因此,在您的代码中,这意味着:userOut.equals(un)

最后你会得到:

if (userOut.equals(un)) {
    System.out.println("Welcome " + un + "!");
}

如果有机会,您应该将已知的String与输入进行比较,因为您可以避免使用NullPointerException

一个常见问题:

public void someMethod(String someParameter) {
    if(someParameter.equals(MY_CONSTANT)) {
        // ...
    }
}

这应该重构为:

public void someMethod(String someParameter) {
    if(MY_CONSTANT.equals(someParameter)) {
        // ...
    }
}

答案 2 :(得分:0)

如果您要比较字符串,请尝试使用equals代替==

您还可以使用equalsIgnoreCase来避免case sensitive个问题

答案 3 :(得分:0)

要比较java中的对象,请使用.equals()方法而不是“==”运算符

替换以下代码

 if (userOut == un) 

 if (userOut.equals(un)) 

如果你想忽略下面的案例使用

 if (userOut.equalsIgnoreCase(un)) 

答案 4 :(得分:0)

在Java中使用==运算符时,您只需查看引用变量是否引用相同的字符串。因此,在您的情况下,这将始终评估为false。

要简单地比较字符串,请尝试userOut.equals(un)。这将检查字符串的实际内容以查看它们是否相等。如果是,它将返回true。

有关详细信息,请查看:
http://www.thejavageek.com/2013/07/27/string-comparison-with-equals-and-assignment-operator/

答案 5 :(得分:0)

==用于客户端脚本,如javascript或jquery。服务器端需要equals或equalsIgnoreCase。

答案 6 :(得分:0)

这是因为String是一个类,而不是数据类型。你实际上只是将两个类引用相互比较而不是实际的字符串。您必须使用类设计器提供的equal()来比较String的两个实例的内容:

userOut.equals(un)